快速幂详解及其Python实现

快速幂

传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^ 13 = 2* 2 * 2……*2,连乘十三次。但是我们可以通过增加底数,减少指数的做法,降低时间复杂度。从而能够实现复杂度为o(logn)的幂运算。还是以2^13为例,13的二进制为1101,因此2的13次方可以分解成以下形式:
在这里插入图片描述
和13的二进制1101相对比,只要二进制为1的位,就有权重,权重为2^(i-1),i表示第几位,1101从右到左,依次为第1位,第2位,第3位,第4位。

下面的工作就是如何确定二进制中的哪一位为1,这里可以利用位运算中的&和>>运算。

由于1的二进制除了第一位是1,其他的全是0,因此可以利用n&1是否为0来判断n的二进制的当前最低位是否为1,如果n&1等于0,说明当前n的最低位不为1。

利用右移运算>>来逐位读取,然后每次判断是否为1。

Python实现
应用一:求base的exponent次方
# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        flag=1
        re=1
        tmp=base
        if exponent==0:   #等于0的情况
            return 1
        if exponent<0:   #小于0的时候,设置一个flag,用于返回的时候做判断
            flag=0
            exponent=abs(exponent)
 
        while exponent>0:    #大于0的情况
            if exponent&1==1:
                re=re*tmp     #判断当前位是否为1,如果是的话,把之前的幂乘到结果中
            exponent=exponent>>1      #右移动一位就是除以2
            tmp=tmp*tmp       #2^6=(2*2)^3
        return re if flag else 1/re
应用二:快速幂取模

在算幂的模的时候,比如2^ 64 mod(10086),不必要算64次乘法,只需要首先算2^2 mod 10086,再算2 ^ 4在算2 ^8

一般情况下,即将指数进行二进制分解,如果二进制不为0的位,则进行乘法运算,具体的算法如下

def fastExpMod(b, e, m):
    result = 1
    while e != 0:
        if (e&1) == 1:
            # ei = 1, then mul
            result = (result * b) % m
        e >>= 1
        # b, b^2, b^4, b^8, ... , b^(2^n)
        b = (b*b) % m
    return result
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值