我是靠谱客的博主 合适洋葱,最近开发中收集的这篇文章主要介绍快速幂详解及其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

最后

以上就是合适洋葱为你收集整理的快速幂详解及其Python实现的全部内容,希望文章能够帮你解决快速幂详解及其Python实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(26)

评论列表共有 0 条评论

立即
投稿
返回
顶部