快速模取幂

计算 a^b mod c

法1:直接求解

      

[cpp]  view plain copy
  1. int ans =1;  
  2. for i=1 to b  
  3.     ans = ans * a;  
  4. ans = ans % c;  

 
法2:a^b mod c = ( a mod c ) ^ b mod c 

[cpp]  view plain copy
  1. int ans = 1;  
  2. a = a % c;  
  3. for i=1 to b  
  4.      ans = ans * a;  
  5. ans = ans % c;  

法3:由于某个因子取余后再相乘余数保持不变

          a^b mod c = (a mod c)^b mod c

                             =(...(((a mod c)*a) mod c)*a) mod c)...*a)mod c

                                           共有b个a相乘

[cpp]  view plain copy
  1. int ans = 1;  
  2. a = a % c;  
  3. for i=1 to b  
  4.      ans = ans * a mod c;  
  5. ans = ans % c;  

 

法4:当b 为偶数时,a^b mod c = ( a^2 )^( b/2 ) mod c

= k^( b/2 ) mod c

当b为奇数时,a ^b mod c = ( ( a^2 )^( b/2 ) )* a mod c

= ( k^( b/2 )*a ) mod c

[html]  view plain copy
  1. int ans1;  
  2. int k = a*a;  
  3. if b mod 2 equal 1  
  4.     ans = ( ans * a) mod c;  
  5. for i = 1 to b/2  
  6.     ans = ( ans * k) mod c;  
  7. ans = ans mod c;  

法5:对法4进行迭代,即:令 a = k;

b = b/2;

[cpp]  view plain copy
  1. int ans = 1, t = a;  
  2. while b > 0  
  3.    if b mod 2 equal 1  
  4.          ans = ( ans *t ) mod c;  
  5.    b /= 2;  
  6.    t = ( t *t ) mod c;  
  7. return ans;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值