Qual è il modo più elegante per implementare questa funzione:
ArrayList generatePrimes(int n)
Questa funzione genera i primi n
numeri primi (modifica: dove n>1
), quindi generatePrimes(5)
restituirà un ArrayList
con {2, 3, 5, 7, 11}
. (Lo sto facendo in C #, ma sono soddisfatto di un'implementazione Java o di qualsiasi altro linguaggio simile (quindi non Haskell)).
So come scrivere questa funzione, ma quando l'ho fatta ieri sera non è andata così bene come speravo. Ecco cosa mi è venuto in mente:
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;
}
Non sono troppo preoccupato per la velocità, anche se non voglio che sia ovviamente inefficiente. Non mi importa quale metodo viene utilizzato (ingenuo o setaccio o qualsiasi altra cosa), ma voglio che sia abbastanza breve e ovvio come funziona.
Modifica : grazie a tutti coloro che hanno risposto, anche se molti non hanno risposto alla mia vera domanda. Per ribadire, volevo un bel pezzo di codice pulito che generasse un elenco di numeri primi. So già come farlo in molti modi diversi, ma sono incline a scrivere codice che non è così chiaro come potrebbe essere. In questo thread sono state proposte alcune buone opzioni:
- Una versione migliore di quello che avevo originariamente (Peter Smit, jmservera e Rekreativc)
- Un'implementazione molto pulita del setaccio di Eratostene (starblue)
- Usa Java
BigInteger
enextProbablePrime
per codice molto semplice, anche se non riesco a immaginare che sia particolarmente efficiente (dfa) - Usa LINQ per generare pigramente l'elenco dei numeri primi (Maghis)
- Metti molti numeri primi in un file di testo e leggili quando necessario (tesoro)
Modifica 2 : ho implementato in C # un paio dei metodi forniti qui e un altro metodo non menzionato qui. Tutti trovano efficacemente i primi n primi (e ho un metodo decente per trovare il limite da fornire ai setacci).