使用埃拉托色尼筛法找到第 n 个素数

Posted

技术标签:

【中文标题】使用埃拉托色尼筛法找到第 n 个素数【英文标题】:Finding nth prime using Seive of Eratosthens 【发布时间】:2015-11-04 10:52:38 【问题描述】:

我正在使用 Eratosthenes 的 Seive 来计算第 1,000,001 个素数,但是,我无法计算使用 Seive 的上限。我的功能:

public static void Seive(int num)
    BitSet primes = new BitSet();

    for(int i=2; i<=num; i++)
        if(!primes.get(i))
            for(int j=i+i; j<=num; j+=i)
                primes.set(j);
            
        
    

    for(int i=2; i<=num; i++)
        if(!primes.get(i))
            System.out.print(i + " ");
           


计算从 2 到 num 的素数,但如果我不知道范围但有兴趣找到第 n 个数怎么办。

【问题讨论】:

请注意,您可以观看 Numberphile 关于素数的 Youtube 视频,nth 素数约等于 n*ln(n) maa.org/sites/default/files/jaroma03200545640.pdf 只是一个小细节,但如果将i+i 替换为i*i,筛选代码将运行得更快。 (所有小于i*i 的合数都已经从筛子中剔除,因此无需再次访问。) How can I use the Sieve of Eratosthenes to get the nth prime?的可能重复 【参考方案1】:

素数定理的推论指出,对于 n > 5,第 n 个素数在 n log nn (log n + log log n) 以 e 为底的对数。因此,找到前 n 个素数的一种简单方法是筛选到上限,然后丢弃第 n 个素数之外的素数。

【讨论】:

【参考方案2】:

这就是Project Euler - Problem 7 中我怀疑你的工作的重点。它的设计方式使sieve 难以使用。 这个问题足够小,可以使用brute force method 或代替标准的蛮力除法,使用它们存储您的素数和蛮力。

【讨论】:

PE7 是找到第 10,001 个素数,我的是找到第 1,000,0001 个 :-D 同样的概念也适用。很难使用基于上限的算法,因为所需的界限是未知的 存储素数也需要上限,我怎么知道素数列表已经完成以便我可以蛮力? 是的,您要查找的素数数。这不是一个未知的上限。前几个可以硬编码或生成。每次您使用素数来计算下一个时,您将其添加到列表中并从那时起使用它【参考方案3】:

看看prime number theorem。上限的一个很好的近似值是n * ln(n)(这里的基础确实很重要)。

【讨论】:

以上是关于使用埃拉托色尼筛法找到第 n 个素数的主要内容,如果未能解决你的问题,请参考以下文章

使用 MPI 的质数计数器(埃拉托色尼筛法),太慢了

埃拉托色尼筛法及线性筛法

埃拉托色尼筛 - 寻找素数 Python

使用筛子找到小于 LONG 数的素数

通过埃拉托色尼筛算法(C++)查找素数

数论-素数问题整理