この関数を実装するための最もエレガントな方法は何ですか?
ArrayList generatePrimes(int n)
この関数は最初のn
素数を生成するため(編集:where n>1
)、withgeneratePrimes(5)
を返します。(私はこれをC#で行っていますが、Javaの実装、またはその他の同様の言語(Haskellではない)に満足しています)。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のを使用
BigInteger
しnextProbablePrime
、非常に単純なコードに使用しますが、特に効率的であるとは想像できません(dfa) - LINQを使用して、素数のリストを遅延生成します(Maghis)
- たくさんの素数をテキストファイルに入れて、必要に応じて読みます(ダリン)
編集2:ここに記載されているいくつかのメソッドとここに記載されていない別のメソッドをC#で実装しました。それらはすべて最初のn個の素数を効果的に見つけます(そして私はふるいに提供する限界を見つけるためのまともな方法を持っています)。