快速幂取模

int exp_mod(int a,int b,int n)
{
     int r=1;
     while(b)
     {
         if(b&1)r=(r*a)%n;
         a=(a*a)%n;
         b>>=1;
     }
     return r;
 }

  a^b%n

利用二进制扫描的方法快速的计算ab mod c,显然用常规方法计算74237 mod 4233计算量过大。

基本原理:(a×b)mod c=((a mod c)×b)mod c

例如:35 mod 7=3(101)2 mod 7=((3(100)2 mod 7)×3)mod 7=((9(10)2 mod 7)×3)mod 7=(((9 mod 7)(10)2 mod 7)×3)mod 7=((2(10)2 mod 7)×3)mod 7=((4(1)2 mod 7)×3)mod 7=(4×3)mod 7=5

 

在代码中,r表示最后要求的模,b表示2进制的指数,a表示底数,每个循环过程都是在不断代换a,b,r

posted on 2012-08-01 09:37  矮人狙击手!  阅读(242)  评论(0编辑  收藏  举报

导航