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

浙公网安备 33010602011771号