【问题标题】:Generating prime numbers in poly-time多时间生成素数
【发布时间】:2014-11-23 10:52:07
【问题描述】:

我正在努力了解如何在多时间 J 中生成 J 个最小素数的列表,基于 p'j 小于或等于 2j * ln(j) for j > 2 的事实,其中 j 表示第 j 个连续素数。例如,对于 j=1,p1 = 2,对于 j = 2,p2 = 3。对于 j = 3,p3 = 5,对于 j = 4,p4 = 7,对于 j = 5,p5 = 11,等等......

我只是不明白如何利用上面的这个事实。任何时候我想生成一个素数,比如第 7 个,我会通过插入来检查:2(7)*ln(7) = 27.2427... 但事实证明这是完全没用的。这个数字比我数组中最后一个生成的素数大得多,这是合乎逻辑的。因此,我仍然必须通过使用数组中的每个素数检查 mod0 的最后一个素数 +1 来诉诸暴力。另一种选择是诉诸现有的算法,将时间减少到多项式时间。

你能告诉我如何利用这个事实:p'j

【问题讨论】:

  • p'j 小于等于 2j * ln(j)?你确定吗?
  • 绝对 100% 肯定!好吧,我要补充一点,这是为了足够大的 j。但几乎任何高于 2 的东西都有效。
  • 能否给个链接,我不明白
  • 我没有链接。那是教科书上的。我刚刚编辑了 qn 以计算 j 必须大于 2 的小修改。
  • 根据wikipediap_j < j*ln(j) + j*ln(ln(j)),小于2j*ln(j)

标签: algorithm primes prime-factoring


【解决方案1】:

为了证明我可以生成 J 中时间多项式中前 J 个素数的列表,我需要计算生成列表的成本。

如果我通过一个接一个地检查数字并丢弃非素数来生成列表,则生成列表的成本有两个部分 - 检查每个数字需要多长时间,以及我需要多少个数字检查。

如果素数非常稀有,那么我无法检查从 2 开始的每个数字,因为简单地列出所有这些数字太昂贵了。但如果我知道第 J 个素数不大于 2j*ln(j),我至少可以在多项式时间内将它们全部列出。

事实上,如果我必须生成 J 个素数,我首先取前 2J*ln(J) 个数字,然后我决定通过将每个数字除以目前找到的每个素数来检查每个数字是否为素数,任何时候我手头的素数都不会超过 J,所以我最终不能做超过 2J^2*ln(J) 的试除法。这不会为我赢得任何效率或聪明算法的奖励,甚至不会为计算成本带来明显的限制,但它并不比多项式差。

【讨论】:

【解决方案2】:

也许让您感到困惑的是您认为上限为您提供了一个方法来直接生成第 j 个素数或前 j 个素数。它没有——它只是给你一个大小限制,你需要用一些你已经躺在身边的方法来检查这些数字,例如审判庭。

如果我给你一个 n-1 个数字 2, 3, ..., n 的列表,并要求你找到这个列表中的所有素数,你可以使用 O(n^2) 中的试除法来做到这一点时间:

  1. 对于每对数字 x 和 y,只需检查 x 是否均分到 y,如果是则将 y 划掉。这一步是 O(n^2),需要 O(n) 空间来跟踪哪些数字被划掉了。
  2. 列出所有没有被划掉的数字。这一步是 O(n)。

请注意,对于 any n 的正值,这会在 O(n^2) 中找到所有素数

n = RoundDown(2j log j),这个算法运行时间为O((2j log j)^2) = O(j^2 log^2 j),j中是多项式,必须成功至少要找到前 j 个素数,因为边界告诉我们第 j 个素数最多可以是 RoundDown(2j log j),并且我们已经将每个数字都包括在输入列表中。 (它可能会找到更多的素数,但如果需要,我们可以在线性时间内丢弃它们。)

练习:想想为什么我们可以在此处向下取整

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2021-05-20
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多