Ué, não tem nada demais.
Vc está simplesmente tentando dividir o dado número n por todos os valores
inteiros entre 3 e sqrt(n).

Pq vc pode parar em sqrt(n)? Oras, digamos que n seja divisivel por a, a >
sqrt(n). Então seja b = n / a, que é inteiro.

b = n / a
ab = n
ab = sqrt(n) sqrt(n)

b = sqrt(n) * sqrt(n)/a

Mas a > sqrt(n) ==> sqrt(n)/a < 1

Logo b < sqrt(n).

Conclusão: se n tem um divisor maior que sqrt(n), então ele tem
necessariamente um divisor correspondente, este menor que sqrt(n). Por isso
que vc pode testar só entre 3 e sqrt(n).


Isso dito, esse algoritmo não tem absolutamente nada de especial em questões
de performance. De imediato, vc já pode deixar seu algoritmo 2 vezes mais
rápido: se vc verificar que n é ímpar, vc não precisa mais testar as
divisões por pares.

Veja o artigo sobre "primality test" na wikipedia, tem informações
interessantes. Tem vários algoritmos probabilísticos, em que a resposta é
incerta, mas a incerteza é controlada. Mais interessante, há algorítmos que
se dizem que um número é composto, então ele é certamente composto, mas se
diz que é primo, ele pode ter se enganado. Há algorítmos que se comportam da
maneira oposta (se disse que é primo, então é primo, mas se disser que é
composto, pode ter se enganado).

Esses algoritmos probabilísticos trocam o determinismo por um aumento
violento de performance.

Há também outros algorítmos deterministas muito mais rápidos que o seu, mas
a maior parte depende de hipóteses não provadas em teoria dos números.


Abraço
Bruno

--
Bruno FRANÇA DOS REIS

msn: [email protected]
skype: brunoreis666
tel: +33 (0)6 28 43 42 16

http://brunoreis.com

GPG Key: http://brunoreis.com/bruno-public.key

e^(pi*i)+1=0


2010/1/12 Marcelo Gomes <[email protected]>

> Olá pessoal da lista, boa noite.
>
> Meu grupo de estudo estava tentando montar um algortmo mais enxuto, com uma
> menor carga computacional para se calcular os primos até 12 dígitos.
> Pesquisando na net, vi que existe uma propriedade matemática da raiz
> quadrada dos primos.
>
> Digamos que possua "n" como candidato a primo (n>2) então calculo sua raiz
> quadrada , uso a parte inteira desta raiz e opero as divisões de "n" por
> esta parte inteira e em seguida pala parte inteira menos 1, depois pela
> parte inteira menos 2 sucessivamente até chegar no número 3. Se o resultado
> destas divisões de "n" pela parte inteira da raiz, e seus antecessores
> inteiros até 3 for diferente de Zero, então não preciso calcular os outros
> inteiros pós raiz. Com apenas o primeiro calculo já saberei que o "n" é
> primo.
>
> No algoritmo isto funcionou perfeitamente e o programa ficou bem rápido.
>
> Entretanto, não consegui ver ainda como provar esta propriedade matemática.
> Se alguém tiver um tempinho e puder mostrar isto, seria bem interessante
> para mim.
>
> Desde já agradeço muito a atenção e ajuda,
>
> Abração a todos, Marcelo.
>

Responder a