以下是本人自己的看法,如果有不对请指出:
快速幂其实就是一种简化计算幂所需时间的方法 ;
模板代码如下:
假设求 a^b%mod
int res=1;
while(b)
{
if(b&1) res=res*a%mod [1]
// (b&1)是二进制的与,用于判断最低位是否有1; 这里运用了模的基本算法 (a*b*c)%mod=(a%mod*b%mod*c%mod)%mod
a=a*a; //将a 进行平方 (这里写a=a*a%mod 也可以),在[1]式中又会取模消掉。
b=b/2; // 除2相当于二进制向后移动一位
}
answer=res%mod
接下来我们用一个例子来验证一下,加深理解 ;
求 2^5%3
b=5 res=1*2%3=2
a=2^2
b=2
b=2
a=2^4
b=1
b=1 res=((1*2%3)*(2^4)%3)%3=2
a=2^8
b=0
因为b=0循环结束
验证了下代码的正确性,有时候如果不懂代码的内涵可以把数据带进去可以方便理解。
原文:http://www.cnblogs.com/p-s-h/p/6306115.html