Как наиболее элегантно реализовать эту функцию:
ArrayList generatePrimes(int n)
Эта функция генерирует первые n
простые числа (edit: where n>1
), поэтому generatePrimes(5)
вернет ArrayList
with {2, 3, 5, 7, 11}
. (Я делаю это на C #, но я доволен реализацией Java - или любым другим подобным языком в этом отношении (но не Haskell)).
Я знаю, как написать эту функцию, но когда я сделал это вчера вечером, все закончилось не так хорошо, как я надеялся. Вот что я придумал:
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;
}
Меня не слишком заботит скорость, хотя я не хочу, чтобы она была явно неэффективной. Меня не волнует, какой метод используется (наивный или сито или что-то еще), но я хочу, чтобы он был достаточно коротким и очевидным, как он работает.
Изменить : Спасибо всем, кто ответил, хотя многие не ответили на мой вопрос. Повторюсь, мне нужен хороший чистый фрагмент кода, который генерирует список простых чисел. Я уже знаю, как это сделать по-разному, но я склонен писать код, который не так понятен, как мог бы. В этой ветке было предложено несколько хороших вариантов:
- Лучшая версия того, что у меня было изначально (Питер Смит, jmservera и Rekreativc)
- Очень чистая реализация сита Эратосфена (звездно-синий)
- Используйте Java
BigInteger
s иnextProbablePrime
для очень простого кода, хотя я не могу представить, чтобы он был особенно эффективным (dfa) - Используйте LINQ для ленивого создания списка простых чисел (Maghis)
- Поместите много простых чисел в текстовый файл и при необходимости прочтите их (дарин)
Изменить 2 : я реализовал на C # несколько методов, приведенных здесь, и еще один метод, не упомянутый здесь. Все они эффективно находят первые n простых чисел (и у меня есть приличный метод определения предела, который нужно предоставить решетам).