找到非常大的N的Fibonacci的第N项

时间:2013-02-05 09:51:49

标签: java fibonacci largenumber

我已经使用了迭代方法以及递归方法,但在这两种情况下我都没有得到更快的结果(10 ^ 6),即。 O(logN)复杂度。

迭代方法:

static BigInteger fibo(long n){
    BigInteger a=new BigInteger("1");
    BigInteger b=new BigInteger("2");
    BigInteger c=new BigInteger("0");
    for(long i=3;i<=n;i++){
        c=a.add(b);
        a=b;
        b=c;
    }
    return c;
}

2 个答案:

答案 0 :(得分:1)

封闭表单仅计算n值:

closed form fibonacci formula

您可以在Wolfram MathWorldWikipedia上详细了解该主题(包括此公式)。

不幸的是,你不能在这里使用BigInteger,但我认为你应该能够用BigDecimal来做到这一点(尽管我还没有测试过。)

答案 1 :(得分:0)

如果你想找出大于n的 fib(n)的值,你需要使用矩阵指数法,即用于求解线性递归的方法方程。

矩阵求幂的最大优点是它的运行时间简单为O(k ^ 3 * logN),其中N是我们计算的矩阵的幂,k是矩阵的大小。

检查下面提到的python代码片段,它为大n计算fibonacci(mod为10 ^ 9 + 7,在int范围内有数字)。你可以找到相同的详细解释在this博客中。

matrix_mult 函数将作为参数给出的两个矩阵相乘并返回它们的乘积。

def matrix_mult(A, B):
    C = [[0, 0], [0, 0]]
    for i in range(2):
        for j in range(2):
            for k in range(2):
                C[i][k] = (C[i][k] + (A[i][j]*B[j [k])%mod)%mod
return C 

fast_expo 函数计算并返回(矩阵^幂),这是负责O(logn)运行时间的函数。

def fast_expo(matrix, power):
    if(power==1):
        return matrix
    else:
        if(power%2==0):
            matrix1 = fast_expo(matrix, power/2)
            return matrix_mult(matrix1, matrix1)
        else:
            return matrix_mult(matrix, fast_expo(matrix, power-1))

使用预先计算的矩阵作为参数之一调用该函数。在斐波那契的情况下,矩阵是[[1,1],[1,0]]。

matrix = [[1, 1], [1, 0]]
matrix_n = fast_exponentiation(matrix, number-2)
print (matrix_n[0][0] + matrix_n[0][1]) % 1000000007

对于所有n> 2,这里的幂应该是M ^(n-2),其中M是基本矩阵,因为你已经有f(n)的前2个值,即f(1)和f(2) 。