Exponentiation by squaring

Exponentiation by squaring

第一次接触快速幂是解决一道n阶复数群的加密问题时,有个mul函数一直无法理解,学长说这就是曲线上的快速幂算法,作用呢就是加快幂运算的速度,在直接计算xa的情况下我们进行a-1次乘法操作,而利用快速幂算法只需log2a,复杂度由原来的O(n)降到了O(log(n)),可以说是质的飞跃了

算法流程

计算xa

进行如下操作

定义:次数time=a,temp=x,结果ans=1

判断time奇偶性

若2|time->temp=temp2,time=time/2;

若2\(\nmid\)time->aes=aes×temp,time=time-1

重复上述操作直到time=0

正确性证明

设f(x,a)为计算x的a次方

当2|a时f(x,a)=f(x2,\(\frac{a}{2}\))

当2\(\nmid\)a时f(x,a)=x×f(x,a-1)

用递归的想法考虑单个过程很容易理解

ps:快速模幂算法类似,在每次ans进行操作时加上模运算即可

快速幂算法不仅可以用于数域上,在矩阵和多项式上都能够适用,并且快速幂算法传递的是一种分治的策略,即通过不断将原问题化小,最后将解合并

代码实现

def qpow(x,a):
    temp=x
    time=a
    ans=1
    while time:
        if time%2==0:
            temp=temp**2
            time=time//2
        else:
            ans*=temp
            time=time-1
    return ans
posted @ 2022-03-23 22:44  hash_hash  阅读(64)  评论(0)    收藏  举报