Algoritmos para calcular números primos
No artigo
329 de Disquisitiones Arithmeticae,
Gauss
(1801), escreveu:
-
" O
problema da distinção de números primos, dos números
compostos e a resolução posterior destes últimos,
nos seus factores primos, é conhecido como um dos mais importantes
e úteis da/na aritmética. Tem inspirado a sabedoria e o trabalho
de anciãos e modernos geometras, a uma extensão tal que eu
seria supérfluo a discutir esse assunto extensivamente …. Mais,
a dignidade da ciência só por si, parece requerer, todos
e quaisquer meios, com vista, a explorar a solução de um
problema tão elegante e tão célebre."
-
Apesar
do que Gauss escreveu, o reconhecimento
da primalidade de um número ou a procura da factorização
de números muito grandes, pode ao início parecer como um
exercício pontual. No entanto é uma sensação
errada. A factorização e a primalidade de um número
têm-se tornado muito importantes na criptografia
da chave pública, e esta representa,
hoje em dia, uma das aplicações mais imediatas da teoria
dos números nas comunicações.
Mais
pode ser dito sobre a factorização. Eis uma transcrição
de uma carta de um famoso teoricista dos números, Brillhart:
-
" É
irrelevante para um teoricista dos números, quem trabalha com exemplos;
sendo a capacidade da factorizar como uma das mais importantes das
técnicas analíticas, porque o segredo do problema passa pela
revelação (e apenas quando) se descobrem os factores primos
dos números em questão, pela sua factorização.
Eu sei que muitas pessoas - de facto a maioria das pessoas - não
se apercebe disso, porque nunca foram confrontados realisticamente com
a necessidade de saber a factorização de alguns números;
mas eu asseguro-vos, que quando precisarem de tal, ficarão completamente
frustados pelo facto de o não conseguirem, porque os números
serão grandes demais para serem factorizados. Não é
uma questão de desporto ou de excentricidade."
-
A primeira
observação no que concerne ao problema de primalidade e factorização
é claro : existe um algoritmo para
cada problema. Por algoritmo, entende-se
um processo envolvendo uma quantidade finita de passos, aplicáveis
a qualquer número N e que nos vão indicar se N é um
número primo, ou, se N é composto, e quais são os
seus factores primos. Nomeadamente, dado um número natural N, tenta-se
sucessivamente cada número n = 2, 3, … até N1/2
(o maior inteiro não superior a N1/2 ),
para se tentar perceber se divide N. Se tal não acontecer N é
um número primo. Se, digamos, N0
dividir N, escreve-se N = N0N1,
com N1 < N, então repete-se
o mesmo processo com N0, e N1.
Eventualmente tal dar-nos-à a factorização completa
de N em números primos.
Note-se
no entanto que para N muito grande, pode ser que este algoritmo seja muito
demorado, na determinação da sua factorização
ou primalidade. Este é o aspecto prático mais importante
da tarefa, de achar um algoritmo eficiente, tal que este contenha tão
poucas operações quantas as possíveis, e que além
disso necessite de menos tempo e menos custo, ao ser realizado.
São
apresentados alguns algoritmos: O Crivo
de
Erastotenes
,
dois
algoritmos
de Lucas, um
algoritmo
de
três matemáticos, Brillhart, Lehmer & Selfridge;
algoritmo de Pepin para determinar a primalidade
dos números de Fermat (Fn),
um algoritmo para determinar
a primalidade dos números de Mersenne (Mn).
[Página
anterior] [Página inicial]
[Próxima página]

Como já
foi analisado anteriormente , é possível saber-se se N é
um número primo utilizando divisões triviais para cada número
n tal que n2 seja menor ou igual a N. Tendo
em conta que a multiplicação é uma operação
mais fácil de realizar do que a divisão, Erastotenes
(no século III a.C.) teve a brilhante ideia de organizar estas maravilhosas
computações, na forma de um bem conhecido crivo. Tal crivo,
serve para determinar todos os números primos, assim como as factorizações
dos números compostos, até um dado número N. Vamos
ilustrar para N= 101.
Algoritmos de Lucas
Este algoritmos
são baseados no Pequeno Teorema
de Fermat (para distinguir do denominado
Grande Teorema de Fermat).Que diz que: Seja
n um número primo então para qualquer número inteiro
a, tem-se que : ap
ºa
(mód.
p)
Algoritmo
de Lucas de 1876:
Seja
N>1. Assuma-se que existe um inteiro a>1 tal que:
1.
aN-1º1
(mód.
N),
2.
am ¹1
(mód.
N), para m =1,2, ..., N - 2.
Então
N é um número primo.
Defeitos
do algoritmo: pode parecer perfeito, mas requer N-2 sucessivas
multiplicações por a, e a busca dos resíduos do módulo
N : Demasiadas operações.
Algoritmo
de Lucas de 1891:
Seja N>1. Assuma-se que existe
um inteiro a>1 tal que:
1. aN-1
º1
(mód.
N).
2. am
¹1
(mód.
N) para cada m<N, tal que m seja divisor de N-1.
Então N é um
número primo.
Defeitos
apresentados por este algoritmo: requer o conhecimento prévio
de todos os factores de N-1, embora seja fácil de aplicar quando
N é da forma N= 2n
+
1 ou quando N=3.2n
+ 1.
[Algoritmo anterior] [Próximo
algoritmo]
[Voltar ao topo]

Algoritmo
de Brillhart, Lehmer & Selfridge
Em 1927, Lehmer tornou o algoritmo
de Lucas datado de 1891 mais prático, mas este foi ainda tornado
mais flexivel por Brillhart, Lehmer & Selfridge em 1975:
Algoritmo
de Brillhart, Lehmer & Selfridge:
Seja N>1. Assuma-se que para
cada factor primo q de N-1 existe um inteiro a = a(q)>1 tal que:
1.
aN-1 º1
(mód.
N).
2.
a(N-1)/q
¹1
(mód.N).
Então N é um
número primo.
Defeitos
do algoritmo: mais uma vez, é necessário conhecer
os factores primos de N-1, mas poucas congruências
têm de satisfeitas.
[Algoritmo anterior] [Próximo
algoritmo]
[Voltar ao topo]

Algoritmo de Pepin para testar
a primalidade dos números de Fermat
Como
os números de Fermat (Fn
= 22^n +1) crescem muito
rapidamente em função de n, torna-se muito laborioso testar
a sua primalidade. No entanto Pepin obteve em 1877 um algoritmo para testa
a primalidade de números de Fermat.
Algoritmo
de Pepin:
Seja
Fn
= 22^n
+1, com n³2,
e k³2. Então as seguintes condições são
equivalentes:
1.
Fn
é um número primo e (k/Fn
) = -1;
2.
k(Fn -1)/2º
-1 (mód. Fn
).
Este
algoritmo é praticamente uma aplicação da fórmula
de Euler para os factores de Fn(Euler
demonstrou que todos os factores de Fn
, com n³2, são da forma k x 2n+2+1 e através
do qual descobriu que 641 divide F5 : F5
= 641 x 6 700 417) . No entanto se Fn
é composto este não nos indica qualquer factor deste.
[Algoritmo anterior]
[Próximo
algoritmo]
[Voltar ao topo]

Algoritmo
para testar a primalidade de números de Mersenne
Os números
da forma Mn
=
2n-1 com n um número primo são chamados
de números de Mersenne,
a sua consideração deriva do estudo de números perfeitos
(um número perfeito, é um número cujo resultado da
soma dos seus divisores naturais é ele mesmo; por exemplo o número
6 tem como divisores 1, 2, 3 e 1+2+3=6, 28 tem como divisores
1, 2, 4, 7, 14 e 1+2+4+7+14=28) efectuado por Marin
Mersenne.
Algoritmo:
Mn
=2n
+
1 é um número primo se e só se Mn
divide
Sn-2, com
(Sk)k³1,
uma
sucessão definida recursivamente por :
S0= 4, Sk+1=Sk2
-2.
[Algoritmo anterior]
[Voltar ao topo]