快速幂
原理:通过将 ab 中的b次幂转化为二进制,将取幂的任务按照指数的 二进制表示 来分割成更小的任务,底数不断递增以达到速算a的b次幂目的。
首先我们将 b 表示为 2 进制,举一个例子:
313 =311012 = 323·322·320 = 38· 34· 31
可以发现按二进制完全展开后的幂序列中(除第一个)任意一个元素就是其前一个元素的平方。
31=3
32=(31)2=9
34=(32)2=81
…………
因此为了计算313 ,我们只需要将对应二进制位为 1 的整系数幂乘起来就行了:
313 = 38 ·34 ·31
而每个二进制位上的整系数幂都可以由前一个元素平方而来
这使得我们可以用递推的方式来快速计算幂。
代码实现:
//c++
long long qkpow(long long a, long long b) { //接受来自外部的底数a与指数b
long long res = 1; //初始化结果变量
while (b > 0) { //用指数 b>0 做循环终止条件,通过不断右移b的二进制位消耗b的大小直至为0
if (b & 1) res = res * a; //如果b的二进制第一位为1,将此时的a乘入结果
a = a * a; //每二进制位a平方自增一次
b >>= 1; //右移b的二进制位,通过位数右移不断读取二进制第一位来获取下一位是否为1
}
return res;
}
(高精度实现待整理)