Quelle est la manière la plus élégante d'implémenter cette fonction ?
ArrayList generatePrimes(int n)
Cette fonction génère le premier n
primes (modifier : où n>1
), donc generatePrimes(5)
retournera un ArrayList
con {2, 3, 5, 7, 11}
. (Je fais ceci en C#, mais je suis heureux avec une implémentation Java - ou tout autre langage similaire (donc pas Haskell)).
Je sais comment écrire cette fonction, mais quand je l'ai fait hier soir, le résultat n'était pas aussi bon que je l'espérais. Voici ce que j'ai obtenu :
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;
}
Je ne suis pas trop préoccupé par la vitesse, même si je ne veux pas qu'il soit manifestement inefficace. Peu importe la méthode utilisée (naïve, tamis ou autre), mais je veux qu'elle soit assez courte et que son fonctionnement soit évident.
Editar : Merci à tous ceux qui ont répondu, même si beaucoup n'ont pas répondu à ma question. Pour réitérer, je voulais un morceau de code propre qui génère une liste de nombres premiers. Je sais déjà comment le faire de plusieurs façons différentes, mais j'ai tendance à écrire du code qui n'est pas aussi clair qu'il pourrait l'être. Dans ce fil de discussion, quelques bonnes options ont été proposées :
- Une version plus agréable de ce que j'avais à l'origine (Peter Smit, jmservera et Rekreativc)
- Une mise en œuvre très propre du tamis d'Eratosthène (starblue)
- Utilisez la fonction
BigInteger
etnextProbablePrime
pour un code très simple, bien que je ne puisse pas imaginer qu'il soit particulièrement efficace (dfa) - Utiliser LINQ pour générer paresseusement la liste des nombres premiers (Maghis)
- Mettre beaucoup de nombres premiers dans un fichier texte et les lire quand c'est nécessaire (darin)
Edit 2 : J'ai implémenté en C# deux des méthodes données ici, et une autre méthode non mentionnée ici. Elles trouvent toutes la première n efficacement (et j'ai un méthode décente de trouver la limite à fournir aux tamis).
12 votes
Non, et ce n'est pas non plus pour le projet Euler :-)
1 votes
Il vaudrait mieux que je reprenne ienumerable<int> et que j'obtienne un par un
4 votes
Ce que je voudrais savoir, c'est ce qu'est la moins une manière élégante de générer des nombres premiers. Je pense à quelque chose impliquant une base de données Access ?
1 votes
À titre de comparaison, un Code Haskell 2008 par BMeph :
nubBy (((>1).).gcd) [2..]
. Il ne laisse que les non-duplicata parmi les nombres naturels, à partir de 2, tout en considérant comme duplicata tout nombre dont legcd
avec l'un des nombres trouvés précédemment est supérieure à 1. C'est très inefficace, quadratique en nombre de nombres premiers produits. Mais il est élégant .0 votes
Le plus élégant de Haskell.
import Data.List.Ordered ; let { _Y g = g (_Y g) ; primes = 2 : _Y( (3:) . minus [5,7..] . unionAll . map (\p-> [p*p, p*p+p*2..]) ) }
mais c'est bien sûr entièrement basé sur l'opinion .0 votes
Quel genre de nombres premiers cherchez-vous ? Quels tests doivent-ils passer ?