Вы находитесь на странице: 1из 4

IV Congresso Brasileiro de Computao CBComp 2004

Algoritmos

Nmeros Primos Um Algoritmo para Gerao da Seqncia


Vilson L. Dalle Mole1, Jefferson G. Martins2

Resumo--Este artigo faz uma breve discusso sobre a verificao da primalidade de um dado nmero n pertencente a 3 IN* . Primeiramente discute-se um algoritmo de gerao da seqncia de nmeros primos baseado na verificao da primalidade pela existncia de um divisor maior que um e menor que um nmero n qualquer, atravs da operao mod (resto de diviso). Na seqncia apresentado o algoritmo desenvolvido e sua implementao com base no crivo de Erastothenes. Os resultados apresentados indicam ser este um timo algoritmo dentro de seus objetivos de gerao da seqncia de nmeros primos. Palavras-ChavePrimalidade, Nmeros Primos, Prime.

Figura 1. Exemplo Ilustrativo para o Algoritmo do Quadro I

Dispondo-se os divisores de n seqencialmente e ordem crescente, verifica-se que k o ponto mdio dos divisores de n, sendo k=n=6.
QUADRO I UM ALGORITMO PARA GERAO DA SEQNCIA DE NMEROS PRIMOS

cincia matemtica tem despertado a ateno do ser humano, desde os primrdios da raa humana, seja pela simples necessidade de contabilizar algo ou pela curiosidade de algumas caractersticas um tanto incomuns, dentre as quais est o nmero primo. Embora pesquisas voltadas para a descoberta de novos e maiores nmeros primos no sejam algo recente, elas tm recebido ateno especial da rea computacional, principalmente quando esta se volta para a utilizao de assinaturas digitais e criptografia [2][5]. Pela definio clssica um nmero primo, se e somente se, for divisvel apenas por um e por ele mesmo [1][2][3][4][5][6]. Embora existam outras definies quanto primalidade dos nmeros, tal como primos entre si e primos gmeos etc., a definio anterior foi assumida neste trabalho e, segundo ela, para determinar a seqncia dos nmeros primos, necessrio verificar cada um dos valores pertencentes a IN*, determinando se o mesmo ou no primo, conforme ilustrado no algoritmo do Quadro 1, a seguir. Esta implementao consegue eliminar verificaes redundantes por assumir um valor k (k=n) como limite superior para a busca dos divisores de n. Neste contexto, temse o exemplo a seguir, ilustrado na Figura 1, no qual n=36.

I. CONSIDERAES INICIAIS

1 Docente junto ao Centro Federal de Educao Tecnolgica do Paran (CEFET-PR), unidade de Medianeira, Curso Tecnologia em Informtica (email: vilson@md.cefetpr.br). 2 Docente junto ao Centro Federal de Educao Tecnolgica do Paran (CEFET-PR), unidade de Medianeira, Curso Tecnologia em Informtica (email: jmartins@md.cefetpr.br). 3 Conjunto dos nmeros naturais com excluso do zero

Assim, simples observar a correspondncia entre os divisores e justificar o limite k para a referida busca, pois a cada par (di, dj) de divisores de n tal que di n dj, ao se testar a divisibilidade de n por di encontra-se como quociente dj e vice-versa. Apesar deste algoritmo ser eficaz, ele no eficiente uma vez que varre todo o conjunto dos nmeros naturais realizando testes desnecessrios sobre os nmeros pares, mesmo considerando que a rotina primo( n ) os elimine com apenas um passo, podendo o algoritmo ser melhorado, conforme ilustrado no Quadro 2, a seguir. A nova verso do algoritmo eliminou todos os pares no primos sem a necessidade de operaes computacionais. 22

IV Congresso Brasileiro de Computao CBComp 2004


Considerando o intuito de gerar a seqncia dos nmeros primos at um limite L, pode-se afirmar que o novo algoritmo obtm um ganho significativo em performance em relao ao anterior. Outro ponto importante a considerar est na rotina primo(n). Esta toma o valor de n e procura um divisor entre 3 e n, percorrendo a seqncia de nmeros mpares no intervalo [3, n] at encontrar um divisor ou chegar ao fim da seqncia. Como a rotina retorna ao encontrar o primeiro divisor, parece perfeitamente plausvel dizer que ela trata corretamente todos os casos no incorrendo em testes desnecessrios. No entanto, uma anlise mais apurada revela que, medida que n cresce, o algoritmo passa a fazer clculos desnecessrios o que pode ser observado no exemplo a seguir - Quadro 2.
QUADRO II ALGORITMO MELHORADO

Algoritmos
forma e deve-se poder recuperar seus elementos na mesma ordem em que foram gerados, dando um certo carter estocstico ao algoritmo. Todos esses melhoramentos, no entanto, ainda so insuficientes para tornar o algoritmo eficiente a ponto de poder ser utilizado para gerar a seqncia de nmeros primos de 1 at um limite L grande o bastante, pois o crescimento do nmero de operaes necessrias para a validao/negao de n como primo cresce tambm em funo de n. Abordando este contexto, o presente artigo est estruturado em 4 sees. Inicialmente realizada uma introduo sobre a temtica discutida. A seo II apresenta o Algoritmo implementado, suas vantagens e os fundamentos sobre o qual o mesmo est embasado. Os resultados so discutidos na seo III e na ltima seo (IV) so apresentadas as consideraes finais. II. O ALGORITMO IMPLEMENTADO As origens do algoritmo implementado remontam a 200 AC com o crivo de Erastothenes. Segundo essa metodologia, para encontrar a seqncia dos nmeros primos at um limite L, dispomos todos os nmeros naturais de 1 at L em seqncia e ento, a comear pelo numero 2, descartamos todos os seus mltiplos da seqncia. O primeiro nmero aps o dois que ainda permanecer na seqncia primo, no caso o 3. Repete-se o processo agora com os mltiplos de 3, encontrando-se o nmero primo 5 e assim sucessivamente at atingir o limite L [1][2][3][5]. A Tabela , a seguir, apresenta a aplicao do crivo de Erastothenes.
TABELA I APLICAO DO CRIVO DE ERASTOTHENES

Sendo n=169, seus divisores menores ou iguais a n so 1 3 5 7 9 11 13 Notadamente, o teste do mod para i=9 desnecessrio, pois 9 mltiplo de 3 e 9 < 169, o que suficiente para dispensar o teste, pois, se n (169) for mltiplo de 3, tambm o ser de 9. Assim, conclui-se que necessrio apenas efetuar o teste do resto sobre o conjunto de nmeros primos menores ou iguais n. O ponto central aqui que para dispensar o teste do resto para os mltiplos (tal como o 9, no exemplo anterior), se faz necessrio conhecer a seqncia dos nmeros primos anteriores n. Assim, a seqncia deve ser armazenada de

A metodologia exposta acima, define a seqncia de nmeros primos como sendo o conjunto das lacunas no preenchidas por mltiplos de 2 ou mais. Os mltiplos de 2 compem a seqncia de nmeros pares, no entanto a seqncia de nmeros impares nunca ser completamente preenchida por mltiplos de 3 que seria a primeira lacuna deixada pelos mltiplos de 2 ou por qualquer outra seqncia de mltiplos de primos subsequente. Cada nova lacuna identifica um nmero primo e gera uma nova seqncia de mltiplos. Considerando que o nmero 2 o nico par primo, perfeitamente correto desconsiderar todos os demais nmeros pares, reduzindo assim em 50% as operaes de descartes. A marcao recai apenas sobre os mltiplos em seqncia de cada nmero primo encontrado, essa operao requer apenas operaes de incremento, uma para cada valor descartado. Alm disso, uma anlise mais profunda mostra que a marcao de cada primo inicia sempre a partir de seu quadrado, pois os mltiplos inferiores j foram marcados como mltiplos dos primos inferiores. Como pode ser observado na Tabela , foram necessrios apenas os descartes 23

IV Congresso Brasileiro de Computao CBComp 2004


dos mltiplos de 2 e 3, observando que a marcao a partir do 2 comea no 4 que seu quadrado e a marcao do 3 comea no 9 que tambm seu quadrado. Expandindo essa tabela poder ser visto que a marcao do 5 comear no 25 que corresponde a 52 e assim sucessivamente. O algoritmo implementado faz uso de um vetor de 100.000 booleans onde so feitas as marcaes, considerando-se apenas os nmeros mpares. Um sistema de janela deslizante promove que esse vetor desloca-se pela seqncia dos nmeros naturais, sem limite de valor mximo. Devido s limitaes de memria RAM, foi usado um vetor de 2.000.000 de elementos para armazenar a seqncia dos nmeros primos. Com esse vetor possvel gerar a seqncia at um limite de 1.168.685.946.230.401. A seqncia gerada armazenada em arquivos de texto com 100.000 nmeros primos cada. Tambm foi gerado um arquivo de resultados resumidos para fins de gerao de grficos. III. RESULTADOS OBTIDOS O algoritmo implementado apresentou desempenho surpreendente, encontrando os 100.000 primeiros nmeros primos em 0.530 segundos e os ltimos 100.000, em 6.828 segundos, sendo que o ltimo nmero primo gerado foi 12.942.466.003. A evoluo do tempo computacional medido apenas como funo do tempo relgio, dada pelo grfico da Figura 2. Confrontando com o grfico da Figura 3, a seguir, deduz-se que o tempo inicial mnimo devido grande concentrao de nmero primos no intervalo. No entanto, aps 100.000.000 de nmeros gerados ocorrem poucas oscilaes e acredita-se que estas so conseqncia de a mquina no ter sido dedicada exclusivamente tarefa. A Figura 3 apresenta a curva que representa o percentual de nmeros primos encontrados no conjunto IN*. Essa curva foi gerada a partir da seqncia de primos versus o total de nmeros.
Evoluo do Tempo Computacional
7000 6000 5000 4000 3000 2000 1000 0 0 1000 2000 3000 4000 5000 6000 7000

Algoritmos
conforme grfico da Figura 3. Esta caracterstica j era esperada, uma vez que os nmeros primos podem ser vistos como as lacunas no preenchidas por mltiplos de 2 e seus sucessores primos. Assim, quanto maior a posio do nmero em IN mais distantes esto as lacunas. O tempo relgio total foi de 10h 41min 20seg 712m para a gerao dos 594.500.000 primeiros nmeros primos, tendo o algoritmo sido executado em um microcomputador Pentium IV de 1.5Ghz com 256 MB de Ram/400MHz, SO Windows 2000 Professional e Linguagem JAVA . Embora a base gerada permitisse verificar atravs do algoritmo do Quadro 2 valores maiores que os listados na Tabela 2, o tipo long da linguagem JAVA apresenta limite superior em 263 64bits. Os tempos apresentados na Tabela 2 incluem o tempo necessrio para carregar do disco o conjunto de nmeros primos menores ou iguais raiz quadrada do nmero que est sendo testado.
Percentual de Nmeros Primos
0,080 0,075 0,070 0,065 0,060 0,055 0,050 0,045 0,040 % 0 2 4 6 8 10 12 Bilhes

Figura 3. Disperso dos nmeros primos em % TABELA II TEMPO GASTO PARA VERIFICAR A PRIMALIDADE

Figura 2. Evoluo do Tempo Computacional (relgio)

Uma anlise crtica dos resultados mostrou que a disperso dos nmeros primos aumenta significativamente na seqncia,

A base gerada totaliza 6,57GB de disco e permite aplicar o algoritmo discutido inicialmente neste artigo para nmeros na ordem de 1021. Substituindo o tipo primitivo long por objetos do tipo BigInteger possvel executar o algoritmo do Quadro 24

IV Congresso Brasileiro de Computao CBComp 2004


2 para nmeros dessa ordem. IV. CONSIDERAES FINAIS O estudo relatado neste artigo demonstrou que o algoritmo proposto e implementado se apresenta com timas perspectivas de perfomance. Alm disso, a construo de uma base com a seqncia dos nmeros primos permite validar ou negar um nmero como primo, com baixo custo de tempo computacional, permitindo inclusive a paralelizao dos testes. O algoritmo proposto para gerar a seqncia pode ser facilmente seqencializado em um conjunto de mquinas rodando em paralelo e realizando um trabalho cooperativo de marcao, o que permite incrementar o tamanho da seqncia gerada, ao mesmo tempo em que reduz o tempo total de processamento. Computao paralela distribuda baseada em trabalho cooperativo tambm poderia ser utilizada na validao ou negao de um nmero primo atravs do algoritmo do Quadro 2, podendo dessa forma reduzir de forma incremental o tempo necessrio. V. REFERNCIAS
[1] [2] [3] [4] [5] [6] H. Fonseca, Nmeros Primos, apresentado em Seminrio Temtico, Lisboa, Portual, 2000. Disponvel: http://www.educ.fc.ul.pt/semtem/semtem99/sem24/. J.M. Pollard, Theorems on Factorization and Primality Testing in Proc. 1974 Cambridge Philosophical Society, 76, pp 512-528. O. Smith, (1995) Three Simple Prime Number Generators, Seven Seas Software Inc. Disponvel: http://www.olympus.net/personal/7seas/primes.html. P. Ribenboim, The Little Book of Big Primes, Springer Verlag 1991. R.L. Rivest, Finding Four Million Large Random Primes in Crypto 1990 CRYPTO90, LNCS 537, pp. 625-626. W. J. Ellison, F. Ellison, Prime Numbers. New York: Wiley, 1985.

Algoritmos

25

Вам также может понравиться