首页 > 代码库 > 快速幂的求法之总结.

快速幂的求法之总结.

刚刚接触到ACM 遇到指数实在是有心无力,在网上查了一下.发现了快速幂.现总结如下:

 

我称为quick mi.

假设3个数字 a,b,c;

我要求的是 (a^b)modc=?

显然,如果a b 都过大的话,数据肯定会溢出的. 所以

用quick mi肯定简单许多,时间缩短了,而且也不容易溢出.

首先想到一个公式:(a*b)modc = (amodc)*(bmodc)modc;

这个公式怎么来的,证明过程如下:

amodc=d;

bmodc=e;

a=tc+d;

b=kc+e;

所以 (a*b)modc=(...)(...)modc=(tkc^2+(te+ak)c+de)modc=demodc=(amodc)(bmodc)modc;

依上公式可得:

假设b为偶数 即得 ((a^2)^(b/2))mod c 然后设a=a^2 得 (a^(b/2))modc 又令 a=a^2;得 (m^(b/4))modc;

但是 在此过程中,很有可能会使得b的值为奇数,那么,只要在加一句判断 然后 s=(s*a)%c;s为之前求得的余数。//即多乘一项即可!

 

代码如下:

 1 int quickmi(int a,int b,int c) 2 {   int s=1; 3     a=a%c; 4     while(b>0) 5     { 6         if(b%2==1)//判断一下b是否为奇数 7           s=(s*a)%c;//如果是奇数,则多乘一项 8           b=b/2; 9           a=(a*a)%c;10     }11     return s;12 }

 

快速幂的求法之总结.