【发布时间】:2015-02-14 16:57:08
【问题描述】:
我可以使用埃拉托色尼筛法来计算素数的数量,但它需要我创建一个太大而无法创建的数组。我只是期待找到一种方法或算法来完成这项任务。名称或参考将达到目的。我只需要一些方法来继续这项任务。有了方法,我会弄清楚编程部分。请帮忙。
【问题讨论】:
-
为什么要保留所有素数?有 3,204,941,750,802 个质数小于 10^14 - 你很难将它们全部保存在内存中(!)
-
我不想保留素数,我只想计算素数的个数。
-
This SO question 询问Sieve of Atkin,这是埃拉托色尼筛的优化版本。该问题尚未得到公认的答案,但可能值得您看一看。
-
@WaiHaLee,阿特金的筛子不值得得到积极关注:它需要在 10^14 的范围内进行页面分段,而且效果很差,而且性能不如根据这些范围的理论时间复杂度——即使是作者的参考“primegen”实现也不能很好地适应这个范围。将素数计数到 10^14 的更好方法是数值分析技术。
-
这个问题中建议的 10^14 范围足够大,因此即使是最优化的页面分段 Sieve of Eratosthenes Kim Walisch's primesieve 也需要大约四个小时才能在使用多线程的现代桌面 CPU 上完成.对于素数计数,this SO algorithm 之类的方法可以在几秒钟内完成,Kim Walisch's extremely optimized version 使用改进的算法和多线程可以在几分之一秒内完成。
标签: primes