倍增算法最经典的应用就是快速幂,快速幂算法是一种高效盘算大整数幂的方法。如下快速幂盘算 a b a^{b} ab
当 b b b为偶数时
a b = a b 2 ∗ a b 2 = ( a 2 ) b 2 a^{b} = a^{\frac{b}{2}}* a^{\frac{b}{2}}=(a^{2})^{\frac{b}{2}} ab=a2b∗a2b=(a2)2b
**当 b b b为奇数时
a b = a ∗ a b 2 ∗ a b 2 = a ∗ ( a 2 ) b 2 a^{b} = a*a^{\frac{b}{2}}* a^{\frac{b}{2}}=a*(a^{2})^{\frac{b}{2}} ab=a∗a2b∗a2b=a∗(a2)2b
** b 2 \frac{b}{2} 2b向下取整,迭代求解,直到 b b b为0为止
public static long qmi(long a, long b, long p) {
long res = 1; // 初始化结果为 1
while (b > 0) { // 当指数 b 大于 0 时执行循环
if (b & 1 == 1) { // 判断指数 b 的最低位是否为 1
res = res * a % p; // 如果最低位为 1,则将底数 a 的当前幂乘到结果中,并取模 p
}
a = a * a % p; // 底数 a 自乘,相当于计算 a^2, a^4, a^8, ...
b >>= 1; // 将指数 b 右移一位,相当于将指数减半
}
return res; // 返回结果
}
复制代码
例如盘算 2 13 2^{13} 213
r e s = 2 , a = 2 2 , b = 6 res=2,a=2^{2},b=6 res=2,a=22,b=6
r e s = 2 , a = 2 4 , b = 3 res=2,a=2^{4},b=3 res=2,a=24,b=3
r e s = 2 5 , a = 2 8 , b = 1 res=2^{5},a=2^{8},b=1 res=25,a=28,b=1
r e s = 2 13 , a = 2 16 , b = 0 res=2^{13},a=2^{16},b=0 res=213,a=216,b=0