对快速幂的理解

以下是本人自己的看法,如果有不对请指出:

 

 

 

快速幂其实就是一种简化计算幂所需时间的方法 ;

模板代码如下:  

假设求 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循环结束

验证了下代码的正确性,有时候如果不懂代码的内涵可以把数据带进去可以方便理解。

posted @ 2017-01-19 12:29  HaipaiAcm  阅读(162)  评论(0编辑  收藏  举报