目录
快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在
的时间内计算
的小技巧,而暴力的计算需要
的时间。而这个技巧也常常用在非计算的场景,因为它可以应用在任何具有结合律的运算中。其中显然的是它可以应用于模意义下取幂、矩阵幂等运算,我们接下来会讨论。
算法描述
显然,正常情况下,一般计算 为使用n个a相乘,但当a,n两个数过大时,任务负担会变得很大。不过,我们知道
,那么可以转换二进制将任务进行分割,即:
例如:
那么,因为n有个二进制位,因此当我们知道了
后,我们只用计算
次乘法就可以计算出
。
代码实现
//C++ 递归
long long binpow(long long a,long long n){
if (n == 0)
return 1;
long long res = binpow(a, n/2);
if (n % 2)
return res * res * a;
else
return res * res;
}
// 非递归
long long binpow(long long a, long long n){
long long res = 1;
while (n > 0){
if (n & 1)
res = res * a;
a = a * a;
b >>= 1;
}
return res;
}