Qual é a maneira mais elegante de implementar esta função:
ArrayList generatePrimes(int n)
Esta função gera os primeiros n
primos (editar: onde n>1
), então generatePrimes(5)
retornará um ArrayList
com {2, 3, 5, 7, 11}
. (Estou fazendo isso em C #, mas estou feliz com uma implementação Java - ou qualquer outra linguagem semelhante para esse assunto (portanto, não Haskell)).
Eu sei como escrever essa função, mas quando eu fiz isso na noite passada, ela não acabou tão legal quanto eu esperava. Aqui está o que eu descobri:
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;
}
Não estou muito preocupado com a velocidade, embora não queira que seja obviamente ineficiente. Não me importo com qual método é usado (ingênuo ou crivo ou qualquer outra coisa), mas eu quero que seja bastante curto e óbvio como funciona.
Edit : Obrigado a todos que responderam, embora muitos não tenham respondido minha pergunta real. Para reiterar, eu queria um código limpo e agradável que gerasse uma lista de números primos. Já sei como fazer isso de várias maneiras diferentes, mas estou propenso a escrever códigos que não são tão claros quanto poderiam ser. Neste tópico, algumas boas opções foram propostas:
- Uma versão melhor do que eu tinha originalmente (Peter Smit, jmservera e Rekreativc)
- Uma implementação muito limpa da peneira de Eratóstenes (azul da estrela)
- Use Java's
BigInteger
enextProbablePrime
para código muito simples, embora eu não possa imaginar que seja particularmente eficiente (dfa) - Use o LINQ para gerar preguiçosamente a lista de primos (Maghis)
- Coloque muitos números primos em um arquivo de texto e leia-os quando necessário (darin)
Edição 2 : implementei em C # alguns dos métodos fornecidos aqui e outro método não mencionado aqui. Todos eles encontram os primeiros n primos de forma eficaz (e eu tenho um método decente de encontrar o limite para fornecer às peneiras).