快速幂取余
在快速幂取余以前,首先需要了解快速幂。
快速幂
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
int Quickpow(intn,int m)----------①
{
int r=1;
while(m)----------②
{
if(m&1) r*=n;----------③
n*=n;----------④
m>>=1; ----------⑤
}
return r;
}
①用快速幂求n的m次方。
取m=13用于以下说明。13的二进制形式为1101,所以13=2^3+2^2+2^0,则n^13=n^(2^3+2^2+2^0)=n^(2^3)*n^(2^2)*n^(2^0).
②~⑤
m每次的变化为:
m(D)-----------------m(B) n
13--------------------1101 2^0
6-----------------------110 2^1
3-------------------------11 2^2
1---------------------------1 2^3
0---------------------------0
r初始为1,③对13的二进制数1101的每一位进行判断,如果为1,则r乘上对应的n。④每循环一次n*=n,n为对应二进制位所对的十进制数,⑤每循环一次,使m的二进制数向右移一位,对二进制数的最后一位进行判断,这样对m的二进制数逐个进行判断。
快速幂取余
快速幂取余就是在快速幂的基础上对某个数取余,由于没取余以前的数有可能会很大,所以要在快速幂的过程中用同余定理不断取余。
int Quickpow(intn,int m,int mod)----------①
{
int r=1;
while(m)----------②
{
if(m&1) r=(r*n)%mod;----------③
n=(n*n)%mod;----------④
m>>=1; ----------⑤
}
return r;
}
①用快速幂取余求n的m次方,在对mod取余。
快速幂取余就是利用同余定理在快速幂的过程中,在③④步取余,其他与快速幂类似。