生成素数的最优雅方式 [闭合]
实现此功能的最优雅方法是什么:
ArrayList generatePrimes(int n)
此函数生成第一个素数(编辑:where),因此将返回一个 with 。(我在C#中这样做,但我对Java实现感到满意 - 或任何其他类似的语言(所以不是Haskell))。n
n>1
generatePrimes(5)
ArrayList
{2, 3, 5, 7, 11}
我知道如何编写这个函数,但是当我昨晚这样做时,它并没有像我希望的那样好。以下是我想出的:
ArrayList generatePrimes(int toGenerate)
{
ArrayList primes = new ArrayList();
primes.Add(2);
primes.Add(3);
while (primes.Count < toGenerate)
{
int nextPrime = (int)(primes[primes.Count - 1]) + 2;
while (true)
{
bool isPrime = true;
foreach (int n in primes)
{
if (nextPrime % n == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
break;
}
else
{
nextPrime += 2;
}
}
primes.Add(nextPrime);
}
return primes;
}
我不太关心速度,尽管我不希望它明显低效。我不介意使用哪种方法(天真或筛子或其他任何东西),但我确实希望它相当短,并且很明显它是如何工作的。
编辑:感谢所有回复的人,尽管许多人没有回答我的实际问题。重申一下,我想要一段漂亮干净的代码来生成素数列表。我已经知道如何以一堆不同的方式做到这一点,但我倾向于编写不那么清晰的代码。在此线程中,提出了一些很好的选择:
- 我最初拥有的更好的版本(Peter Smit,jmservera和Rekreativc)
- 埃拉托斯特尼筛子(星蓝)的非常干净的实现
- 使用Java和非常简单的代码,尽管我无法想象它特别高效(dfa)
BigInteger
nextProbablePrime
- 使用 LINQ 懒惰地生成素数列表 (Maghis)
- 在文本文件中放入大量素数,并在必要时读取它们(darin)
编辑2:我已经在C#中实现了这里给出的几个方法,以及这里没有提到的另一个方法。他们都有效地找到了前n个素数(我有一个不错的方法来找到提供给筛子的极限)。