Algorithm FastPow(a,n):Input. Base a and exponent n.Output. Power an.Method.123456789result←Idwhile n>0 doif nmod2=1 thenresult←result⋅aend ifa←a⋅an←n/2end whilereturn result
利用这一方法计算快速幂,需要进行 Θ(logn) 次乘法运算。
递归版本
这一过程同样可以通过递归形式实现。注意到,指数 n 的二进制展开可以递归地写作
(ntnt−1⋯n1n0)2=2×(ntnt−1⋯n1)2+n0.
因此,幂次 an 可以递归地计算为
an=⎩⎨⎧1,(a⌊n/2⌋)2,(a⌊n/2⌋)2⋅a,n=0,n>0 and n is even,n>0 and n is odd.
这就是快速幂的递归版本实现。
伪代码如下:
Algorithm FastPow(a,n):Input. Base a and exponent n.Output. Power an.Method.123456789if n=0 thenreturn Idend ifresult←FastPow(a,n/2)if nmod2=0 thenreturn result⋅result⋅aelsereturn result⋅resultend if
long long binpow(long long a, long long b, long long p) { if (b == 0) return 1; long long res = binpow(a, b / 2, p); if (b % 2) return res * res % p * a % p; else return res * res % p;}
Python
def binpow(a, b, p): if b == 0: return 1 res = binpow(a, b // 2, p) if (b % 2) == 1: return res * res * a % p else: return res * res % p
long long binpow(long long a, long long b, long long p) { long long res = 1; while (b > 0) { if (b & 1) res = res * a % p; a = a * a % p; b >>= 1; } return res;}
Python
def binpow(a, b, p): res = 1 while b > 0: if b & 1: res = res * a % p a = a * a % p b >>= 1 return res
[!warning] 注意
模数通常情况下大于 1。在十分特殊的情况下,模数 p 可能等于 1,此时需要特殊考虑 b=0 的情况。