用于自己复习的快速幂算法
快速幂简介
-
一般所用快速幂有求数字a的b次方,还有矩阵快速幂:a矩阵的b次方。
-
原理简介:假设我们要求8的10次方,如果正常采用O(n)算法,每次循环乘以8。我们总共需要10次运算。
但是,一个数的幂次可以写成加法的形式。 a k = a^k = ak= a b + c b+c b+c= a b ∗ a c a^b*a^c ab∗ac,当k=b+c时。
我们把10用二进制表示为1010。810 = 88 ∗ * ∗ 82.观察其幂次分别为 8 = 2 3 8 = 2^3 8=23,也就是1000; 2 = 2 1 2 = 2^1 2=21,也就是10。我们发现二进制表示的数和幂次对应了起来。后续配合代码一起分析。
代码
def(a,b):
base = 1
while b:
if b&1:
base*=a
a*=a
b>>=1
return base
本段采用py代码,当使用C++时,需要注意数字大小限制,选择合适的类型。还有本模板未考虑需要对某数取余,但两者代码差别不大,根据需要加上取余就可。
我们从代码中可以看出,每次b右移位时,a采用a*a的方式自增。我们考虑其指数变化,其实就是指数每次乘以2。与b二进制变化是对应的,每次右移一位,末位的对应的数乘以2。
当b&1为True时,代表这个二进制位为1,就将此位对应的数 a k a^k ak与base相乘。最终计算次数仅需要4次,便可以计算出810结果,大大减少了计算次数,O(log n)。