该快速幂函数用于求
a
b
%
p
a^b\%p
ab%p 的结果,既用来计算
a
a
a的
b
b
b次幂取模
p
p
p的结果。
函数原理:
(利用费马小定理)1
依次判断指数
b
b
b的二进制位有哪些是
1
1
1。如果二进制最后一位是
1
1
1,就将最终答案
a
n
s
ans
ans乘上
a
a
a,结束判断后再将
a
a
a平方,同时将
b
b
b右移
1
1
1位,直到
b
b
b等于
0
0
0为止。
注意:在每一次计算之后,都要取模
p
p
p。
函数代码:
long long fast_power(long long a, long long b, long long p)
{ // 快速幂函数,求解a^b%p
long long ans = 1;
while (b) // 直到b等于0停止循环
{
if (b & 1) // 如果二进制最后一位是1
ans = ans * a % p; // 将最终答案ans乘上a
a = a * a % p; // 将a平方
b >>= 1; // 将b右移1位
}
return ans;
}