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