数论之快速幂


一、快速幂

引言

在这里插入图片描述
在这里插入图片描述

代码:

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

蓝桥杯Fibonacci 第 n 项
在这里插入图片描述

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值