快速幂与Montgomery 快速幂模算法

快速计算乘方的算法:

如计算2^13,则传统做法需要进行12次乘法。

 

  1. //计算n^p     
  2. unsigned power(unsigned n,unsigned p)     
  3. {     
  4.     for(int i = 0; i < p; i++)      
  5.         n *= n;     
  6.     return n;     
  7. }    

 

优化如下:

把2*2的结果保存起来:4*4*4*4*4*4*2 
再把4*4的结果保存起来:16*16*16*2 
一共5次运算,分别是2*2、4*4和16*16*16*2

 

  1. unsigned int power(unsigned int n, unsigned int p)      
  2. {      
  3.     // 计算n的p次方     
  4.     unsigned int tmp = 1;     
  5.     while (p > 1)     
  6.     {     
  7.         // 判断p是否奇数,偶数的最低位必为0     
  8.         if (( p & 1 )!=0)     
  9.         {      
  10.             tmp *= n; // 若p为奇数,则把“剩下的”乘起来     
  11.         }     
  12.         n *= n;     
  13.         p >>= 1;     
  14.     }     
  15.     return n * tmp; // 最后把主体和“剩下的”乘起来作为结果     
  16. }    

 

Montgomery 快速幂模算法:

  1. unsigned int Montgomery(unsigned int n, unsigned int p, unsigned int m)     
  2. {      
  3.     unsigned int r = n % m;     
  4.     unsigned int tmp = 1;     
  5.     while (p > 1)     
  6.     {     
  7.         if ((p & 1)!=0)     
  8.         {     
  9.             tmp = (tmp * r) % m;     
  10.         }     
  11.         r = (r * r) % m;     
  12.         p >>= 1;     
  13.     }     
  14.     return (r * tmp) % m;     
  15. }    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值