快速取模运算

1.求a^n%Mod 的运算

先研究一个实例:3^45的乘法原理:

45(10)=101101(2)

45=2^5+2^3+2^2+1=32+8+4+1;运算规模由O(n)变成O(log(n))

3^45=3^32*3^8*3^4*3;

而由公式:a*b%c=(a%c)*(b%c)

证明如下:

不妨令a=k1*c+x1,b=k2*c+x2;

那么a*b=(k1*c+x1)*(k2*c+x2)%c=x1*x2%c;

而(a%c)*(b%c)=((k1*c+x1)%c)*((k2*c+x)%c)=x1*x2%c;

故得证。

可以写出如下代码:

 1 const int MOD = 10007;
 2 int PowMod(int a, int n)//a^n%MOD
 3 {
 4 int ret = 1; 
 5 while(n) 
 6 { 
 7 if(n & 1) ret = ret * a % MOD;
 8 a = a * a % MOD; 
 9 n >>= 1;//相当于对数据每次除以2并取商n/=2;
10 }
11 return ret;
12 }

这样就可以把模快速求出来了。

原文地址:https://www.cnblogs.com/khbcsu/p/3853107.html