Cuál es la forma más elegante de implementar esta función:
ArrayList generatePrimes(int n)
Esta función genera los primeros n
números primos (editar: donde n>1
), por generatePrimes(5)
lo que devolverá un ArrayList
con {2, 3, 5, 7, 11}
. (Estoy haciendo esto en C #, pero estoy contento con una implementación de Java, o cualquier otro lenguaje similar para el caso (así que no Haskell)).
Sé cómo escribir esta función, pero cuando lo hice anoche no terminó tan bien como esperaba. Esto es lo que se me ocurrió:
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;
}
No me preocupa demasiado la velocidad, aunque no quiero que sea obviamente ineficiente. No me importa qué método se use (ingenuo o tamiz o cualquier otra cosa), pero quiero que sea bastante breve y obvio cómo funciona.
Editar : Gracias a todos los que han respondido, aunque muchos no respondieron mi pregunta real. Para reiterar, quería un buen código limpio que generara una lista de números primos. Ya sé cómo hacerlo de diferentes maneras, pero soy propenso a escribir código que no es tan claro como podría ser. En este hilo se han propuesto algunas buenas opciones:
- Una versión más bonita de lo que tenía originalmente (Peter Smit, jmservera y Rekreativc)
- Una implementación muy limpia del tamiz de Eratosthenes (starblue)
- Use Java's
BigInteger
synextProbablePrime
para un código muy simple, aunque no puedo imaginar que sea particularmente eficiente (dfa) - Utilice LINQ para generar perezosamente la lista de números primos (Maghis)
- Coloque muchos números primos en un archivo de texto y léalos cuando sea necesario (darin)
Edición 2 : implementé en C # un par de los métodos que se dan aquí y otro método que no se menciona aquí. Todos encuentran los primeros n números primos de manera efectiva (y tengo un método decente para encontrar el límite para proporcionar a los tamices).