[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[obm-l] Re: [obm-l] RE: [obm-l] RE: [obm-l] Número Primo



On Wed, Feb 25, 2004 at 01:34:19AM -0300, David wrote:
> 
> >David wrote:
> >> Mas tipo, serah q existe algum algoritmo
> >> q mude o passo da iteracao para pular alguns
> >> numeros durante os testes? Ou eu vo ter q testar
> >> 2,3,4,5,6,7,8,...,sqrt(7919) um-a-um mesmo?
> 
> >	Bem, você não precisa testar todos os números...
> > só os primos menores que sqrt(7919) já são suficientes !
> 
> Entendi... mas como eu sei que um numero menor que sqrt(7919) eh
> primo ou nao pra saber se eu devo testar ele ou nao? Desse jeito
> eu acabo tendo q testar todos os menores q sqrt(7919)..
> 
> Exemplo: eu tenho q testar se ele eh divisivel por 16, pois eu nao vou
> saber se 16 eh primo ou nao antes de testar 16 dividindo 1,2,...,sqrt(16)..
> nesse caso seria melhor testar logo de cara se 7919 eh divisivel por 16..
> 
> Bem... em todo caso essa dica do sqrt(7919) ja ajuda *muito*..
> Obrigado. ;)

Depois de testar que 7919 não é múltiplo de 2 nem de 3 basta testar
os números da forma 6n +- 1 (5, 7, 11, 13, 17, 19, 23, 25, ...)
pois os outros claramente não são primos. Note que na pequena lista
acima o primeiro número *não* primo que aparece é 25: quanto mais
você avançar, mais raros vão ficar os primos mas sendo 7919 relativamente
pequeno o desperdício de tempo não será tão grande assim.

Para um número pequeno como 7919 isto talvez seja a melhor
coisa a fazer. Mas dê uma olhada também no meu livro com o Gugu
(Primos de Mersenne e..., está na minha home page e você também pode
encomendar do Impa; a minha home page aparece no rodapé de todas as mensagens)
e no trabalho do Agrawal e os alunos indianos dele que provaram
que existe um algoritmo surpreendentemente simples que verifica
em tempo polinomial no número de algarismos se um inteiro é primo ou não:
procure por Agrawal PRIMES no google para ver um monte de coisa.
Alguns links:
http://crypto.cs.mcgill.ca/~stiglic/PRIMES_P_FAQ.html
http://www.cse.iitk.ac.uk/news/primality.html

Um assunto importante e simples são os testes de primalidade baseados
no pequeno teorema de Fermat. No seu caso você calcularia 2^7918 mod 7919
(esta conta é bem mais fácil de fazer do que pode parecer a primeira vista):
se der qualquer coisa diferente de 1 o número é composto (sabemos disso
mesmo *sem* sabermos fatorar o número!) e se der 1 o número é *quase*
certamente primo. Se der 1 mas você ainda estiver desconfiado você pode
tentar 3^7918 mod 7919. Se você precisar ter *certeza* de que o número
é primo é que dá um pouco mais de trabalho.

Alguém mencionou a função isprime() do matlab. Eu não estou familiarizado
com o matlab, mas para números maiores do que 7919 eu recomendaria verificar
as instruções com cuidado se você precisar ter certeza se o número é primo.
No Maple 9 a função isprime() só diz que o número é quase-certamente-primo:


Description
- The function isprime is a probabilistic primality testing routine.

- It returns false if n is shown to be composite within one strong
  pseudo-primality test and one Lucas test and returns true otherwise. If
  isprime returns true, n is ``very probably'' prime - see Knuth ``The art of
  computer programming'', Vol 2, 2nd edition, Section 4.5.4, Algorithm P for a
  reference and H. Riesel, ``Prime numbers and computer methods for
  factorization''. No counter example is known and it has been conjectured
  that such a counter example must be hundreds of digits long.


Provavelmente dentro de pouco tempo estes programas implementarão o
algoritmo de Agrawal (ou equivalente) mas parece que ainda não.

[]s, N.
=========================================================================
Instruções para entrar na lista, sair da lista e usar a lista em
http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
=========================================================================