Java中的非常大的Fibonacci

时间:2015-04-10 00:59:38

标签: java performance optimization biginteger fibonacci

我正在尝试快速计算大型斐波纳契数。这是我的代码。对于超过100万的数字来说,这是非常缓慢的,它怎么能改善?

public static BigInteger fib(BigInteger n) {

        int k = n.intValue();
        BigInteger ans = null;

        if(k == 0) { 
            ans = new BigInteger("0");
        } else if(Math.abs(k) <= 2) {
            ans = new BigInteger("1");
        } else {
            BigInteger km1 = new BigInteger("1");
            BigInteger km2 = new BigInteger("1");

            for(int i = 3; i <= Math.abs(k); ++i) {
                ans = km1.add(km2);
                km2 = km1;
                km1 = ans;
            }
        }

       if(k<0 && k%2==0) { ans = ans.negate(); }
       return ans;
    } 

Binet运作良好。多谢你们!

1 个答案:

答案 0 :(得分:2)

一种方法是计算2x2矩阵的(N-1)th幂:

A = ((1, 1), (1, 0))

然后我们

Fib(n) = A^(n-1)[0][0], for n >= 1

使用Exponentiation by squaring

可以有效地计算矩阵A的功效