快速幂算法
思路
整体思路:
需要降幂,让基数变大。乘积每步都要取余。
总结思路:
建立循环:只要质数不为0就可以一直循环。
先判断奇数还是偶数,可利用位运算。
若为奇数,提出一个奇数出来,同时指数--。同时取余
然后就让指数减半,基数平方。
循环结束后,返回结果即可
用途(个人总结)
个人认为快速幂主要用于求解a的b次方的结果对某数取余的时候会用。
首先,我们需要了解“取模”运算法则:
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p ) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
所以a^b对p取余就需要用到公式3
因此,我们可以借助这个法则,只需要在循环乘积的每一步都提前进行“取模”运算
而不是等到最后直接对结果“取模”,也能达到同样的效果。
最终优化代码如下:
//循环乘积每一步都需要提前进行取模。
long long fastPower(long long base, long long power) {//base为基数,power为指数。
long long result = 1;//result为结果。
while (power > 0) {
if (power & 1) {//此处等价于if(power%2==1),利用位运算提高速度。
result = result * base % 1000;//若为奇数则需要提取出一次指数,从而让指数为偶数。
}
power >>= 1;//此处等价于power=power/2,把偶数指数拆分开,让基数变大
base = (base * base) % 1000;//指数减小,基数变大。
}
//其实结果也可以再多取模一次。
return result;
}