我希望创建一个程序来实现n< = 10 ^ 14的计数功能

时间:2015-02-14 16:57:09

标签: primes

我可以使用Eratosthenes的Sieve来计算素数的数量,但这需要我创建一个如此之大的数组,以至于无法创建它。我只是期待找到一种方法或算法来完成任务。名称或参考将用于此目的。我只需要一些方法来完成任务。有了这个方法,我将找出编程部分。请帮助。

1 个答案:

答案 0 :(得分:0)

对于你想要的东西,我无法想到比Sieve of Eratosthenes更好的东西,所以这就是我要做的。

Eratosthenes的Sieve只需要检查一个数字的素数除数,直到该数字的平方根,所以你不需要为所有小于10 ^ 14的素数创建一个数组 - 只需素数小于10 ^ 7。

664,579 primes小于10 ^ 7 - 即使在具有非常适度规格的计算机上,该大小的数组也应该没问题(将它们存储为4字节整数,即~2MB )。

这是一种伪代码方法:

  • 为小于10 ^ 7的素数创建存储 - 让我们称之为除数存储。
  • 使用第一个素数2来种子存储。
  • 为找到的素数创建一个计数器,将其初始化为一个(对于素数2)。
  • 为主要候选人创建一个计数器,从3开始。
  • 将主要候选人除以除数存储中的所有素数。如果没有留下余数,那么它是素数,所以将它加到除数存储器中(除非它大于10 ^ 7)并增加找到的质数计数器。
  • 将候选人数增加两倍。
  • 重复最后两步进入主要候选人超过10 ^ 14。

在保持除数素数时你不需要 - 你可以天真地除以每个小于候选词根的数字,但这将更快地记录log(n)。

这是一种非常粗暴的方式,但它确实有效。