Opa, mais respostas, legal!
Então, eu andei vendo uns outros códigos de cálculo de números primos e achei esse daqui, que foi escrito em Python. Eu achei ele no http://www.pythonbrasil.com.br/moin.cgi/DeterminandoPrimos
No artigo, o autor vai analisando diversos algoritmos e mostrando formas de melhorá-lo. O último (e melhor) é:
**Obs: Isso é Python**
from math import sqrt
print "Primos: 2",
primos, limite = [2,], 100
for numero in xrange(3,limite+1,2): #pula de dois em dois
ehprimo = 1
for i in primos:
if numero % i == 0:
ehprimo = 0
break
if i > sqrt(numero):
break
if (ehprimo):
primos.append(numero)
print numero,
Esse algoritmo é muito rápido. Não tem nem comparação com o primeiro. Eu fiz umas medições e ele calcula os números primos até 300.000 em 17 segundos. Usando esse algoritmo do meu primeiro post, eu fiz o cálculo de 300.000 em 3 minutos e 3 segundos.
Acho que há muito da questão de linguagem interpretada e linguagem compilada, certo? Eu não sei dizer de que maneira isso afeta, mas eu sei que afeta. Com o que o tiagoboy falou, o código já fica bem mais rápido.[quote]Obs: Isso é Java
for (int j = 2; j < i / 2; j++)[/quote]
Com números primos até 150.000, o python faz em 10 segundos e o java em 25 segundos.
Uma coisa que eu notei é que o código em Python imprime todos os números na mesma velocidade. Já o código em Java começa imprimindo rápido e depois dá uma diminuída na velocidade e meio que mantém um pouco mais lento. Por que será que isso acontece?
Acontece que o algoritmo é diferente e é normal que haja diferença no tempo de execução. Então eu queria saber como ficaria esse algoritmo em Python escrito em Java.
Uma implementação que o autor faz é nessa linha: [quote]for numero in xrange(3,limite+1,2): #pula de dois em dois[/quote] A explicação: [quote]Há uma outra otimização faltando que diminui o número de testes, que é fazer o laço externo contando apenas os números ímpares (ou seja, começando de um número ímpar, contando de dois em dois). [/quote]
E eu gostaria de saber: primeiro, se dá para fazer isso em Java (pular de dois em dois) e a explicação matemática para isso, ou seja, porque só é preciso testar em número ímpares?
Legal que as pessoas tão respondendo ao meu tópico! Achei que seria interessante uma análise coletiva de algum código. Esse algoritmo de números primos é muito legal de estudar!
[]'s,
Tork