【问题标题】:Factorization of large numbers大数的因式分解
【发布时间】:2011-02-08 11:15:25
【问题描述】:

在课堂上我们发现了这个编程问题,目前我们不知道如何解决。

给出正整数n。已知n = p * q,其中pq 是素数,p<=q|q-k*p|<10^5 对于某些给定的正整数k。你必须找到pq

输入:

35 1
121 1
1000730021 9

输出:

5 * 7
11 * 11
10007 * 100003

这不是家庭作业,我们只是想解决一些有趣的问题。如果您有任何想法,请在此处发布,以便我们尝试一下,谢谢。

【问题讨论】:

  • 嗯....也许可以将其移至 www.solvemyproblemoverflow.com
  • 提示:q≈kp,所以 n=pq≈kp²。换言之,p≈√(n/k)。把“≈”变成精确的界限,你就有了你的算法。
  • 输入格式是什么:n k?
  • 这听起来有点像 projecteuler.net 的问题。

标签: algorithm rsa factorization


【解决方案1】:

对于您在此处谈论的大小的数字,最快的因式分解方法是(可能)使用埃拉托色尼筛法生成大约为该数字平方根的素数,然后使用试除法找出哪个one(s) 是除数。

已经为更大的数字发明了相当多的因式分解方法。您可能想在 Google 上搜索“Fermat 因子分解法”、“Pollard Rho”、“Brent 法”、“Lenstra 椭圆曲线”、“多项式二次筛”和“一般数域筛”。我已经按照(大致)复杂性和分解更大数字的能力的升序列出了这些。不过,我是否应该提及通用数字域筛是有待商榷的——虽然它是目前已知的用于分解极大数字的最有效方法,但它只适用于非常大的机器——低于大约 110 位左右,MPQS速度更快,但要考虑 GNFS 更快的大量数字,您需要比典型台式机或服务器支持更多的内存(将 TB 的 RAM 视为最低起点,但可能不止于此)。

【讨论】:

    【解决方案2】:

    我使用了ECM 方法来分解大整数。它是已知的最有效的算法之一。如果你想了解算法是如何工作的,那么你有很多阅读要做,但是如果你想利用它来做你的研究,有些人已经实现了它。例如,您可以获得这些开源包:GMP-ECM 用于 C/C++ 或 Pyecm 用于 Python。

    $ python
    >>> import math
    >>> import pyecm
    >>> n = 1000730021
    >>> list(pyecm.factors(n, False, False, 2 * math.log(math.log(n)), 1.0))
    [10007, 100003]
    

    【讨论】:

      【解决方案3】:
      n = p * q 
      |q-k*p|<10^5
      

      nk 作为输入。因此

      q-k*p=a 
      

      -10^5<=a<=10^5
      

      q-k*p=a 乘以q 并用n 代入p*q 得到

      q^2-a*q-k*n=0
      

      求解每个 a 的这个二次方程
      -10^5<=a<=10^5` 
      

      并检查q 是否除以n。 求解二次方程可以在多项式时间内完成,求解2*10^5+1 方程也是如此。对于 nk 的小值以及 nk 的大值当然有更好的算法。

      正如 ypercube 所提到的,人们只需检查方程式,其中

      a^2+4*k*n
      

      是一个正方形。

      【讨论】:

      • +1 不错!因此,检查Δ = a^2+4*k*n 是否为方形会更快。
      【解决方案4】:

      n = p * q 和 |q-k*p|

      p在区间内

      [(sqrt(k*n+2500000000)-50000)/k,(sqrt(k*n+2500000000)+50000)/k]
      

      因此,您只能检查 p 的 10^5/k 值。 q在区间内

      [sqrt(k*n+2500000000)-50000,sqrt(k*n+2500000000)+50000]
      

      它总是包含大约 10^5 个 inegers

      【讨论】:

        【解决方案5】:

        您可以使用http://qurancode.com 的基于 GUI 的 YAFU 版本来尝试更大的示例。 YAFU 的主要优点是它的自适应特性,它可以在分解时自动切换算法。使用适用于 Windows 7/8/10 的 GUI 版本确实是最好的和更容易的。

        只需点击被红心圈起来的黄色 PI 符号 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-23
          相关资源
          最近更新 更多