一、提出
求 3 13 3^{13} 313
二、研究
2.1 常规算法
3
13
3^{13}
313 = 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3 * 3
需要算 14 次,太麻烦,不符合程序员的逼格
2.2 快速幂
( 13 ) ∗ 10 (13)*{10} (13)∗10 = ( 1101 ) ∗ 2 (1101)*2 (1101)∗2 = 1 * 2 3 2^3 23 + 1 * 2 2 2^2 22 + 0 * 2 1 2^1 21 + 1 * 2 0 2^0 20
3 13 3^{13} 313 = 3 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 3^{1 * 2^3 +1 * 2^2 + 0 * 2^1 + 1 * 2^0 } 31∗23+1∗22+0∗21+1∗20
3
13
3^{13}
313 =
3
8
3^8
38 *
3
4
3^4
34 *
3
1
3^1
31
需要算 7 次,方便运算
推导过程
3
1
3^1
31 =
(
3
1
)
(3^1)
(31)
3 2 3^2 32 = ( 3 1 ) 2 (3^1)^2 (31)2
3 4 3^4 34 = ( 3 2 ) 2 (3^2)^2 (32)2
3 8 3^8 38 = ( 3 4 ) 2 (3^4)^2 (34)2
快速幂就是运算过程不断对底数进行平方运算,并当指数的二进制某位为 1 时,保存当前底数的值
2.3 代码实现
代码实现
typedef long long ll;
//a为底数,b为指数
ll fastPower(ll a, ll b, ll mod) {
if(b==0) {
return 1%mod;
}
//res用来保存结果
ll res = 1;
while(b) {
//指数当前位为1时,保存底数的值
if(b&1) {
res = (res * a)%mod;
}
//判断指数的下一位
b>>=1;
//底数做平方运算
a = (a * a)%mod;
}
return res;
}
运行结果:
b&1
表示 b 与 1 进行按位与操作,若 b 当前二进制位为 1 则结果为 1;同时若 b 为奇数时,该操作结果也为 1
>>
表示位移运算