原理
例子
计算。
可以看到,原本需要12次乘法的计算,现在只需要5次乘法了。
分析
将的上标全写为二进制
可以看到,完全展开之后,的上标组成的二进制串正是
的二进制串。真正进行计算时,
可以省略。因此,用快速幂算法计算
时,需要进行
次平方运算和
次乘法运算,其中
是
的二进制位数,
是
的二进制中的
的个数。平方运算其实就是乘法运算,因此,需要进行的乘法运算次数总计为
,介于
倍
之间。因此,快速幂算法的时间复杂度为
实现
def exp1(x, n):
if n == 0:
return 1
if n == 1:
return x
y = exp1(x, n>>1) ** 2
if n & 0x1:
y *= x
return y
测试
快速幂算法还可以像下面这样表述,时间复杂度与上面的一致。不过测试表明,比上面的要慢。
def exp2(x, n):
if n == 0:
return 1
if n == 1:
return x
y = exp2(x*x, n>>1)
if n & 0x1:
y *= x
return y

可以看到,尽管大数乘法并非,快速幂算法依然要比普通算法快得多。
网友评论