Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
时间: 2024-03-26 20:40:57 浏览: 165
【Fibonacci】递推法
这是一个经典的斐波那契数列取模问题,可以使用矩阵快速幂算法来解决。首先,我们可以使用矩阵表示斐波那契数列的递推式:
```
| Fn | | 1 1 | | Fn-1 |
| | = | | * | |
| Fn-1 | | 1 0 | | Fn-2 |
```
然后,我们可以使用矩阵快速幂算法,将矩阵乘法的速度优化到O(log n)。具体来说,对于一个矩阵A和一个整数k,我们可以用以下递归式计算A的k次幂:
```
if k == 1:
return A
if k % 2 == 0:
B = pow(A, k/2)
return B * B
else:
B = pow(A, (k-1)/2)
return B * B * A
```
最后,我们用取模运算优化一下,最终的代码如下:
```
def fib_mod(n):
if n <= 2:
return 1
A = [[1, 1], [1, 0]]
B = pow_mod(A, n-2, 10007)
return (B[0][0] + B[0][1]) % 10007
def pow_mod(A, k, p):
if k == 1:
return A
if k % 2 == 0:
B = pow_mod(A, k/2, p)
return mat_mul_mod(B, B, p)
else:
B = pow_mod(A, (k-1)/2, p)
return mat_mul_mod(mat_mul_mod(B, B, p), A, p)
def mat_mul_mod(A, B, p):
C = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(2):
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % p
return C
```
这个函数使用了三个辅助函数:pow_mod函数用来计算矩阵的k次幂,mat_mul_mod函数用来计算两个矩阵的乘积,以及fib_mod函数用来计算斐波那契数列的第n项除以10007的余数。
阅读全文