Você está na página 1de 12

Uma anlise comparativa entre os testes de primalidade AKS e Miller-Rabin

Fernando de Farias
Universidade Catlica de Braslia
Curso de Matemtica
Orientador: Jos Eduardo Castilho

RESUMO
Os algoritmos para determinao de primalidade so classificados em duas classes de mtodos: os determinsticos e
os probabilsticos. Em geral, os algoritmos probabilsticos so de tempo polinomial enquanto que os determinsticos
so de tempo exponencial. O AKS o primeiro algoritmo determinstico a executar este teste em tempo polinomial.
Este trabalho faz uma anlise entre o mtodo AKS e o mtodo Miller-Rabin, que um dos mtodos probabilsticos
mais utilizados. Para isto, foi feita implementao na linguagem do Maple para a anlise da comparao do
desempenho de cada algoritmo.
Palavras-chave: primalidade, nmeros primos.

1. INTRODUO

Comprovar a primalidade de um nmero natural significa comprovar que este nmero s admite
como divisores positivos ele prprio e o nmero um. Os nmeros que no so primos so
conhecidos como nmeros compostos. Todo nmero composto pode ser escrito de forma nica
(a menos da ordem dos fatores) como o produto finito de nmeros primos. Com isto pode-se
dizer que os nmeros primos formam uma base para a construo dos nmeros inteiros. Este fato
justifica o porqu dos nmeros primos serem objeto de estudo desde a antigidade at os tempos
atuais. Testar a primalidade com nmeros pequenos, at que a tarefa no das mais complicadas,
mas medida que os nmeros se tornam maiores, a comprovao da primalidade tornar-se muito
problemtica. Isto se deve ao fato de no se conhecer um procedimento de gerao de nmeros
primos.
A importncia dos testes de primalidade se deve principalmente aos sistemas de criptografia,
onde existe uma necessidade de gerar nmeros primos com ordem de grandeza acima de 100
dgitos, que vital para a segurana dos criptosistemas. Os primeiros algoritmos criados para
testar a primalidade de um nmero remontam Grcia antiga. At 2002, os principais algoritmos
desenvolvidos eram enquadrados em duas grandes classes. (BRAGA, 2002):

De tempo no-polinomial e determinsticos: Afirmam com 100% de certeza a


primalidade de um nmero, mas o clculo realizado em tempo exponencial.
Exemplos: Crivo de Eratstenes e Adleman- Rumely, que apresentam tempo de
O (log log log n )
execuo da ordem de log(n )
.
De tempo polinomial, mas no-determinsticos: A complexidade do algoritmo
em funo de um polinmio. O tempo de clculo no 'explode' quando o nmero
testado muito grande, mas no do certeza absoluta quanto primalidade.
Exemplos: Teste de MILLER-RABIN.

Entretanto no final de 2002, um professor indiano, Manindra Agrawal, e seus dois alunos, Neeraj
Kayal e Nitin Saxena, descobriram um algoritmo que est sendo chamado de AKS (iniciais de
seus nomes), que permite verificar, sem margem de erro, se um inteiro positivo ou no primo,
em tempo polinomial.
Neste trabalho se faz uma anlise dos testes probabilsticos e os determinsticos, onde so
abordados dois testes para anlise comparativa: o Testes de Miller-Rabin, que um teste
probabilstico pertencente a famlia Teste de Monte Carlo, com margem de erro muito pequena,
da ordem de 10 24 , e o Teste do AKS, que determinstico e de tempo polinomial. Os
algoritmos tm como fundamentao terica o Pequeno Teorema de Fermat, o qual ser
apresentado na prxima seo.

2. PEQUENO TEOREMA DE FERMAT

Vrios algoritmos eficientes de teste de primalidade sejam determinsticos ou probabilsticos se


baseiam no Pequeno Teorema de Fermat (PTF):
Teorema 2.1 Se p um primo e se no divide o inteiro a ( p /| a) , ento:
p primo

Demonstrao:

p 1

1 (mod p )

Considere os p 1 primeiros mltiplos positivos de a , isto , os inteiros:


a, 2a, 3a, ..., ( p 1)a

Nenhum desses inteiros congruente a 0 (mod p ) , alm disso, dois quaisquer deles so
incongruentes (mod p ) , pois, se fossem:
ra sa (mod p ), 1 r < s p 1
Ento, o fator comum a poderia ser cancelado, porque o mdc (a, p ) = 1 , e teramos:
r s (mod p ) o que impossvel, visto que 0 < s r < p.
Assim sendo, cada um dos inteiros a, 2a, 3a, ..., ( p 1)a congruente (mod p ) a um nico dos
inteiros 1, 2, 3, ..., p 1 , considerados uma certa ordem, e por conseguinte multiplicando
ordenadamente todas essas p 1 congruncias por a , teremos:
a 2a 3a ..., ( p 1)a 1 2 3 ...( p 1) (mod p )
ou seja:
a p 1 ( p 1) ! ( p 1) ! (mod p )

Como p primo e p no divide ( p 1) !, podemos cancelar o fator comum ( p 1) !, o que d a


congruncia de Fermat:
a p 1 1 (mod p )

Os nmeros que satisfazem o PTF so chamados de provveis primos. O termo provveis se deve
ao fato de que o PTF no garante a volta. Para cada valor de a existe uma infinidade de no
primos que satisfaz esse teste os quais so chamados de pseudoprimos ou falsos primos. Como
exemplo tem-se o nmero de Carmichael, p = 1001152801 , que satisfaz o PTF, mas um nmero
composto, pois este pode ser expresso como p = 11 41 61 151 241 .

3. ALGORITMO AKS

O algoritmo AKS ganhou destaque por ser o primeiro algoritmo publicado que
simultaneamente polinomial, determinstico, e incondicional. O que isto significa, o tempo
mximo de processamento do algoritmo pode ser expresso como um polinmio em relao ao
nmero de dgitos do nmero analisado. Isto permite classificar o nmero informado como primo
ou composto ao invs de retornar um resultado probabilstico. O ponto chave do algoritmo tem
como base o seguinte Teorema:
Teorema 3.1 Suponha que a Z *p . Ento p > 1 primo se:
( x + a) p x p + a (mod p ).
Demonstrao: Pelo Teorema Binomial de Newton, temos que:
p
p
( x + a ) p = x p j a j ,
j =0 j

p
Mas nos casos em que j diferente de 1 e p , o coeficiente binomial divisvel por p , logo
j
todos os termos intermedirios desta expanso so divisveis por p , ou seja, so concruentes a
zero modulo p .
Assim
( x + a ) p x p + a p x p + a (mod p ).

Onde na ltima congruncia devida ao PTF. Desta forma obtm-se o seguinte critrio de
primalidade
p primo ( x + a ) p x p + a (mod p ), para todo a < p

O conceito bsico do algoritmo AKS a congruncia do Teorema 3.1. Analisando a expanso


p
p
binomial inteira de ( x + a ) , ou seja, os temos com j 1 e p ,pode-se determinar se p
j
primo, pois caso todos os termos da expanso com j = 1,... p 1 forem divisveis por p , ento p
seria primo, caso contrrio teramos p composto. Pode-se verificar esta propriedade no
Triangulo de Pascal, onde cada linha representa os coeficientes da expanso binomial.

Triangulo de Pascal
0:

1:

2:

3:

4:

5:

10

10

6:

15

20

15

7:

21

35

35

21

8:

28

56

70

56

28

9:

36

84

126

126

84

36

10:

10

45

120

210

252

210

120

45

10

Para p muito grande este tipo de teste impraticvel e o AKS implementa o teste, descrito a
seguir. A idia do AKS tornar o teste binomial rpido e ainda ser capaz de provar que o teste
responde corretamente mesmo quando p composto. Ao invs de trabalharmos com mdulo p ,
trabalhamos com mdulo um polinmio x r 1 (onde r um primo razoavelmente pequeno). Ou
p
p
seja, no lugar de calcular ( x + a ) , calcula-se o resto da diviso de ( x + a ) por x r 1 , que
feito usando o mesmo mtodo em lgebra para dividir um polinmio por outro. Dessa maneira,
p
teremos no mximo r 1 termos para examinar, enquanto que na expanso de ( x + a ) temos
p 1 .
Desta forma, o AKS considera a seguinte congruncia:

(x + a ) p (x p + a ) (mod( x r 1, p)) ,

(3.1)

onde (mod( x r 1, p ) ) representa aplicar (mod x r 1) e ao resultado aplicar (mod p ) . Como a


congruncia original satisfeita sempre que p primo, ento tem-se que a congruncia (3.1)
tambm satisfeita quando p primo. A justificativa que quando duas expresses so iguais,

apresentam o mesmo resto quando se divide essas duas expresses por x r 1 . O que no bvio
que a nova congruncia sempre falsa quando n composto, pois mesmo quando

(x a )n / (x n a ) (mod n )
possvel que dois diferentes polinmios tenham o mesmo resto quando divididos por x r 1 O
que o AKS mostra que se p composto, e se for escolhido o valor de r , que satisfaz as
condies
(3.2)
q > 2 r log p e p (r 1) / q / 1(mod r ) ,
onde q o maior fator primo de r 1 . Desta forma basta testar apenas um nmero pequeno de
a at encontrarmos um tal que
(x a ) p / x p a mod x r 1, p .

Uma vez que se encontra um valor de a que satisfaz a relao acima, prova-se que p
composto. O valor de a deve estar no intervalo entre 1 e 2 r log p , (BRAGA, 2002).

Algoritmo AKS
1. Entrada p > 1
2. Se p = a b com b > 1 , retorna COMPOSTO
3. r 2
4. Enquanto (r < p ) {
5. Se mdc (r , p ) 1 , retorna COMPOSTO
6. Se r primo{
7.
Encontre q o maior divisor primo de r 1

Se q > 2 r log p e p (r 1) / q / 1(mod r ) vai para 10.}


8.
9. r r + 1 }
10. Para a = 1 at 2 r log p faa
11. Se (x + a ) / x p + a (mod x r 1, p ) retoma COMPOSTO
12. retorna PRIMO
p

Os passos do algoritmo, numerados de um a nove, usam alguns conceitos algbricos que


descartam valores que no influenciam na determinao da primalidade. No passo dois verificase, se n uma potncia de um nmero inteiro. Isto feito por um algoritmo em tempo polinomial.
Nos passos de trs a nove procura-se os valores de r e q que satisfaam as condies (3.2). Nos
passos dez e onze verifica-se a existncia de um valor de a que no satisfaa a condio (3.1),
retornando que o nmero composto. Caso contrrio tem-se que o nmero p primo.

4. TESTE DE MILLER-RABIN
Com teste de Miller-Rabin inaugurou a classe de testes probabilsticos chamada de Testes de
Monte Carlo. Estes testes so usados largamente na maioria das funes de teste de primalidade
presentes nos softwares matemticos, dada a sua velocidade e o grau de confiabilidade. De fato,
o esse algoritmo no verifica a primalidade de um nmero, a nica coisa que ele detecta com
segurana se o nmero composto. (COUTINHO, 2003). Ele faz um teste, que verifica se o
nmero composto. Caso o teste seja falho existe a probabilidade de 75% do nmero ser primo.
Aplica-se novamente o teste e se este for falho a probabilidade do nmero ser primo passa a ser
93%. (MARTINEZ e CAMPOS, 2004). O procedimento pode ser repetido e na quinta iterao
tem-se uma probabilidade aproximada de 99.9% do nmero ser primo. Se o nmero passar no
teste, ele composto. importante dizer que o teste Miller-Rabin, como s vezes tambm
chamado, no d indcios sobre a fatorao prima do nmero n. O algoritmo tem como base o
resultado do seguinte teorema:
Teorema 4.1 Seja p mpar e p 1 = 2 k q com q mpar e k 1 . Se p primo e a Z *p , ento
a q 1(mod n ) ou existe um i {0,1,..., k 1} tal que

a 2 q 1(mod p )
i

Demonstrao: Consideremos a seguinte seqncia de potencias mdulo p :

a q , a 2 q ,..., a 2

k 1

, a2

Se p for um nmero primo, ento pelo menos uma destas potncias tem que ser congruente a 1
modulo p , pois, pelo (Teorema 2.1), temos
a2

= a p 1 1(mod p ) .

2 q
Seja i 1 o menor expoente tal que a 1(mod p ) . Podemos escrever
i

) ( + 1).
1) ou p | (a
+ 1). Sendo i o menor
Como p primo e p | (a 1) , ento ou p | (a
1) no divisvel por p . Segue que
expoente tal que (a 1) divisvel por p , ento (a
+ 1), isto , a 1 1 (mod p ) .
p divide (a
a2 q 1 = a2
i

i 1

1 a2

2i 1 q

2i q

2i q

i 1

2i 1 q

2i 1 q

2i q

2i 1 q

Concludo que se p primo, ento uma das potncias da seqncia dada tem que ser congruente
a 1(mod p ) quando i 1 . Agora, se i = 0 ento a q 1(mod p ) e a esta congruncia no
podemos aplicar o produto notvel, pois q mpar.

Portanto, se p primo, ento uma das potncias da seqncia congruente a 1 mdulo p ou

a q 1(mod p )
Se os primos se destinarem para o uso "industrial" (por exemplo, para a encriptao RSA),
geralmente no necessrio provar sua primalidade. suficiente saber que a probabilidade do
nmero ser composto menor do que 10 24 %. Neste caso, podem-se utilizar os testes (fortes) de
primalidade provvel.
Algoritmo Miller-Rabin
1. escolha a {1,..., p 1} aleatrio

2. escreva p 1 = 2 t q, q mpar
3. calcule sucessivamente a0 = a q (mod p ), a1 = a02 (mod p ),...a k = a k21 (mod p ) at que

k = t ou a k 1(mod p )
4. se k = t e a k / 1(mod p ) retorne COMPOSTO
5.
seno k = 0 ento retorne PRIMO
6.
seno a k 1 / 1(mod p ) ento retorne COMPOSTO
7.
seno retorne PRIMO

5. ANLISE COMPARATIVA
Nesta seo faz-se um teste comparativo entre os algoritmos AKS e Miller-Rabin. O objetivo
comparar a eficincia no contexto computacional. Para isto, implementou-se os algoritmos,
usando o Maple com o pacote numtheory . Os cdigos e detalhes da implementao, so
apresentados em anexo. Os testes foram realizados num computador: Pentium 4 CPU 3.00 GHz,
512 MB de RAM.
TABELA 1: Analise comparativa
Tempo
Nmeros
1001152801
1000151
4339
155121545123548965423579
514269624785214512122156
706197

AKS
0.734 s
4700 s
ran out of memory
3.891 s

RABIN
0s
0.47 s

0.781 s

0.31 s

0.078

O primeiro nmero testado foi um pseudo primo, o AKS levou 0.734 para testar o nmero, o
RABIN com a probabilidade mais de 99,9% levou 0 segundos fazer a observao de que este
zero significa tempo menor que 0.001 comparando com o tempo do AKS, ambos verificam que o
nmero no primo.
Segundo um primos de 7 dgitos, AKS levou 4700 s em mdia para retornar que no havia
memria suficiente para verificar sua primalidade enquanto o RABIN levou 0.47 segundos com
a probabilidade de 99,9% de esse nmero ser primo.
O terceiro exemplo um nmero primo, para o qual o AKS levou 3.891 segundos. Neste caso o
valor de r igual ao valor de p .
O quarto nmero composto, AKS levou 0.781 segundos para retornar que o nmero era
composto e RABIN levou 0.31 segundos com a probabilidade desse nmero ser primo de menos
0.001%.
O teste de Miller-Rabin, aplicado ao nmero 45127, d como verdadeiro que este seja primo. No
entanto a implementao do mtodo AKS, apresentada neste trabalho, no conseguiu fazer a
verificao aps 10 horas de processamento. Isto se deve a forma como o passo 11 do algoritmo
foi implementado.
A limitao de memria tem ocorrido no passo 11 do algoritmo. Este passo tem sido um
limitante na implementao apresentada. Neste aspecto, o Rabin tem sido mais eficiente. Foi
testado o primo de 80 dgitos, apresentado abaixo, e o Rabin respondeu como sendo primo, num
tempo de 0.52s, enquanto o AKS j est dando limitao de memria para primos com 7 dgitos.
Primo de 80 dgitos:
10011528011151515151234511521212158784512154155512121548789555895515121261321153

6. CONCLUSO
Em todos os casos testados verificou-se a eficincia na questo tempo de processamento e
memria no algoritmo do Miller-Rabin superior ao algoritmo do AKS. Na implementao do
algoritmo AKS o passo 11 calcula duplo mdulo entre polinmios de grau p e r . Esta diviso
polinomial foi implementada com o uso do comando rem do pacote numtheory do Maple, A
implementao eficiente deste passo tem sido um desafio aos programadores. (SANTOS e
ENOQUE). Apesar do nmero de operaes ser de tempo polinomial, este tem sido o passo
significativo no clculo do tempo total de execuo. Crandall e Papadopoulos (2003) sugerem
uma nova implementao para este passo que deve melhorar a desempenho do algoritmo, mas
que no pode ser testada neste trabalho, por exigir uma linguagem de programao de baixo
nvel. Outro fator que deve melhorar a performance do algoritmo se fazer uma
implementao num ambiente de clculo, que no seja simblico. O AKS tem sua relevncia do
ponto de vista matemtico, mas em termos prticos o Rabin tem-se mostrado mais eficiente.

REFERNCIAS BIBLIOGRFICAS
BRAGA, da R. B, Algoritmo AKS primalidade de um numero em tempo polinomial, UFRJ artigo de concluso
de curso, 11 de setembro, 2002.
COUTINHO, S. C. Uma introduo ao algoritmo AKS, Coleo Iniciao cientifica, Sociedade brasileira de
matemtica. 2003
CRANDALL, R. e PAPADOPOULOS, J. On the implementation of AKS-class primality test, Advanced
Computation Group. Apple Computer e University of Maryland College Park. 2003
MARTINEZ, E. B. F e CAMPOS, M. T, Algoritmo AKS para verificao de primalidade em tempo polinomial,
2004, < http://www.cic.unb.br/~pedro/trabs/primal.htm >, Acesso em 28/08/2007.
SANTOS, P. NETO, R. X. e ENOQUE T. Uma tentativa de implementao do algoritmo de primalidade AKS.
2002, Disponvel em <http://www.cic.unb.br/~pedro/trabs/primal.htm> , Acesso em 10/11/2007.

Fernando de Farias Nunes (fernandofnunes@hotmail.com)


Curso de Matemtica, Universidade Catlica de Braslia
EPCT QS 07 Lote 01 guas Claras Taguatinga CEP.: 72966-700

ANEXOS.
A1: Algoritmo AKS.
Esta implementao tem como base o cdigo apresentado por Braga (2004). A implementao
original faz uso a funo isprime, que um procedimento probabilstico. Isto influencia nos
resultados de eficincia do algoritmo. Desta forma optou-se por substituir a funo isprime pelo
Crivo de Erastteles. Deve-se observar que nesta fase do algoritmo, o nmero r , que deve ser
testado pelo Crivo, bem pequeno com relao ao nmero p .
# Procedimento AKS
aks := proc (n)
local r, fs, q, a;
if (NisAB(n)) then RETURN(false) fi;
r := 2;
while r < n do
if igcd(n, r) <> 1 then RETURN(false); fi; # n is composite
if crivo(r) then
if r = 2 then q := 2; else fs := factorset(r-1); q := fs[-1]; fi;
if q >= simplify(4.0*sqrt(r)*log(n)) and (n^((r-1)/q) mod r) <> 1 then
break;
fi;
fi;
if r > 2 then r := r + 2; else r:=r+1; end if;
# print(`Valor de r = `,r);
od;
print("Valor de r = ",r);
for a from 1 to simplify(2.0*sqrt(r)*log(n)) do
if ((rem((x-a)^n, x^r-1, x) mod n)<>(rem(x^n-a, x^r-1, x) mod n)) then
RETURN(false); # n is composite
fi;
od;
RETURN(true); # n is prime
end:
# Funo que checa se n = a^b
NisAb := proc(n)
local b, ret, lim;
ret:=false;
lim:= trunc(evalf((log(n))/log(2)));
for b from 2 to lim while (not ret) do
if type(eval(exp(log(n)/b)),integer) then
if type(eval(root(n,b)),integer) then ret := true end if;

10

fi;
od;
return(ret);
end:
# Crivo de Erastteles
crivo:=proc(n::integer)
local k;
k:=3;
while (k < sqrt(n*1.0)) do
if n mod k = 0 then return false; end if;
k:=k+2;
end do;
return true;
end:

A2: Algoritmo Miller-Rabin.

# Teste de Miller-Rabim
MRtest := proc (N::integer,t::integer)
local a,d,e,j,k,s,u,f,found,randomelement;
randomelement := rand(2..N-1);
for s from 1 to t do
a := randomelement();
if N mod a = 0 then
return(false) fi;
d := igcd(a,N);
if d>1 then
return(false) fi;
e := a&^(N-1) mod N;
if not (e=1) then
return(false) fi;
# print(`Iniciando o teste de Miller-Rabin`);
u := N-1;
k := 0;
while (u mod 2 = 0) do
u := u/2;
k := k+1;
od;
f := a &^u mod N;
# print(f);
if (f=-1 mod N) or (f=1 mod N) then break fi;

11

found := false;
for j from 1 to k do
f := f &^2 mod N;
# print(f);
if f=-1 mod N then found := true; break fi;
od;
if found then break else
return(false)
fi;
od;
print(`Teste MR`,t,`vezes aplicado:`,N,` supostamente primo`);
return(true);
end:

12