一、快速幂
引言
代码:
def power(base,exponent):
res = 1
while exponent:
#如果该位为1,那么乘以base
if exponent & 1:
res *= base
base *= base
#右移
exponent = exponent >> 1
return res
二、矩阵快速幂
矩阵快速幂就是把快速幂里面的res和base换成矩阵即可。
三、例题
1.斐波那契数列求Fn
2.题解:
如果用递归去求斐波那契数列,会超时,这里采用转换为矩阵,求矩阵快速幂。
3.代码
只能算到1000000,其他的时间超时。
#矩阵的乘积
def mul(matrix_a,matrix_b):
#对于a*b和b*c的矩阵,得到的规模是a*c
matrix_result=[[0 for _ in range(len(matrix_b[0]))] for _ in range(len(matrix_a))]
for i in range(len(matrix_a)):
for j in range(len(matrix_b[0])):
#这里len(matrix_b)也可以换成len(matrix_a[0])
for k in range(len(matrix_b)):
matrix_result[i][j]+=matrix_a[i][k]*matrix_b[k][j]
return matrix_result
def fib(n):
if n==0:
return 0
elif n==1 or n==2:
return 1
base = [[1,1],[1,0]]
n = n-2
ans = [[1,0],[0,1]]
while n:
if n&1:
ans = mul(base,ans)
base = mul(base,base)
n = n>>1
return ans[0][0] + ans[0][1]