Jaki jest najbardziej elegancki sposób realizacji tej funkcji:
ArrayList generatePrimes(int n)
Ta funkcja generuje pierwsze n
liczby pierwsze (edit: where n>1
), więc generatePrimes(5)
zwróci ArrayList
with {2, 3, 5, 7, 11}
. (Robię to w C #, ale jestem zadowolony z implementacji Java - lub innego podobnego języka (a więc nie Haskell)).
Wiem, jak napisać tę funkcję, ale kiedy zrobiłem to zeszłej nocy, nie skończyło się tak dobrze, jak się spodziewałem. Oto co wymyśliłem:
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;
}
Nie przejmuję się zbytnio szybkością, chociaż nie chcę, aby była ona oczywiście nieefektywna. Nie przeszkadza mi, która metoda jest używana (naiwna, sito lub cokolwiek innego), ale chcę, aby była dość krótka i oczywista, jak to działa.
Edycja : Dziękuję wszystkim, którzy odpowiedzieli, chociaż wielu nie odpowiedziało na moje rzeczywiste pytanie. Powtarzając, chciałem mieć ładny, czysty fragment kodu, który generowałby listę liczb pierwszych. Wiem już, jak to zrobić na wiele różnych sposobów, ale mam skłonność do pisania kodu, który nie jest tak jasny, jak mógłby być. W tym wątku zaproponowano kilka dobrych opcji:
- Ładniejsza wersja tego, co pierwotnie miałem (Peter Smit, jmservera i Rekreativc)
- Bardzo czyste wykonanie sita Eratostenes (starblue)
- Użyj Java's
BigInteger
inextProbablePrime
dla bardzo prostego kodu, chociaż nie wyobrażam sobie, żeby był szczególnie wydajny (dfa) - Użyj LINQ, aby leniwie generować listę liczb pierwszych (Maghis)
- Umieść wiele liczb pierwszych w pliku tekstowym i przeczytaj je w razie potrzeby (darin)
Edycja 2 : Zaimplementowałem w C # kilka metod podanych tutaj i inną metodę, o której tutaj nie wspomniano. Wszystkie skutecznie znajdują pierwsze n liczb pierwszych (a ja mam przyzwoitą metodę znajdowania granicy, którą należy dostarczyć do sit).