Який найелегантніший спосіб реалізувати цю функцію:
ArrayList generatePrimes(int n)
Ця функція генерує перші n
прості числа (edit: where n>1
), тому generatePrimes(5)
поверне ArrayList
с {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
іnextProbablePrime
для дуже простого коду, хоча я не можу уявити, щоб він був особливо ефективним (dfa) - Використовуйте LINQ для лінивого створення списку простих чисел (Магіс)
- Помістіть багато простих чисел у текстовий файл і зачитайте їх, коли це необхідно (Дарін)
Редагування 2 : Я застосував у C # кілька методів, наведених тут, і ще один метод, про який тут не згадується. Всі вони ефективно знаходять перші n простих чисел (і я маю гідний метод пошуку межі, яку можна забезпечити ситам).