【问题标题】:Finding nth prime using Seive of Eratosthens使用埃拉托色尼筛法找到第 n 个素数
【发布时间】: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 个数怎么办。

【问题讨论】:

标签: java algorithm math primes


【解决方案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)(这里的基础确实很重要)。

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2011-12-16
      • 2017-11-14
      • 1970-01-01
      相关资源
      最近更新 更多