蒙哥马利幂模运算

作者:追风剑情 发布于:2016-4-26 14:33 分类:Algorithms

蒙哥马利(Montgomery)幂模运算是快速计算a^b%k的一种算法,是RSA加密算法的核心之一。

数学原理

(a×b)%n = (a%n × b%n)%n

(a+b)%n = (a%n + b%n)%n

示例: 求a^9%n

a^9%n = (a^8 × a)%n = (a^8%n × a%n)%n

a^8%n = (a^4 × a^4)%n = (a^4%n × a^4%n)%n

a^4%n = (a^2 × a^2)%n(a^2%n × a^2%n)%n

a^2%n = (a × a)%n(a%n × a%n)%n

a%n = (1 × a)%n = (1%n × a%n)%n = (a%n)%n

C#代码实现


  1. using System;
  2.  
  3. namespace MontgomeryTest
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. //测试数据
  10. int M = 7900000, E = 3, N = 9;
  11. //普通算法
  12. double R1 = Math.Pow(M, E) % N;
  13. //蒙哥马利算法
  14. int R2 = ModularPower(M, E, N);
  15.  
  16. Console.WriteLine("R1={0}, R2={1}", R1, R2);
  17. Console.Read();
  18. }
  19.  
  20. /// <summary>
  21. /// 蒙哥马利幂模运算
  22. /// </summary>
  23. /// <param name="M">基数</param>
  24. /// <param name="E">指数</param>
  25. /// <param name="N">模数</param>
  26. /// <returns></returns>
  27. public static int ModularPower(int M, int E, int N)
  28. {
  29. int k = 1;
  30. int n = M % N;
  31.  
  32. while (E > 0)
  33. {
  34. if ((E & 1) == 1)
  35. k = (k * n) % N;
  36.  
  37. n = (n * n) % N;
  38.  
  39. E = E >> 1;
  40. }
  41.  
  42. return k;
  43. }
  44. }
  45. }


运行结果

44444.png

用科学计算器验证结果

11111.png

22222.png

333333.png


结论: 当数据过大时无法用普通方法计算a^b%k

标签: Algorithms

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号