快速幂

快速幂

理论基础:
$$
a^bmod\space c = ((a^2)^{b/2})mod\space c, (b = 0(mod\space 2))
\
\
a^bmod\space c = ((a^2)^{b/2} \times a)mod\space c, (b = 1(mod\space 2))
$$
可以看作是递归函数,递归出口是b = 0

1
2
3
4
5
6
int pow_mod(int a, int b, int c) 
{
if(b == 0)return 1;
if(b % 2 == 0)return pow_mod((a * a) % c, b / 2, c) % c;
return (pow_mod((a * a) % c, b / 2, c) * a) % c;
}

写成非递归形式:

1
2
3
4
5
6
7
8
9
10
11
int pow_mod(int a, int b, int c) 
{
int ans = 1;
while(b > 0) {
if(b % 2 == 1)
ans = (ans * a) % c; // 这里可以理解为,每次遇到b%2==1时,都会产生一个多余的a, 先把它存储在ans中,最后b=0时,就是(1*a)%c,因此直接输出结果
a = (a * a) % c;
b = b / 2;
}
return ans;
}

快速幂
http://example.com/2023/01/10/快速幂/
作者
Chen Shuwen
发布于
2023年1月10日
许可协议