【问题标题】:Dynamic Sieve Algorithms for Prime Generation生成素数的动态筛算法
【发布时间】:2011-09-26 18:02:53
【问题描述】:

我正在实施埃拉托色尼筛法,有关此问题的解释,请参阅 http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes。但是我想调整它来生成 M 个素数,而不是从 1 到 N 的素数。我这样做的方法是简单地创建一个足够大的 N,以便所有 M 个素数都包含在这个范围内。有没有人有任何好的启发式来模拟素数的增长?如果您希望发布代码 sn-ps,我将在 Java 和 C++ 中实现它。

【问题讨论】:

  • 有一个筛子算法的版本,你可以用两个数组来实现,两个数组的大小都等于你希望找到的素数的数量。一个持有素数,另一个持有同一索引处素数的素数倍数。这样你就不需要计算筛子的大小(你的问题是 N)。

标签: java c++ algorithm primes sieve


【解决方案1】:

要生成 M 个素数,您需要达到大约 M log M。请参阅this Wikipedia article 中的Approximations for the nth prime number,了解素数定理。为了安全起见,您可能需要高估——比如 N = M (log M + 1)。

编辑添加: 正如大卫哈门指出的那样,这种高估并不总是足够好。维基百科文章给出了 M (log M + log log M) 作为 M >= 6 的安全上限。

【讨论】:

  • Re "为了安全起见,您可能需要高估 -- 比如说 N=M(log M + 1)" -- 这还不够保守。示例:第 1619 个素数是 13693,但您的表达式仅产生 13582.7。 wiki 文章确实给出了对所有 M>5 有效的上限,N = M log(M log M)
  • @David:感谢您指出这一点!我已经编辑了我的答案。但是我在链接的文章中没有看到你的表达 M log(M log M)。
  • M log(M log M) = M log M + M log log M。这直接来自 log(AB) = log A + log B 以及乘法对加法的分布。我不知道为什么 wiki 文章使用了更冗长的身份右侧。
  • 如果你不相信我的数学,相信 Wolfram Alpha 的:wolframalpha.com/input/…。向下滚动到“假设 M 为正的替代形式:”。
  • @David:我之前没有回复你的评论,唯一的原因是我太尴尬了。你的逻辑当然是无可挑剔的。
【解决方案2】:

第 n 个素数的近似值取自维基百科;因此你只需要分配一个m*log(m)+m*log(log(m)) 的数组; m*log(m) 的数组将不够用。

【讨论】:

    【解决方案3】:

    另一种选择是分段筛。将数字筛选到一百万。然后是第二个百万。然后是第三个。等等。吃饱了就停下来。

    为下一段重置筛子并不难。详情请见我的blog

    【讨论】:

      【解决方案4】:

      为什么不动态增长筛子?每当您需要更多素数时,重新分配筛选内存并运行筛选算法,就在新空间上,使用您之前找到的素数。

      【讨论】:

      • 另外,这会破坏筛子的点,然后我必须在每次增大筛子时重复先前发现的每个素数,从而大大减慢我的程序。
      • 对,我想这就是所谓的分段筛。只是一个澄清,你当然不会从头开始重新开始,而是在连续素数的正方形之间筛选不断增加的跨度,每个新素数(所以不需要“**重新-**分配”)。当没有足够的内存并且您开始使用较短的筛选数组时,@jozefg 只有这样,性能才会开始受到影响。
      【解决方案5】:

      我想到了惰性求值(例如 Haskell 和其他函数式语言为您做这件事)。尽管您使用命令式语言写作,但您可以应用我认为的概念。

      考虑从候选集中删除剩余基数的操作。无需实际触及真正的算法(更重要的是无需猜测您将创建多少个数字),以惰性方式执行此操作(必须实现,因为您使用的是命令式语言),何时以及是否尝试取最小的剩余数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        相关资源
        最近更新 更多