Numeros Primos Um Algoritmo para Geracao Da Sequencia
Numeros Primos Um Algoritmo para Geracao Da Sequencia
Numeros Primos Um Algoritmo para Geracao Da Sequencia
Algoritmos
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.
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: [email protected]). 2 Docente junto ao Centro Federal de Educao Tecnolgica do Paran (CEFET-PR), unidade de Medianeira, Curso Tecnologia em Informtica (email: [email protected]). 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
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
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
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
Algoritmos
25