我在SBCL中实现了矩阵乘法方法(来自sicp,http: //sicp.org.ua/sicp/Exercise1-19 ),但大约需要30秒才能完成。我使用GMP将其移植到C,它在我的机器上约1.36秒内返回了正确的结果。它的速度与bootyby的回答一样快。
#include <gmp.h>
#include <stdio.h>
int main()
{
int n = 20000000;
mpz_t a, b, p, q, psq, qsq, twopq, bq, aq, ap, bp;
int count = n;
mpz_init_set_si(a, 1);
mpz_init_set_si(b, 0);
mpz_init_set_si(p, 0);
mpz_init_set_si(q, 1);
mpz_init(psq);
mpz_init(qsq);
mpz_init(twopq);
mpz_init(bq);
mpz_init(aq);
mpz_init(ap);
mpz_init(bp);
while(count > 0)
{
if ((count % 2) == 0)
{
mpz_mul(psq, p, p);
mpz_mul(qsq, q, q);
mpz_mul(twopq, p, q);
mpz_mul_si(twopq, twopq, 2);
mpz_add(p, psq, qsq); // p -> (p * p) + (q * q)
mpz_add(q, twopq, qsq); // q -> (2 * p * q) + (q * q)
count/=2;
}
else
{
mpz_mul(bq, b, q);
mpz_mul(aq, a, q);
mpz_mul(ap, a, p);
mpz_mul(bp, b, p);
mpz_add(a, bq, aq); // a -> (b * q) + (a * q)
mpz_add(a, a, ap); // + (a * p)
mpz_add(b, bp, aq); // b -> (b * p) + (a * q)
count--;
}
}
gmp_printf("%Zd\n", b);
return 0;
}
phi = (1+sqrt(5))/2