使用埃拉托色尼筛法找到第 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 视频,n
th 素数约等于 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 n 和 n (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 个素数的主要内容,如果未能解决你的问题,请参考以下文章