如果您想找出大 n 的fib(n)的值,您需要使用矩阵求幂法,即用于求解线性递推方程的方法。
矩阵求幂的最大优势在于其运行时间只需 O(k^3 * logN),其中 N 是我们正在计算的矩阵的幂,k 是矩阵的大小。
检查下面提到的计算大 n 的斐波那契的 python 代码片段(具有 10^9+7 的模型,使数字在 int 范围内)。您可以在此博客中找到相同的详细说明。
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函数计算并返回 (matrix^power),这是负责 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)。