参考文章来源:Reait Home(http://www.reait.com/blog.html) 转载请注明,谢谢合作。
快速幂取模 是一种常用的算法,这里总结下。
求a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能
算法1:利用公式a*b%c=((a%c)*b)%c,这样每一步都进行这种处理,这就解决了a^b可能太大存不下的问题,但这个算法的时间复杂度依然没有得到优化
代码如下:
int Mod1(int a,int b,int n) { int cnt = 1; while (b--) { cnt = a * cnt % n; } return cnt; } </span>算法2:另一种算法利用了二分的思想,可以达到O(logn)。
int Mod2(int a,int b,int n) { int t = 1; if(b == 0) return 1; if(b == 1) return a%n; t=Mod2(a, b>>1, n); t=t*t%n; if (b&1) { t = t*a % n; } return t; }实例代码2:非递归优化 :
int Mod3(int a,int b,int y) { int cnt=1; while(b) { if(b&1) cnt=cnt*a%y; a=a*a%y; b>>=1; } return cnt; }
原文地址:http://blog.csdn.net/u013050857/article/details/42319465