【问题标题】:How to implement modular exponentiation?如何实现模幂运算?
【发布时间】:2018-07-22 03:52:03
【问题描述】:

我正在尝试这样计算:a^b mod c,其中所有三个数字都很大。

我尝试过的事情:

  1. Python 的 pow() 函数需要几个小时,但尚未产生结果。 (如果有人能告诉我它是如何实现的,那将非常有帮助!)

  2. 我实现的从右到左的二进制方法,时间为 O(log e),大约需要 30~40 小时(不想等那么久)。

  3. 各种递归方法都会产生分段错误(在我更改了递归限制之后)

我可以做任何优化吗?

【问题讨论】:

  • see Fast bignum square computation 有了这么大的数字,我会尝试基于 NTT 的 Schönhage-Strassen 乘法而不是 karatsuba ...通常平方的幂涉及 sqr,而基于 NTT 的 sqr 甚至更快

标签: python algorithm pow modular-arithmetic cryptanalysis


【解决方案1】:

听起来您正在尝试评估pow(a, b) % c。您应该使用 3 参数形式 pow(a, b, c),它利用了 a * b mod c == a mod c * b mod c 这一事实,这意味着您可以在计算 a ^ b 时减少子积,而不必先进行所有乘法运算.

【讨论】:

  • 是的,我正在使用 pow(a, b, c)。天真的实现需要 O(e) 时间。
【解决方案2】:

Python 使用 Karatsuba 乘法,因此乘法的运行时间为 O(n^1.585)。但除法仍然是 O(n^2)。

对于求幂,Python 使用从左到右的方法和 5 位窗口。 (它一次消耗 5 位而不是 1 位。它确实使用更多内存,但通常会更快。)

要获得更快的计算,您可能需要查看gmpy2。它包装了GMP多精度库,并且会更快。我进行了快速测试,我认为它会快 100 倍左右。

免责声明:我维护 gmpy2。

【讨论】:

  • 一开始我其实用的是gmpy2。我使用了 gmpy2.powmod(mpz(a), mpz(b), mpz(c))。我的电脑在使用时由于某种原因死机。我可以做些什么来优化它吗?
  • 并非如此。没有检查中断,因此计算不会被中断。顺便说一句, gmpy2.powmod(a,b,c) 就足够了;参数会自动转换为 mpz。这些值有什么特别之处吗?
  • 据我所知,它们只是大数字(约 120000 位数字)。具体来说,我正在尝试实现 RSA 的快速解密。 (a, b, c) 这里分别是密文、私钥和模数。
  • @abforlife 在实践中使用 RSA 加密时,使用随机密钥通过对称算法(如 AES)对任意长度的消息进行加密。然后该密钥(仅 256 位左右)用 RSA 加密。
  • 随机选择一些数字,我的机器上的运行时间应该在30分钟左右。但是@MattTimmermans 所说的......
猜你喜欢
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
相关资源
最近更新 更多