快速幂与Montgomery 快速幂模算法

2019-04-14 12:45发布

快速计算乘方的算法: 如计算2^13,则传统做法需要进行12次乘法。   [cpp] view plaincopyprint?
  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   [cpp] view plaincopyprint?
  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 快速幂模算法: [cpp] view plaincopyprint?
  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. }