Universidade Estadual de Campinas
Instituto de Matem´
atica, Estat´ıstica e Computa¸c˜
ao Cient´ıfica
Departamento de Matem´
atica Aplicada
Disserta¸c˜
ao de Mestrado
TEORIA DOS N ´
UMEROS E O RSA
por
Bianca Amoras de Souza
Mestrado em Matem´
atica Aplicada
Orientador:
Prof. Dr. Jos´
e Pl´ınio de O. Santos
TEORIA DOS N ´UMEROS E O RSA
Este exemplar corresponde `a reda¸c˜ao final da disserta¸c˜ao intitulada “Teoria dos N´umeros e o RSA” devidamente corrigida e defendida por Bianca Amoras de Souza e aprovada pela comiss˜ao julgadora.
Campinas, 15 de agosto de 2004.
Prof. Dr. Jos´e Pl´ınio de O. Santos Orientador
Banca Examinadora:
1. Prof. Dr. Jos´e Pl´ınio de Oliveira Santos
2. Prof. Dr. Emerson Alexandre de Oliveira Lima 3. Profa. Dra. Sueli Rodrigues Costa
Disserta¸c˜ao apresentada ao Instituto de Matem´atica, Estat´ıstica e Computa¸c˜ao Ci-ent´ıfica, UNICAMP, como requisito par-cial para oten¸c˜ao do t´ıtulo de MESTRE em Matem´atica Aplicada.
Campinas, 15 de julho de 2004. Autor: Bianca Amoras de Souza
T´ıtulo: Teoria dos N´umeros e o RSA Departamento: Matem´atica Aplicada
Grau: Mestre em Matem´atica Aplicada Defesa: 06 de agosto de 2004
Sum´
ario
Abstract vii Resumo viii Agradecimentos ix Tabelas de S´ımbolos xi Introdu¸c˜ao 1 1 Criptografia Computacional 41.1 Sistemas Criptogr´aficos . . . 5
1.2 Fun¸c˜oes Unidirecionais . . . 7
1.3 Criptossistemas Sim´etricos e Assim´etricos . . . 8
2 O Sistema de Chave P´ublica RSA 10 2.1 Gera¸c˜ao das Chaves . . . 12
2.2 Codifica¸c˜ao e Decodifica¸c˜ao . . . 13
2.3 Assinatura Digital . . . 14
3 Testes de Primalidade 18
3.1 Distribui¸c˜ao de Primos . . . 20
3.2 Teste de Solovay-Strassen . . . 21
3.3 Teste de Miller-Rabin . . . 26
3.4 Teste de Agrawal-Kayal-Saxena . . . 33
3.4.1 Teoria dos N´umeros . . . 36
3.4.2 Corpos finitos . . . 38 3.4.3 O algoritmo AKS . . . 43 4 Fatora¸c˜ao de Inteiros 53 4.1 Um M´etodo Simples . . . 54 4.2 M´etodo de Fermat . . . 55 4.3 ρ-M´etodo de Pollard . . . 57 4.4 ρ − 1-M´etodo de Pollard . . . 58
4.5 Crivo Quadr´atico . . . 59
Abstract
Number Theory has been subject of study since the ancient years. In the two last decades, this field of Mathematics has gained much interest due to its use in cryptography. The public-key cryptosystems have their security based on number theoretic problems which are computationally hard to solve.
The RSA base its security on the difficulty in factoring numbers that are products of two big primes. In this work, we describe the RSA. As we are interested also in the generation of prime numbers and factorization of integers, we present some methods for primality testing and integer factorization.
Resumo
A Teoria dos N´umeros tem sido objeto de estudo desde a antiguidade. Nas ´ultimas duas d´ecadas, este campo da Matem´atica tem ganho maior interesse devido `a sua utiliza¸c˜ao em criptografia. Os criptossistemas de chave p´ublica tˆem sua seguran¸ca baseada em problemas da Teoria dos N´umeros que s˜ao computacionalmente dif´ıceis de resolver.
O RSA baseia sua seguran¸ca na dificuldade de fatorar n´umeros que s˜ao produtos de dois primos grandes. Neste trabalho, descreveremos o RSA. Como estamos tamb´em interessados na gera¸c˜ao de n´umeros primos e na fatora¸c˜ao de inteiros, apresentaremos alguns testes de primalidade e m´etodos de fatora¸c˜ao.
Agradecimentos
Agrade¸co a Deus, por tudo.
Aos meus pais, Rosana e Francisco, sem os quais n˜ao estaria onde estou hoje. Em particular `a minha m˜ae, quem esteve sempre ao meu lado.
Ao Alexander Sosnovski (Sashenka) por seu amor, companheirismo e apoio. Ao Agnaldo Dantas Sobrinho, meu padrasto querido.
Ao meu orientador, Prof. Pl´ınio O. dos Santos, pela paciˆencia, pela compreens˜ao e por sua orienta¸c˜ao neste trabalho.
Aos meus amigos de todas as horas. Em especial, Ignˆez G. Amaral e Luciane Bombach.
Aos colegas do Departamento de Matem´atica Aplicada do IMECC por toda ajuda e companhia durante o curso. Em particular, agrade¸co aos colegas Eduardo Bovo, Igor Freire e Jair Cunha.
Agrade¸co `a Luziane por me ajudar a solucionar alguns problemas com rela¸c˜ao ao LATEX.
Aos professores dos Departamentos de Matem´atica e Matem´atica Aplicada por incentivarem meu gosto pelos estudos.
Aos professores da banca examinadora, pelas sugest˜oes e corre¸c˜oes.
Ao Alonso Sep´ulveda Castellanos por me ajudar com a figura que representa um sistema criptogr´afico contida nesta disserta¸c˜ao.
Tabelas de S´ımbolos
bxc Maior inteiro menor do que ou igual a x lg x N´umero de bits de x
f (x) = O(g(x)) Existˆencia de uma constante positiva c e um inteiro n0
tais que f (x) ≤ cg(x) para x ≥ n0
log x Logaritmo natural de x logbx Logaritmo de x na base b
φ(x) N´umero de inteiros menores do que ou iguais a x que s˜ao relativamente primos com x
mdc(x, y) M´aximo divisor comum dos inteiros x e y mmc(x, y) M´ınimo m´ultiplo comum dos inteiros x e y
π(x) N´umeros de primos menores do que ou iguais a x
a n
S´ımbolo de Jacobi
E(n) Conjunto de bases de Euler para os quais n ´e um candidato a primo
|C| Cardinalidade do conjunto C Zn Grupo aditivo de inteiros m´odulo n
Z∗n Grupo multiplicativo de inteiros m´odulo n
ordna Ordem de a m´odulo n
S(n) Conjunto de bases para os quais n ´e um candidato forte a primo
m n
Coeficiente binomial de m e n P (n) Maior primo divisor de n
π0(x) Cardinalidade de {p ; p ´e primo , p ≤ x e P (p − 1) > x2/3} Zn[x] Anel de polinˆomios em Zn
p(x) mod (q(x), n) Resto da divis˜ao do polinˆomio p(x) pelo polinˆomio q(x) em Zn[x]
F Anel de polinˆomios em Zn[x] de grau ≤ grau(h(x))
onde a adi¸c˜ao e a multiplica¸c˜ao s˜ao m´odulo h(x), h(x) um polinˆomio irredut´ıvel
Introdu¸
c˜
ao
A palavra criptografia tem origem no grego, onde cryptos significa oculto, se-creto, escondido e grapho significa escrita, grafia. A criptografia ´e, ent˜ao, o estudo de m´etodos para transformar uma mensagem originalmente compreens´ıvel em algo incompreens´ıvel para todos, exceto para o destinat´ario leg´ıtimo da mensagem que a tornar´a leg´ıvel novamente, podendo interpretar seu conte´udo.
O processo de transformar uma mensagem leg´ıvel em uma equivalente mas ileg´ıvel ´e chamado de codifica¸c˜ao. E o que um usu´ario leg´ıtimo do c´odigo usa para tornar compreens´ıvel uma mensagem codificada ´e denominado decodifica¸c˜ao.
Em geral, para decodificar uma mensagem ´e necess´ario o conhecimento de uma chave secreta dispon´ıvel ao usu´ario leg´ıtimo do c´odigo. ´E poss´ıvel que pessoas n˜ao au-torizadas tenham acesso `a mensagem codificada e consigam determinar seu conte´udo ou mesmo a chave de decodifica¸c˜ao, “quebrando” o c´odigo. A este processo chama-mos de deciframento.
A criptoan´alise (cryptos+analysis= decomposi¸c˜ao) busca determinar a chave de decodifica¸c˜ao ou decifrar a mensagem sem o conhecimento da chave.
Ao estudo ou ciˆencia que re´une a criptografia e a criptoan´alise chamamos de criptologia.
O uso da criptografia j´a se fazia presente no sistema eg´ıpcio de escrita hierogl´ıfica, h´a aproximadamente quatro mil anos. J´ulio C´esar usava um cifr´ario para comunicar seus planos de batalha aos generais de seu ex´ercito. Tal cifra consistia em transladar as letras do alfabeto trˆes casas adiante. Existem outros c´odigos primitivos semelhantes a este como, por exemplo, o cifr´ario de Vigen`ere [18, §4 On the Origin of the Species] e o cifr´ario de Hill [18, §13 Secrecy for Sale].
A partir do advento dos computadores, os m´etodos de codifica¸c˜ao baseados em substitui¸c˜ao alfab´etica tornaram-se invi´aveis. Na verdade, o primeiro computador foi criado para decifrar as mensagens secretas estabelecidas pelo ex´ercito alem˜ao durante a Segunda Guerra Mundial. As mensagens alem˜aes eram codificadas atrav´es de uma m´aquina chamada Enigma. Um projeto denominado ULTRA foi desenvolvido na ´epoca em Bletchley Park, Inglaterra, para tentar decifrar o c´odigo alem˜ao. Um dos respons´aveis por este projeto era Alan Turing, o idealizador da m´aquina de Turing. Como conseq¨uˆencia deste projeto o primeiro computador foi constru´ıdo, o Colossus.
At´e ent˜ao, o uso da criptografia estava associada a interesses pol´ıticos e militares. Com a crescente utiliza¸c˜ao de redes de computadores, a necessidade de se manter informa¸c˜oes sigilosas tamb´em cresceu. A criptografia segue, ent˜ao, uma nova dire¸c˜ao, deixando de servir a interesses puramente militares ou pol´ıticos e passa a servir a cidad˜aos comuns. Um exemplo disso, ´e a enorme quantidade de transa¸c˜oes banc´arias ou comerciais feitas atrav´es da internet nos dias de hoje.
Particularmente, estaremos interessados na criptografia computacional, onde a seguran¸ca de informa¸c˜oes em redes de computadores, em bancos de dados, em caixas autom´aticos, etc. ´e a principal preocupa¸c˜ao. Mais especificamente, faremos uma rela¸c˜ao entre a criptografia RSA e a Teoria dos N´umeros. Atualmente, o RSA ´e um
dos m´etodos criptogr´aficos mais usados em aplica¸c˜oes comerciais.
Inicialmente, descreveremos o RSA. Como para codificar uma mensagem usando o RSA ´e preciso obter dois primos grandes, exporemos alguns algoritmos para testar a primalidade de n´umeros. Outro aspecto importante em rela¸c˜ao ao RSA ´e a intrata-bilidade de se fatorar o produto de dois primos grandes, tamb´em ser˜ao apresentados alguns algoritmos de fatora¸c˜ao.
Como em nosso estudo analisaremos a complexidade de alguns algoritmos impor-tantes direta ou indiretamente para a criptografia RSA, faremos as an´alises em termos do tamanho da entrada.
Defini¸c˜ao 0.0.1. Seja n um inteiro positivo. Definimos lg n =
(
1, se n = 0 1 + blog2nc, se n 6= 0 .
Cap´ıtulo 1
Criptografia Computacional
O uso de rede de computadores, cada vez em maior n´umero de aplica¸c˜oes, depende diretamente da confiabilidade que tais redes oferecem. ´E necess´ario proteger as men-sagens e dados que trafegam nestes meios de comunica¸c˜ao de maneira que somente pessoas ou processos autorizados possam utiliz´a-los. ´E a criptografia que cuida de fornecer seguran¸ca e prote¸c˜ao `a transmiss˜ao dessas informa¸c˜oes e cujos objetivos s˜ao: • Sigilo de informa¸c˜ao que ´e a garantia de que somente pessoas autorizadas te-nham acesso `as informa¸c˜oes. O acesso a saldos banc´arios em caixas autom´aticos ´
e um exemplo disso, onde somente as pessoas autorizadas, mediante cart˜ao e senha pessoal, tˆem acesso a esse tipo de dados.
• Integridade de informa¸c˜ao que garante que a mesma n˜ao sofra nenhum tipo de altera¸c˜ao, intencional ou n˜ao, de seu conte´udo, ou seja, que a informa¸c˜ao se encontre inalterada. Um exemplo desse tipo de aplica¸c˜ao ´e o banco de dados de uma universidade que cont´em os hist´oricos escolares dos alunos. A criptografia dificulta a fraude nas notas dos alunos.
• Autentica¸c˜ao de informa¸c˜ao serve para identificar pessoas ou processos com quem se est´a estabelecendo comunica¸c˜ao. Como exemplo, a assinatura digital ´
e um an´alogo computacional `a assinatura em um documento tradicional. • N˜ao rep´udio que evita que uma das partes envolvida na comunica¸c˜ao negue
o envio ou o recebimento de uma informa¸c˜ao. Um exemplo disso seria uma empresa que autoriza uma entidade a comprar uma propriedade e depois nega que autorizou tal negocia¸c˜ao.
1.1
Sistemas Criptogr´
aficos
Um sistema criptogr´afico ´e um conjunto de processos criptogr´aficos que fornece seguran¸ca de informa¸c˜oes. Um sistema criptogr´afico consiste de :
• Um conjunto finito A que chamamos de alfabeto de entrada. O alfabeto de entrada pode ser o alfabeto latino, o alfabeto bin´ario ou qualquer alfabeto de alguma l´ıngua. Em se tratando de criptografia computacional, geralmente o alfabeto bin´ario ser´a usado como alfabeto de entrada. Conv´em observar que qualquer tipo de alfabeto pode ser representado como uma cadeia de strings do alfabeto bin´ario.
• Um conjunto M formado por cadeias finitas de elementos de A. Chamamos a este conjunto de espa¸co de mensagens. Cada elemento de M corresponde a um texto simples, n˜ao cifrado.
• Um conjunto C tamb´em formado por cadeias finitas de elementos de A. Este ´e o chamado espa¸co de mensagens codificadas e cada elemento de C corresponde
a um texto cifrado.
• K um conjunto finito de elementos chamados de chaves que s˜ao ferramentas necess´arias para manter oculta uma informa¸c˜ao.
• E espa¸co de fun¸c˜oes e : M → C onde cada fun¸c˜ao codifica os elementos de M. E ´e o espa¸co de fun¸c˜oes de codifica¸c˜ao.
• D espa¸co de fun¸c˜oes d : C → M onde cada fun¸c˜ao decodifica os elementos de C. Cada elemento k1 ∈ K determina uma ´unica bije¸c˜ao de M em C que denotamos
por ek1. Assim, temos que existe k2 ∈ K que determina uma fun¸c˜ao de decodifica¸c˜ao
dk2 que ´e inversa `a ek1.
Quando se projeta um sistema criptogr´afico deve-se estar atento ao fato de que o sistema deve permanecer seguro mesmo quando os algoritmos de codifica¸c˜ao e de decodifica¸c˜ao s˜ao de conhecimento p´ublico.
Com esse objetivo usam-se pares de chaves, uma para codifica¸c˜ao e outra para decodifica¸c˜ao, devendo haver uma grande n´umero de pares de chaves.
A figura a seguir esbo¸ca um sistema criptogr´afico t´ıpico onde duas fun¸c˜oes s˜ao utilizadas:
Exemplo 1.1.1. Um sistema criptogr´afico simples ´e o cifr´ario de C´esar que j´a menci-onado anteriormente. Consiste em substituir uma letra por outra, trˆes casas adiante. Os conjuntos M e C constituem ambos de textos formados pelas 26 letras do alfabeto latino. Pode-se variar o valor de casas que devemos transladar cada letra e tal valor consiste na chave de codifica¸c˜ao. Obviamente esses valores est˜ao no intervalo [0, 25]. A chave de decodifica¸c˜ao ´e a mesma que a de decodifica¸c˜ao. As fun¸c˜oes de codifica¸c˜ao
Figura 1.1: Sistema Criptogr´afico
e decodifica¸c˜ao s˜ao as transla¸c˜oes “avan¸cada” e “retroativa”, respectivamente, em trˆes casas no alfabeto.
1.2
Fun¸
c˜
oes Unidirecionais
As fun¸c˜oes de codifica¸c˜ao e de decodifica¸c˜ao usadas em criptossistemas s˜ao exem-plos t´ıpicos de fun¸c˜oes unidirecionais. A seguir definiremos fun¸c˜oes unidirecionais. Defini¸c˜ao 1.2.1. Uma fun¸c˜ao unidirecional f ´e uma fun¸c˜ao computacionalmente vi´avel (em tempo, espa¸co e dinheiro) de se calcular f (x) dado x e computacionalmente invi´avel determinar x tal que f (x) = y dado y.
A unidirecionalidade de uma fun¸c˜ao pode ser uma caracter´ıstica intr´ınseca da pr´opria fun¸c˜ao ou depender do estado da arte do avan¸co tecnol´ogico e cient´ıfico como veremos no exemplo a seguir.
Exemplo 1.2.1. A multiplica¸c˜ao de dois primos grandes (pelo menos 100 d´ıgitos) ´e facilmente calculada com a tecnologia atual, mas dado o produto de dois primos (pelo menos 200 d´ıgitos decimais) obter a fatora¸c˜ao do produto n˜ao ´e vi´avel com a tecnologia atual. A seguran¸ca do criptossistema RSA (pr´oximo cap´ıtulo) ´e baseado na incapacidade de fatorar um n´umero grande rapidamente.
Exemplo 1.2.2. Outro exemplo de fun¸c˜ao unidirecional ´e a exponencia¸c˜ao m´odulo um n´umero, isto ´e, f (x) = ax (mod n), dados a, x e n, com x ≥ 0 e n > 0.
Esta ´e uma fun¸c˜ao vi´avel de se calcular cujo tempo de execu¸c˜ao ´e O(lg x lg2n) [7, Cap.5]. Agora, dados a, n e ax (mod n), calcular x ´e invi´avel. Ainda n˜ao
existe um algoritmo para este problema cuja execu¸c˜ao seja em tempo polinomial. Existem dois tipos de fun¸c˜oes unidirecionais que podem ser com segredo ou sem segredo. Uma fun¸c˜ao unidirecional ´e com segredo quando existe uma informa¸c˜ao (o segredo) que possibilita a computa¸c˜ao de sua inversa e sem segredo caso contr´ario. No caso da fun¸c˜ao fatora¸c˜ao de primos, no exemplo acima, a fun¸c˜ao ´e sem segredo.
1.3
Criptossistemas Sim´
etricos e Assim´
etricos
Quando a chave de decodifica¸c˜ao e a chave de codifica¸c˜ao s˜ao as mesmas em um dado criptossistema ou quando a fun¸c˜ao de decodifica¸c˜ao ´e uma fun¸c˜ao com-putacionalmente vi´avel da chave de codifica¸c˜ao , precisamos manter a chave em sigilo, sendo conhecida apenas pelos usu´arios leg´ıtimos. Neste caso, o sistema ´e dito sim´etrico ou de chave secreta. O cifr´ario de C´esar ´e um exemplo de criptossistema sim´etrico.
O sistema sim´etrico mais conhecido ´e o DES - Data Encryption Standard adotado pelo governo americano em 1977 como padr˜ao de codifica¸c˜ao para uso em seus ´org˜aos governamentais n˜ao relacionados `a seguran¸ca nacional. Por n˜ao ser objeto de nosso estudo n˜ao descreveremos o DES neste trabalho. A descri¸c˜ao de seu funcionamento pode ser obtida nas referˆencias [23] e [24].
Nos criptossistemas assim´etricos ou de chave p´ublica, a chave de codifica¸c˜ao ´e publicada, ou seja, acess´ıvel `a todos. O conhecimento da chave de codifica¸c˜ao n˜ao compromete a seguran¸ca do sistema. O processo de codifica¸c˜ao tamb´em ´e p´ublico e somente a chave de decodifica¸c˜ao ´e mantida em segredo pelo destinat´ario leg´ıtimo da mensagem.
A id´eia de um sistema de chave p´ublica foi inicialmente introduzido por Diffie e Hellman em 1976. O RSA ´e um sistema criptogr´afico assim´etrico e foi o primeiro criptossistema de chave p´ublica criado. A partir disso, surgiram muitos outros crip-tossistemas de chave p´ublica. O RSA ser´a descrito no pr´oximo cap´ıtulo.
Nos sistemas de chave p´ublica, cada usu´ario possui um par de chaves, sendo que uma ´e a chave de codifica¸c˜ao, colocada `a disposi¸c˜ao daqueles que desejam enviar uma mensagem para o propriet´ario da chave. Suponhamos que um usu´ario A deseje enviar uma mensagem m para um outro usu´ario B. Ent˜ao o usu´ario A consulta a lista de chaves p´ublicas e obt´em a chave de codifica¸c˜ao PB de B. A aplica PB `a mensagem
m e obt´em o texto codificado PB(m) e envia para B. Ap´os receber PB(m), B aplica
a chave secreta SB e obt´em m = SB(PB(m)). Assim, todos os usu´arios que enviam
mensagens codificadas a B usam a mesma chave p´ublica PB, entretanto, somente B
Cap´ıtulo 2
O Sistema de Chave P´
ublica RSA
O criptossistema de chave p´ublica RSA foi desenvolvido por R. L. Rivest, A. Shamir e L. Adleman em 1978. As iniciais dos autores deram origem ao nome do c´odigo.
O RSA tem base na facilidade de computar o produto de dois primos grandes (pelos menos da ordem 10100 cada) e na dificuldade de fatorar esse produto.
Antes de descrevermos o RSA, estabeleceremos alguns resultados de Teoria dos N´umeros que ser˜ao usados para explicar como o c´odigo funciona.
Defini¸c˜ao 2.0.1. A fun¸c˜ao φ de Euler de um inteiro positivo m, denotada por φ(m), ´e definida como o n´umero de inteiros positivos menores do que ou iguais a m que s˜ao relativamente primos com m.
Observamos que quando p ´e primo, φ(p) = p − 1.
Defini¸c˜ao 2.0.2. Um conjunto {r1, r2, . . . , rφ(m)} ´e um sistema reduzido de res´ıduos
m´odulo m se cada um de seus elementos ´e relativamente primo com m e ri 6≡ rj
Teorema 2.0.1 (Euler). Se m ∈ Z, m > 0 e a ∈ Z ´e tal que a ∈ Z∗m, ent˜ao
aφ(m) ≡ 1 (mod m).
Prova. Seja {r1, r2, . . . , rφ(m)} um sistema reduzido de res´ıduos m´odulo m. Como
mdc(a, m) = 1, ent˜ao {ar1, ar2, . . . , arφ(m)} tamb´em ´e um sistema reduzido de res´ıduos
m´odulo m (a demonstra¸c˜ao deste resultado pode ser encontrada em [32, Teorema 2.12]). Isto implica que cada ari ´e congruente a exatamente um dos rj’s,
1 ≤ j ≤ φ(m). Logo o produto dos ari’s deve ser congruente ao produto dos rj’s
m´odulo m, ou seja,
ar1· ar2· · · arφ(m) ≡ r1· r2· · · rφ(m) (mod m).
Ent˜ao
aφ(m)r1· r2· · · rφ(m)≡ r1· r2· · · rφ(m) (mod m). (2.0.1)
Pelas caracter´ısticas de sistema reduzido de res´ıduos m´odulo m, ent˜ao o produto Πφ(m)j=1 rj ´e relativamente primo com m. Podemos, ent˜ao, cancelar Πφ(m)j=1 rj em ambos
os lados da congruˆencia (2.0.1), obtendo
aφ(m) ≡ 1 (mod m).
Teorema 2.0.2. Sejam a, b, m ∈ Z com m > 1 e a ∈ Z∗m. Ent˜ao a congruˆencia
ax ≡ b (mod m) possui solu¸c˜ao ´unica m´odulo m.
Prova. Este resultado ´e uma conseq¨uˆencia do Teorema 2.8 apresentado em [32].
2.1
Gera¸
c˜
ao das Chaves
Nesse criptossistema, cada usu´ario possui uma chave de codifica¸c˜ao e outra de decodifica¸c˜ao. Para gerar o par de chaves cada usu´ario realiza o seguinte pr´e-c´alculo: • Seleciona-se dois primos grandes p e q (veremos mais adiante que tais primos
devem obedecer alguns requisitos para manter a seguran¸ca do m´etodo). • Calcula-se o produto n = pq e φ(n) = (p − 1)(q − 1).
• Gera-se um inteiro e, 1 < e < φ(n) tal que mdc(e, φ(n)) = 1 (tamb´em temos que tal expoente deve obedecer certos crit´erios de seguran¸ca [24, §8.2.2 Security of RSA]).
• Determina-se d, 0 ≤ d < φ(n) tal que ed ≡ 1 mod φ(n), ou seja, d ´e o inverso multiplicativo de e m´odulo φ(n).
A gera¸c˜ao dos primos p e q ser´a discutida no cap´ıtulo seguinte sobre primalidade. Obtidos tais primos, facilmente se calcula n e φ(n). Usando-se um gerador pseudo-aleat´orio podemos obter e e determinamos o mdc(e, φ(n)) atrav´es do algoritmo de Euclides cuja a complexidade ´e O(lg2(φ(n))) [7, Cap.4]. A solu¸c˜ao d da congruˆencia
ed ≡ 1 mod φ(n) tamb´em pode ser obtida atrav´es do algoritmo estendido de Euclides [13, Se¸c˜ao 31.4].
Feitos os c´alculos acima, o usu´ario publica P = (e, n) como chave de codifica¸c˜ao e mant´em em segredo S = (d, n) (na verdade, somente d ´e mantido em segredo) que ´e a chave de decodifica¸c˜ao.
Observamos que d determinado acima existe e ´e ´unico, conforme o Teorema 2.0.2.
2.2
Codifica¸
c˜
ao e Decodifica¸
c˜
ao
Agora veremos como as chaves P e S geradas acima s˜ao aplicadas para codificar e decodificar mensagens. Inicialmente, a mensagem ´e convertida em uma seq¨uˆencia de n´umeros bin´arios. Essa seq¨uˆencia gerada ´e quebrada em blocos de bits que repre-sentam inteiros m no intervalo [0, n). Ent˜ao cada bloco m ´e codificado.
A codifica¸c˜ao associada a chave P = (e, n) ´e feita atrav´es da fun¸c˜ao P (m) = me (mod n)
e a decodifica¸c˜ao de uma cifra c := P (m) em rela¸c˜ao a chave S = (d, n) ´e dada por S(c) = cd (mod n).
Dessa forma, o RSA ´e um criptossistema cujo alfabeto de entrada ´e o alfabeto bin´ario, o espa¸co de poss´ıveis mensagens e o espa¸co de mensagens codificadas ´e o conjunto Zn.
As exponencia¸c˜oes modulares podem ser efetuadas rapidamente como citamos no Exemplo 1.2.2. Al´em disso, temos que calcular a inversa da fun¸c˜ao exponencial m´odulo n ´e computacionalmente intrat´avel.
Chega o momento de se verificar se o m´etodo acima realmente funciona, ou seja, se decodificando um bloco codificado obtemos o bloco da mensagem original. O pr´oximo teorema responde a esta quest˜ao.
Teorema 2.2.1. A decodifica¸c˜ao do RSA funciona.
Prova. Seja c = P (m) = me (mod n) a codifica¸c˜ao de um bloco m. Como
ed ≡ 1 mod φ(n), existe t tal que ed = 1 + tφ(n). Se mdc(m, p) = 1, usando o Teorema 2.0.1 temos que mp−1 ≡ 1 (mod p). Ent˜ao (mp−1)t(q−1) =
= mt(p−1)(q−1) ≡ 1 (mod p) ⇒ m1+t(p−1)(q−1) = med ≡ m (mod p). Agora, se
mdc(m, p) = p, ent˜ao a ´ultima congruˆencia ´e v´alida novamente pois cada lado ´e congruente a 0 m´odulo p. Assim, temos med ≡ m (mod p) em todos os casos.
De forma an´aloga, med ≡ m (mod q). Como p e q s˜ao primos distintos, ent˜ao
med ≡ m (mod n). Da´ı, cd= (me)d≡ m (mod p).
2.3
Assinatura Digital
Uma caracter´ıstica importante do sistema RSA ´e que S(P (m)) = P (S(m)), isto ´e, S e P comutam. De fato,
S(m) ≡ md mod n ⇒ P (S(m)) ≡ (md)e mod n ⇒ P (S(m)) ≡ med mod n ⇒ P (S(m)) ≡ m mod n, e conforme a demonstra¸c˜ao do Teorema 2.2.1 temos S(P (m)) ≡ m mod n.
Os sistemas em que a codifica¸c˜ao e a decodifica¸c˜ao comutam s˜ao ditos sistemas comutativos e admitem uma assinatura digital natural.
Assim, no sistema RSA ´e poss´ıvel “decodificar” uma mensagem e depois “codificar” o resultado. Suponhamos que um usu´ario A deseje enviar uma mensagem assinada a um usu´ario B. Para isso, basta que A envie o texto SA(m). Somente A
tem a chave secreta SA usada para computar SA(m). B aplica a chave p´ublica de A
a SA(m) para obter o texto original m = PA(SA(m)). Qualquer usu´ario com o uso de
PA pode verificar que A ´e realmente o remetente da mensagem, pois somente A tem
acesso a chave SA.
2.4
Seguran¸
ca do RSA
Veremos que a seguran¸ca do RSA depende em grande parte da dificuldade em fatorar n´umeros grandes. Analisaremos as poss´ıveis maneiras de obter a mensagem original codificada pelo RSA.
Fatorar n implica decodificar uma mensagem no RSA, pois encontrando os fatores de n, ´e poss´ıvel calcular φ(n). Como ed = 1 (mod φ(n)), ent˜ao a solu¸c˜ao d dessa congruˆencia pode ser obtida facilmente atrav´es do Algoritmo Estendido de Euclides. Agora, analisaremos algumas poss´ıveis maneiras de obter a mensagem original codificada pelo RSA conhecendo-se somente a chave p´ublica.
Suponhamos que seja poss´ıvel determinar de alguma forma φ(n) usando o par (e, n) sem ter que fatorar n. Logo, n e φ(n) s˜ao conhecidos. Sabendo que existem p e q tais que n = pq e φ(n) = (p − 1)(q − 1) temos que
Assim, conhecemos p + q = n − φ(n) + 1. Tamb´em temos que
(p + q)2− 4n = (p2+ 2pq + q2) − 2pq = p2− 2pq + q2 = (p − q)2.
A partir disso, o valor de p − q =p(p + q)2− 4n tamb´em ´e conhecido. De posse dos
valores de p + q e p − q, obtemos os valores de p e q, isto ´e, achamos a fatora¸c˜ao de n. Se de alguma maneira podermos determinar d somente com o conhecimento de n e e, ent˜ao encontramos a fatora¸c˜ao de n. De fato, como ed − 1 = tφ(n), isto significa que encontramos um m´ultiplo de φ(n). ´E poss´ıvel fatorar n a partir de qualquer m´ultiplo de φ(n). Miller [25] mostrou que considerando-se a Hip´otese Estendida de Riemman, isto pode ser feito de maneira eficiente.
Outra maneira de se conseguir m seria inverter a fun¸c˜ao de codifica¸c˜ao, isto ´e, encontrar a raiz e-´esima m´odulo n. At´e agora n˜ao se conseguiu provar que inverter a fun¸c˜ao de codifica¸c˜ao, dado o par (e, n) e a codifica¸c˜ao de c := me (mod n), ´e
equivalente a fatorar n. Por´em sabemos que este problema ´e computacionalmente invi´avel, conforme exemplo 1.2.2.
At´e o momento, n˜ao se conhece uma maneira eficiente de fatorar um n´umero grande. Assim, o RSA tem se mostrado seguro com a tecnologia atual.
Para manter tal seguran¸ca deve-se tomar alguns cuidados para com rela¸c˜ao a escolha dos parˆametros p e q:
• os n´umeros p e q n˜ao podem ser pr´oximos um do outro, caso contr´ario estar˜ao pr´oximos da√n o que torna poss´ıvel fatorar n atrav´es da fatora¸c˜ao de Fermat que ser´a apresentado no ´ultimo cap´ıtulo.
• Os n´umeros p − 1 e q − 1 devem ter fatores primos grandes. Com alguns algoritmos de fatora¸c˜ao conhecidos, fica f´acil fatorar n se p − 1 e q − 1 tem fatores pequenos, como ´e o caso do algoritmo ρ − 1 de Pollard.
Cap´ıtulo 3
Testes de Primalidade
Desde a antiguidade at´e os tempos atuais, os n´umeros primos tˆem atra´ıdo a aten¸c˜ao de muitos estudiosos. Em tempos remotos, Erast´ostenes (240 a.C aproxi-madamente) desenvolveu uma maneira de determinar se um dado inteiro positivo n ´e primo. Para isto basta tentar dividir n por todos os inteiros menores do que ou iguais a√n (em [32] o Teorema 1.15 garante que se n n˜ao ´e primo, ent˜ao n tem um fator primo menor do que ou igual a √n). Assim se n n˜ao for divis´ıvel por nenhum dos n´umeros, ent˜ao n ´e primo. Tal m´etodo ´e conhecido como Crivo de Erast´ostenes. No entanto, este m´etodo torna-se impratic´avel quando n ´e muito grande.
Posteriormente, surgiram outros m´etodos como, por exemplo, o Teste de Pepin que determina se um n´umero de Fermat ´e primo, o Teste de Lucas-Lehmer para determinar a primalidade de um n´umero de Mersenne , e outros.
Atualmente, uma das raz˜oes para que a primalidade de n´umeros tenha recebido mais aten¸c˜ao ´e o seu uso em diversos criptossistemas como, por exemplo, o RSA. Vimos que ´e de grande importˆancia para a Criptografia RSA a capacidade de produzir primos grandes de forma gen´erica e provar que estes s˜ao realmente primos.
O problema de gerar um primo grande, a princ´ıpio, pode ser resolvido escolhendo-se inteiros aleat´orios em um intervalo espec´ıfico e testando a primalidade de tais n´umeros.
Neste cap´ıtulo, apresentaremos alguns dos testes de primalidade existentes, nos restringindo `aqueles que testam a primalidade de n´umeros gen´ericos . Os dois pri-meiros testes apresentados s˜ao testes probabil´ısticos: o teste de Solovay-Strassen e o teste de Miller-Rabin com bases em resultados importantes da Teoria de N´umeros. ´E importante ressaltarmos que tais testes quando respondem que dado n´umero ´e primo devemos ter em mente que isto ´e apenas uma boa evidˆencia que tal n´umero seja mesmo primo. Em muitas aplica¸c˜oes isto j´a ´e o suficiente, como ´e o caso em que procuramos por um primo grande. No entanto, estes testes n˜ao produzem certifica-dos de primalidade, provas de que o n´umero seja realmente primo. E se realmente ´e necess´aria uma prova de primalidade aplica-se outros tipos de testes, como ´e o caso do algoritmo de Goldwasser-Killian e de Atkin, baseados na teoria de curvas el´ıpticas. Tais algoritmos, no entanto, n˜ao fazem parte deste trabalho. Maiores informa¸c˜oes sobre esses algoritmos podem ser obtidas em [6] e [17].
Por ´ultimo, apresentaremos um algoritmo determin´ıstico que testa a primalidade de um n´umero em tempo polinomial. Tal algoritmo foi apresentado recentemente, constituindo um dos mais novos resultados relacionados `a primalidade e que tem ganho grande admira¸c˜ao por todos da ´area.
3.1
Distribui¸
c˜
ao de Primos
Para gerar um primo em um intervalo dado escolhemos um inteiro ´ımpar aleat´orio e verificamos se este inteiro ´e primo. Se n˜ao for primo, geramos outro inteiro e testamos sua primalidade. Continuamos com este processo at´e encontrarmos um n´umero primo.
Mas quantos candidatos devemos testar at´e encontrar um prov´avel primo? A melhor forma de responder `a esta pergunta ´e usando a chamada fun¸c˜ao π. Se x > 0, π(x) ´e definida como sendo o n´umero de primos menores do que ou iguais a x.
O Teorema dos N´umeros Primos [1] afirma que: lim x→∞ π(x) x log(x) = 1.
Ent˜ao, log(x)x ´e uma boa aproxima¸c˜ao para π(x) quando x for suficientemente grande. Assim, podemos estimar que um inteiro x escolhido aleatoriamente tem pro-babilidade igual a log(x)1 de ser primo, isto ´e, temos que examinar aproximadamente log(x) inteiros pr´oximos de x para acharmos um n´umero primo da mesma ordem que x. Um exemplo disso ´e que temos que testar log 10100 ≈ 230 candidatos, aproxima-damente, at´e encontrarmos um primo de 100 d´ıgitos decimais, e este valor pode ser reduzido `a metade se considerarmos somente os n´umeros ´ımpares. Uma m´edia de 115 candidatos que ter˜ao que ser testados.
3.2
Teste de Solovay-Strassen
A fim de descrever o teste de Solovay-Strassen introduziremos alguns conceitos matem´aticos, incluindo o Crit´erio de Euler.
Defini¸c˜ao 3.2.1. Sejam p um primo positivo ´ımpar e a ∈ Z. Se a ∈ Z∗p e se existe uma solu¸c˜ao da congruˆencia
x2 ≡ a mod p,
ent˜ao a ´e chamado um res´ıduo quadr´atico m´odulo p. Se n˜ao existe solu¸c˜ao, ent˜ao a ´e dito ser um res´ıduo n˜ao quadr´atico m´odulo p.
Defini¸c˜ao 3.2.2. Seja a um inteiro. Para um primo ´ımpar p > 1, definimos o s´ımbolo de Legendre ap por
a p = 0, se a ≡ 0(mod p)
1, se a ´e res´ıduo quadr´atico mod p −1, se a ´e res´ıduo n˜ao quadr´atico mod p.
Defini¸c˜ao 3.2.3. Seja um n´umero n > 1 um inteiro ´ımpar com decomposi¸c˜ao n = k Y i=1 pei i .
Ent˜ao o S´ımbolo de Jacobi ´e definido como a n = k Y i=1 a pi ei = a p1 e1 a p2 e2 . . . a pk ek . O s´ımbolo de Jacobi ´e uma generaliza¸c˜ao do s´ımbolo de Legendre.
Propriedades do S´ımbolo de Jacobi Sejam m e n inteiros ´ımpares positivos, e sejam a, b inteiros. Ent˜ao
b. a n =
b
n, se a ≡ b(mod n).
As demonstra¸c˜oes destas propriedades se encontram em [7, Teorema 5.9.2]. Teorema 3.2.1 (Crit´erio de Euler). Se p ´e um primo positivo ´ımpar e a ∈ Z∗p, ent˜ao
ap−12 ≡ a
p
(mod p). (3.2.1) Prova. Suponhamos, primeiramente, que ap = 1. Ent˜ao, existe x tal que x2 ≡ a(mod p). Do fato que mdc(a, p) = 1 e p|(x2− a) conclu´ımos que mdc(x, p) = 1.
Logo, pelo Teorema 2.0.1, xp−1≡ 1(mod p) e, portanto, ap−12 ≡ x2
p−1
2 = xp−1≡ 1(mod p).
Consideremos agora o caso ap = −1. J´a vimos acima que se a for um res´ıduo quadr´atico ent˜ao xp−12 ≡ 1(mod p). A congruˆencia f (x) = x
p−1
2 − 1 ≡ 0(mod p) possui
no m´aximo p−12 solu¸c˜oes incongruentes m´odulo p (ver Teorema 5.2 em [32]).
No entanto, do fato de existirem p−12 res´ıduos quadr´aticos e de termos ap−12 ≡ 1(mod p) para todo res´ıduo quadr´atico, conclu´ımos que todos estes res´ıduos
quadr´aticos s˜ao solu¸c˜oes de f (x) ≡ 0(mod p), o que nos garante que f (x) ≡ 0(mod p) possui
exatamente p−12 ra´ızes, e que se a n˜ao for res´ıduo quadr´atico, isto ´e, a p = −1, ent˜ao ap−12 6≡ 1(mod p).
Como ap−1− 1 = (ap−12 − 1)(ap−12 + 1) e ap−1− 1 ≡ 0(mod p) para mdc(p, a) = 1,
conclu´ımos que a(p−1)2 ≡ ±1(mod p).
Assim, se a p
= −1, temos ap−12 ≡ −1(mod p). Portanto, a p−1 2 = a p (mod p).
Desta forma, o Crit´erio de Euler nos diz que se an−12 6≡ a n
(mod n) para algum a tal que a ∈ Z∗n, ent˜ao n ´e composto e a ´e dito testemunha da composi¸c˜ao de n. Se
um n´umero n composto satisfaz a congruˆencia (3.2.1), n ´e denominado pseudoprimo de Euler para a base a. Chamamos de n´umero de Carmichael o composto n que satisfaz (3.2.1) para todo a ∈ Z∗n.
Lema 3.2.1. Se n ´e um n´umero de Carmichael, ent˜ao n n˜ao ´e divis´ıvel pelo quadrado de nenhum primo e ´e divis´ıvel por pelo menos 3 primos distintos.
Prova. Demonstra¸c˜ao em [7, Teorema 9.3.6].
Consideraremos, agora, o conjunto E(n), importante nos pr´oximos resultados, definido como o conjunto de bases a ∈ Z∗n tal que n satisfaz a congruˆencia (3.2.1) do
Crit´erio de Euler, ou seja,
E(n) =na ∈ Z∗n:a n ≡ an−12 (mod n) o .
Lema 3.2.2. Seja n um inteiro ´ımpar, n ≥ 3. Portanto, n ´e primo se, e somente se, E(n) = Z∗n.
Prova. Se n ´e primo, ent˜ao, usando o Crit´erio de Euler, temos an ≡ an−12 (mod n)
para todo a ∈ Z∗n. Logo, E(n) = Z∗n.
Reciprocamente, suponhamos que E(n) = Z∗n e n seja composto. Ent˜ao, para
todo a ∈ Z∗n tem-se:
an−1 ≡a n
2
Como n ´e um n´umero de Carmichael, ent˜ao n˜ao ´e divis´ıvel pelo quadrado de nenhum primo (conforme Lema 3.2.1). Ent˜ao n = p · q, com p primo, q > 1 e mdc(p, q) = 1. Sejam g um res´ıduo n˜ao quadr´atico m´odulo p, e seja a ≡ g(mod p) e a ≡ 1(mod q), pelas propriedades do s´ımbolo de Jacobi temos que
a n = a pq = a p a q = g p 1 q = (−1)(+1) = −1.
J´a que supomos que na = −1 ≡ an−12 (mod n) para todo a ∈ Z∗
n ⇒
⇒ an−12 ≡ −1(mod q), o que contradiz o fato de a ≡ 1(mod q).
Baseado no teorema acima descoberto por R. Solovay e V. Strassen, inicialmente apresentado em [34], descreveremos a seguir um algoritmo para testar a primalidade de um n´umero ´ımpar ≥ 3.
Algoritmo 1 (SOLOVAY-STRASSEN(n)). escolha a aleat´orio em {1, . . . , n − 1} 1. se mdc(a, n) 6= 1
ent˜ao retorne “composto” e pare sen˜ao
2. se a n 6≡ a
n−1
2 (mod n)
ent˜ao retorne “composto” e pare sen˜ao retorne “primo”
O algoritmo SOLOVAY-STRASSEN [7] nos diz que tomando-se aleatoriamente um n´umero a ∈ {1, . . . , n − 1} onde n ´e um inteiro ´ımpar, verificamos se mdc(a, n) 6= 1, o que implica n ser composto. Mas se mdc(a, n) = 1, computamos o res´ıduo ε = an−12 (mod n) e o s´ımbolo de Jacobi δ = a
n. Se δ = ε, ent˜ao o algoritmo retorna
que n ´e primo. Caso contr´ario, n ´e composto.
Obviamente, se n ´e primo, o algoritmo responder´a corretamente, pois no passo (1) o algoritmo nunca encontrar´a mdc n˜ao trivial e pelo Crit´erio de Euler a congruˆencia sempre ´e satisfeita e o passo (2) sempre retornar´a que n ´e primo.
Mas sendo n composto, qual a probabilidade de o algoritmo retornar “primo”? A proposi¸c˜ao a seguir afirma que a probabilidade de erro menor do que ou igual a 12. Teorema 3.2.2. Se n ´e um n´umero composto ´ımpar, ent˜ao para pelo menos metade de todas bases a ∈ {1, . . . , n−1} o algoritmo SOLOVAY-STRASSEN retornar´a “composto”. Prova. Seja n um composto ´ımpar. Se a /∈ Z∗n, o passo (1) retorna “composto”. Consideremos a ∈ Z∗n. Usando o Lema 3.2.2, temos E(n) 6= Z
∗
n. Como E(n) ´e
subgrupo de Z∗n, segue que E(n) ´e um subgrupo pr´oprio de Z ∗ n. Logo: |E(n)| ≤ 1 2|Z ∗ n| ≤ n − 1 2 , pelo Teorema de Lagrange.
Portanto, no m´aximo metade dos n´umeros entre 1 e n − 1 conduzir˜ao a uma resposta de que n ´e primo.
O algoritmo SOLOVAY-STRASSEN tem complexidade O(lg3n) bit opera¸c˜oes, j´a que podemos calcular mdc(a, n) e o s´ımbolo de Jacobi na usando O(lg2n) bit opera¸c˜oes,
e an−12 (mod n) usando O(lg3n) bit opera¸c˜oes (para maiores detalhes da complexidade
acima ver [7, Teorema 9.4.2]).
Assim, o resultado de Solavay e Strassen nos garante que se n ´e um primo, o algoritmo sempre retornar´a “primo”, pois a congruˆencia (3.2.1) vale para cada a ∈ {1, . . . , n − 1} gerado e tamb´em garante uma margem de erro menor do que ou igual a 12 para cada vez que aplicarmos o algoritmo para uma determinada base a, se n n˜ao ´e primo. Se aplicarmos o teste k vezes para distintos valores de a, ent˜ao as chances de n ser realmente primo, quando o teste o declara primo, ´e de pelo menos 1 −21k.
3.3
Teste de Miller-Rabin
Discutiremos, agora, outro teste probabil´ıstico baseado no conceito de pseudoprimo forte. Inicialmente, veremos alguns resultados importantes relaciona-dos ao teste de Miller e Rabin
Defini¸c˜ao 3.3.1. O menor expoente e tal que ae ≡ 1(mod n) ´e chamado ordem de a m´odulo n e denotado por e = ordna.
Lema 3.3.1 (Pocklington). Seja n um inteiro positivo. Suponhamos que n − 1 = qkr, k ≥ 1, onde q ´e primo e q - r. Se existe a tal que an−1 ≡ 1(mod n) e
Prova. Suponhamos que a satisfa¸ca as hip´oteses do lema. Seja p um primo tal que p|n e seja t = ordpa. Como an−1 ≡ 1(mod n), sabemos que an−1 ≡ 1(mod p). Assim,
t|(n − 1) = qkr. Al´em disso, como mdc(an−1q −1, n) = 1, ent˜ao temos a n−1
q 6≡ 1(mod p)
e t n˜ao divide (n − 1)/q = qk−1· r. Da´ı, qk|t. J´a que t|(p − 1) segue que qk|p − 1.
Portanto, p ≡ 1(mod qk).
Teorema 3.3.1. Seja n ´ımpar e n − 1 = 2kq com q ´ımpar e k ≥ 1. Se n ´e primo e a ∈ Z∗n, ent˜ao aq ≡ 1(mod n) ou existe um i ∈ {0, 1, . . . , k − 1} tal que
a2iq ≡ −1(mod n).
Prova. Consideremos a seguinte seq¨uˆencia de potˆencias m´odulo n: aq, a2q, . . . , a2k−1q, a2kq.
Se n for um n´umero primo, ent˜ao pelo menos uma destas potˆencias tem que ser congruente a 1 m´odulo n, pois, pelo Teorema de Euler, temos
a2kq = an−1 ≡ 1(mod n).
Seja i ≥ 1 o menor expoente tal que a2iq ≡ 1(mod n). Podemos escrever a2iq− 1 = (a2i−1q
− 1)(a2i−1q
+ 1). Como n ´e primo e n|(a2iq
− 1), ent˜ao ou n|(a2i−1q
− 1) ou n|(a2i−1q
+ 1). Sendo i o menor expoente tal que a2iq
− 1 ´e divis´ıvel por n, ent˜ao a2i−1q
− 1 n˜ao ´e divis´ıvel por n. Segue que n divide a2i−1q
+ 1, isto ´e, a2i−1q
Conclu´ımos que se n ´e primo, ent˜ao uma das potˆencias da seq¨uˆencia dada tem que ser congruente a −1 m´odulo n quando i ≥ 1. Agora, se i = 0 ent˜ao aq ≡ 1(mod n) e
a esta congruˆencia n˜ao podemos aplicar o produto not´avel, pois q ´e ´ımpar.
Portanto, se n ´e primo, ent˜ao uma das potˆencias da seq¨uˆencia ´e congruente a −1 m´odulo n ou aq≡ 1(mod n).
A seguir apresentaremos dois lemas importantes na an´alise do teste de Miller-Rabin. Para isto, definimos o conjunto
S(n) = {a ∈ Z∗n; a
q ≡ 1(mod n) ou a2iq
≡ −1(mod n)}
para algum 0 ≤ i < t onde n − 1 = 2tq. Todo a 6∈ S(n) ´e dito testemunha forte da
composi¸c˜ao de n.
Um n´umero composto n tal que existe a ∈ S(n) ´e chamado de pseudoprimo forte. Lema 3.3.2. Seja n ≥ 3 um inteiro ´ımpar. S(n) = Z∗n se, e somente se, n ´e primo.
Prova. Suponhamos que ∃a ∈ Z∗ntal que a n˜ao est´a em S(n), ent˜ao a ´e testemunha da composi¸c˜ao de n. Logo, n ´e composto.
Reciprocamente, seja n primo. Se a ∈ Z∗n arbitr´ario, temos que an−1≡ 1(mod n).
Como
(an−12 )2 = an−1≡ 1(mod n)
e a equa¸c˜ao x2 ≡ 1(mod n) tem somente duas solu¸c˜oes, a saber x = ±1, ent˜ao
an−12 = a2 t−1q
Se an−12 ≡ −1(mod n), ent˜ao a ∈ S(n). Agora, se a n−1 2 ≡ +1(mod n), novamente temos an−14 = a 2tq 4 = a2 t−2q ≡ ±1(mod n).
Prosseguindo desta maneira, para qualquer a ∈ Z∗n teremos ou aq ≡ 1(mod n) ou
a2jq
≡ −1(mod n) para algum j , 0 ≤ j < t.
Lema 3.3.3. Se n > 3 ´e um composto ´ımpar, ent˜ao |S(n)| ≤ n−14 .
Prova. Suponhamos que n = 1 + 2tq, com q ´ımpar, seja um n´umero composto.
Podemos escrever n = pe1
1 · · · perr. Seja k o maior inteiro tal que exista pelo
me-nos um b ∈ Z∗n com b2 k
≡ −1(mod n). Notamos que k est´a bem definido, pois (−1)20 ≡ −1(mod n) e assim k ≥ 0. Tamb´em temos k ≤ v(u) − 1, onde u ´e o menor inteiro positivo tal que au = 1, ∀a ∈ Z∗n e v(u) ´e o maior inteiro tal que 2v(u)|u.
Temos pi ≡ 1 (mod 2k+1), 1 ≤ i ≤ r, pelo Lema 3.3.1, ent˜ao n ≡ 1(mod 2k+1).
Tomemos m = 2kq. Ent˜ao 2m | (n − 1). Consideremos os seguintes subgrupos de Z∗n: J = {a ∈ Z∗n; an−1 ≡ 1(mod n)} K = {a ∈ Z∗n; am ≡ ±1(mod p ei i ), ∀i} L = {a ∈ Z∗n ; am ≡ ±1(mod n)} M = {a ∈ Z∗n; am ≡ 1(mod n)} . Temos M ⊆ L ⊆ K ⊆ J ⊆ Z∗n.
Vemos que todo a ∈ S(n) tamb´em pertence a L, pois se aq ≡ 1(mod n), ent˜ao
´e ´obvio que am ≡ 1(mod n), enquanto que se a2sq
≡ −1(mod n) para algum s ent˜ao s ≤ k, pela defini¸c˜ao de k. Mostraremos que, desde que n 6= 9, L ´e um subgrupo de ´ındice pelo menos 4 em Z∗n e, a partir disto, temos que |S(n)| ≤
n−1 4 .
Todo elemento de G = {a ∈ Z∗n; a ≡ ±1(mod p ei
i ), ∀i} ´e uma 2k-´esima potˆencia; da´ı
uma m-´esima potˆencia, basta tomar x ≡ b ou x ≡ b2(mod pei
i ) que implica que x2 k
≡ ±1(mod pei
i ) para cada i. Dessa maneira, M tem ´ındice 2r em
K = {a ∈ Z∗n ; am ∈ G}. Analogamente, M tem ´ındice 2 em L. Assim,
(K : L) = 2r−1. Logo, (Z∗n : L) ≥ (Z ∗ n: J )(K : L) = 2 r−1 (Z∗n : J ). Se r ≥ 3, segue que (Z∗n : J ) ≥ 4.
No entanto, se r = 2 ent˜ao n n˜ao pode ser um n´umero de Carmichael que ´e divis´ıvel por pelo menos 3 primos distintos (Lema 3.2.1). Ent˜ao ∃a ∈ Z∗ncom an−16≡ 1(mod n),
e assim J ´e um subgrupo pr´oprio de Z∗n e portanto (Z∗n : J ) ≥ 2. Logo, (Z∗n: L) ≥ 4. Finalmente, se r = 1 ent˜ao n = pe, e ≥ 2. Mas ent˜ao, |J | = p − 1, e (Z∗
n : J ) =
= pe−1 ≥ 4, exceto quando pe = 9. Quando n = 9 existem exatamente 2 elementos
de S(n), a saber 1 e −1. Ent˜ao, o n´umero de elementos ´e ≤ n−14 .
Como resultado deste lema, descreveremos um algoritmo para testar a primali-dade de n [7, Cap.9].
Algoritmo 2 (MILLER-RABIN(n)). 1. escolha a ∈ {1, . . . , n − 1} aleat´orio 2. escreva n − 1 = 2tq, q ´ımpar
3. calcule sucessivamente a0 = aq(mod n), a1 = a20(mod n), . . . , ak = a2k−1(mod n)
at´e que k = t ou ak ≡ 1(mod n)
4. se k = t e ak6≡ 1(mod n) retorne “composto”
5. sen˜ao se k = 0 ent˜ao retorne “primo”
6. sen˜ao se ak−16≡ −1 (mod n) ent˜ao retorne “composto”
7. sen˜ao retorne “primo”
Teorema 3.3.2. Se n ´e primo, ent˜ao MILLER-RABIN sempre retornar´a “primo”. Prova. No passo (4) nunca retornar´a “composto”, j´a que sempre existe j tal que a2jq ≡ 1(mod n), 1 ≤ j ≤ t. Seja k o menor ´ındice tal que ak ≡ 1(mod n), isto
´e, ak = a2 kq
≡ 1(mod n). Se k = 0, o algoritmo retornar´a “primo” em (5). Caso contr´ario, devemos ter ak−1 ≡ −1(mod n), o algoritmo retorna “primo” nos passos
(6) e (7).
Teorema 3.3.3. Se n ´e um n´umero composto, ent˜ao o algoritmo MILLER-RABIN re-torna “composto” para pelo menos 34 de todos os a ∈ Z∗n.
Prova. Seja n um composto ´ımpar. Se a 6∈ Z∗n, ent˜ao nunca acontecer´a a situa¸c˜ao onde teremos a2tq
≡ 1(mod n). Teremos ent˜ao k = t e ak 6≡ 1(mod n). Logo, o passo
(4) declarar´a que n ´e composto.
Agora, se a ∈ Z∗n, pelo Lema 3.3.3 temos que pelo menos 3/4 de todos a ∈ Z ∗ n s˜ao
testemunhas fortes da composi¸c˜ao de n e para estes valores de a o algoritmo retornar´a “composto”.
Observamos que a maior parte do tempo gasto pelo algoritmo ´e para calcular aq,
a2q, . . ., a2tq
(mod n). Podemos calcular aq(mod n) usando O(lg3n) bit opera¸c˜oes via
um algoritmo que calcula potˆencias m´odulo n (detalhes da complexidade do algoritmo em [7, Teorema 9.4.5]) , e para calcular o restante das potˆencias fazendo o quadrado m´odulo n que tamb´em usa O(lg3n) bit opera¸c˜oes.
Desta forma, se n ´e primo, o algoritmo responder´a corretamente que n ´e primo. Mas, se n ´e composto, as chances do algoritmo retornar “primo” ´e de no m´aximo
1
4. Assim, o algoritmo procurar´a encontrar uma testemunha de composi¸c˜ao para n.
Se nenhuma testemunha ´e encontrada, ent˜ao ´e declarado “primo” com probabilidade de acerto de pelo menos 1 − 14. E se n˜ao ´e detectada nenhuma testemunha ap´os k aplica¸c˜oes do teste de Miller-Rabin com diferentes bases aleat´orias, a taxa de erro diminui para 41k.
Entretanto, tal taxa de erro ´e frequentemente muito menor. Monier [26] d´a uma f´ormula exata para esta margem de erro, que nunca excede (φ(n)/2r−1 − 2)/(n − 3)
onde r ´e o n´umero de fatores primos distintos de n e φ(n) ´e a fun¸c˜ao de Euler. Miller [25] e Bach [8] observaram que se assumirmos que a Hip´otese Generalizada de Riemann ´e verdadeira, um n´umero ´e primo se, e somente se, passa pelo teste para todas as bases a com 1 < a ≤ 2(log(n))2. Isto faz com que o teste de Miller-Rabin
se torne determin´ıstico. Tamb´em podemos obter uma vers˜ao determin´ıstica para o teste de Solovay-Strassen considerando a Hip´otese Generalizada de Riemann.
3.4
Teste de Agrawal-Kayal-Saxena
At´e h´a pouco tempo atr´as, os algoritmos existentes para testar primalidade ou eram probabil´ısticos com complexidade polinomial ou eram determin´ısticos mas pouco eficientes ou dif´ıceis de implementar.
Por´em em 2002, Agrawal, Kayal e Saxena do Instituto Indiano de Tecnologia em Kanpur anunciaram um teste de primalidade determin´ıstico polinomial que sempre funciona sem considerar conjecturas. Al´em disso, as ferramentas matem´aticas empre-gadas s˜ao consideravelmente mais simples que em testes anteriores (em particular, o teste APR [2]).
A id´eia b´asica de tal teste tem como suporte o seguinte teorema. Teorema 3.4.1. Suponha que a ∈ Z∗p. Ent˜ao p > 1 ´e primo se, e s´o se,
(x − a)p ≡ (xp− a) (mod p). (3.4.1)
Prova. Pelo Teorema Binomial de Newton, temos que (x − a)p = = Pp
i=0
p i
=Pp−1 i=1 p i (−1)p−ixiap−i.
Supondo p primo, temos ap ≡ a mod p (Lema 3.4.4). Caso p ´ımpar, ent˜ao (−a)p = −ap ≡ −a mod p. Caso p = 2, temos −a ≡ a mod 2, da´ı (−a)p =
= ap ≡ a ≡ −a mod 2. Logo, P (x) = (x − a)p− (xp− a). Como p
i
≡ 0 (mod p) para 1 ≤ i < p, j´a que p aparece no numerador de p
i
, mas n˜ao no denominador. Logo, P (x) ≡ 0 (mod p).
Suponhamos que p seja composto. Seja q um primo divisor de p e seja k ≥ 1 o maior inteiro tal que qk | p (p = qkc, c ∈ Z). Temos que p
q
= q!(p−q)!p! = = (q−1)!(p−q)!qk−1c(p−1)!.
Vamos mostrar que p n˜ao divide p q
. Suponhamos que p divide p q . Ent˜ao qk divide p q
. Isto significa que q divide (p − 1)! (q − 1)!(p − q)! = (p − 1)(p − 2) · · · (p − q + 1)(p − q)! (q − 1)!(p − q)! = (p − 1)(p − 2) · · · (p − q + 1) (q − 1)! .
Logo, q|(p − j) para algum j ∈ {1, . . . , q − 1}. Assim, q|j, o que ´e contradi¸c˜ao pois j < q e q primo.
Desta forma, p q
6≡ 0 (mod p), 1 < q < p. Sendo mdc(a, p) = 1, ent˜ao p
q
ap−q 6≡ 0 (mod p), que ´e o coeficiente de xqem (x−a)p. Mas como o coeficiente
de xq em xp− a ´e nulo, temos xp− a 6≡ (x − a)p mod p.
Examinando a expans˜ao binomial inteira de (x − a)n, tal resultado nos garantiria
uma maneira infal´ıvel de saber se n ´e primo, pois caso todos os termos que est˜ao no “meio” da expans˜ao tivessem coeficientes divis´ıveis por n, ent˜ao n seria primo, caso contr´ario ter´ıamos n composto.
Mas um detalhe torna este tipo de teste impratic´avel, j´a que para n muito grande, teremos que examinar muitos termos na expans˜ao binomial.
A id´eia do AKS ´e tornar o teste binomial r´apido e ainda ser capaz de provar que o teste responde corretamente mesmo quando n ´e composto. Ao inv´es de trabalharmos com m´odulo n, trabalhamos com m´odulo um polinˆomio xr− 1 (onde r ´e um primo
razoavelmente pequeno). Ou seja, no lugar de calcular (x − a)n, calcula-se o resto da
divis˜ao de (x − a)n por xr− 1, que ´e feito usando o mesmo m´etodo em ´Algebra para
dividir um polinˆomio por outro. Dessa maneira, teremos no m´aximo r − 1 termos para examinar , enquanto que na expans˜ao de (x − a)n temos n − 1.
Como a congruˆencia original funciona sempre que n ´e primo, ent˜ao ´e ´obvio que a nova congruˆencia
(x − a)n≡ (xn− a) mod (xr− 1, n) (3.4.2)
tamb´em funciona quando n ´e primo, pois se duas coisas s˜ao iguais, ent˜ao quando se divide essas duas coisas por xr− 1, os restos s˜ao iguais tamb´em. O que n˜ao ´e ´obvio ´e que a nova congruˆencia ´e sempre falsa quando n ´e composto, pois mesmo quando
(x − a)n 6≡ (xn− a) (mod n)
´e poss´ıvel que dois diferentes polinˆomios tenham o mesmo resto quando divididos por xr− 1. O que o AKS mostra ´e que se n ´e composto, e se escolhemos o valor “certo”
de r, ent˜ao precisamos testar apenas um n´umero pequeno de a’s at´e encontrarmos um tal que
(x − a)n 6≡ (xn− a) mod (xr− 1, n).
Uma vez que encontramos tal a, provamos que n ´e composto. Ademais, n˜ao precisamos tomar a aleatoriamente, existe uma forma determin´ıstica para fazer isto.
A seguir, estabeleceremos alguns resultados que ser˜ao usados posteriormente.
3.4.1
Teoria dos N´
umeros
Lema 3.4.1. Seja π(n) o n´umero de primos positivos ≤ n. Ent˜ao n
6 log2n ≤ π(n) ≤ 8n log2n, ∀n ≥ 1.
Prova. No Teorema 4.6 em [5, Cap. 4], temos a seguinte desigualdade: n
6 log n ≤ π(n) ≤ 8n log n.
Vamos mostrar que a desigualdade tamb´em ´e v´alida para o logaritmo na base 2. Como log n ≤ log2n, ent˜ao π(n) ≥ 6 log nn ≥ n
6 log2n.
π(n) ≤ n log n 6 log 2 +3 e = nlog2e log2n 6 log 2 + 3 e = nlog2e log2n 6 1 log2e + 3 e = n log2n 6 + 3 log2e e ≤ n log2n 6 + 3 × 1, 45 e ≤ 8n log2n. Portanto, n 6 log2n ≤ π(n) ≤ 8n log2n. Lema 3.4.2. Sejam n ≥ 2, k ≥ 1 e d ≥ 1 inteiros tais que (nk− 1)|(nd− 1). Ent˜ao
k|d.
Prova. Seja d = qk + r, q ≥ 1 e 0 ≤ r < k. Observemos que nd− 1 nk− 1 = nr(nqr− 1) + (nr− 1) nk− 1 = nr(1 + nk+ n2k+ · · · + n(q−1)k) + n r− 1 nk− 1.
Logo, (nr − 1)/(nk− 1) ´e um inteiro, pois (nk− 1) divide (nd− 1). Se 1 ≤ r < k,
ent˜ao 0 < (nr− 1)/(nk− 1) < 1 o que n˜ao ´e poss´ıvel. Portanto, r = 0.
Para o pr´oximo lema, consideraremos a fun¸c˜ao
π0(x) = |{p ; p ´e primo , 2 ≤ p ≤ x e P (p − 1) > x2/3}| onde P (n) ´e o maior divisor primo de n.
Lema 3.4.3. Existe uma constante c > 0 tal que π0(x) ≥ c x
log2x para x suficientemente grande.
Prova. Em [15] temos que π0(x) ≥ clog xx . Como na demonstra¸c˜ao do Lema 3.4.1, obtemos π0(x) ≥ clogx
2x.
Lema 3.4.4. Sejam p primo e a um inteiro positivo. Ent˜ao ap ≡ a (mod p).
Prova. Ver demonstra¸c˜ao em [32, Corol´ario 2.1]
3.4.2
Corpos finitos
Sejam p um n´umero primo positivo e d ≥ 1 um inteiro. O anel Zp ´e um corpo
com p elementos. Seja h(x) um polinˆomio irredut´ıvel de grau d no anel Zp[x], ou
seja, n˜ao existem polinˆomios a(x) e b(x) em Zp[x] ambos com grau ≤ d tais que
a(x)b(x) = h(x) em Zp[x]. O anel F := Zp[x]/(h(x)) consiste de todos os polinˆomios
Lema 3.4.5. O anel F ´e um corpo com pd elementos.
Prova. Como existem exatamente pd polinˆomios em Z
p[x] com grau ≤ d, ´e ´obvio
que |F | = pd. Para efeito de demonstra¸c˜ao de que F ´e corpo, mostraremos somente
que cada polinˆomio n˜ao-nulo f (x) em F tem um inverso multiplicativo em F . Como o grau de f (x) ´e ≤ d e como h(x) ´e irredut´ıvel, temos que mdc(f (x), h(x)) = 1. Usando o algoritmo estendido de Euclides, obtemos dois polinˆomios a(x) e b(x) em Zp[x] tais que
a(x)f (x) + b(x)h(x) = 1
em Zp[x]. Portanto, a(x) mod h(x) ´e o inverso multiplicativo de f (x).
Lema 3.4.6. Sejam K um corpo, f (x) um polinˆomio em K[x], e d ≥ 1 o grau de f (x).
1. Existem no m´aximo d elementos α ∈ K tais que f (α) = 0.
2. Existem polinˆomios irredut´ıveis g1(x), . . . , gm(x) em K[x], para algum inteiro
m, tal que f (x) = Qm
i=1gi(x).
Prova. As demonstra¸c˜oes dos itens 1 e 2 se encontram em [22, Cap. 1] no Teorema 1.66 e no Teorema 1.59, respectivamente.
Lema 3.4.7. O grupo multiplicativo K∗ de qualquer corpo K ´e c´ıclico.
Prova. Sejam q o n´umero de elementos de K. Podemos assumir que q ≥ 3, ou seja, que K ´e um corpo n˜ao-trivial. Seja s := q − 1 a ordem de K∗ e s = pr1
1 . . . prmm a sua
decomposi¸c˜ao.
Para cada 1 ≤ i ≤ m, o polinˆomio xs/pi − 1 tem no m´aximo s/p
i ra´ızes em K,
conforme Lema 3.4.6. Como s/pi < s, existe um elemento n˜ao nulo ai ∈ K∗ tal
que as/pi
i 6= 1, pois s ´e a ordem de K
∗. Seja b i := a
s/prii
i . Como K
∗ ´e um grupo
multiplicativo de ordem s e ai ∈ K∗ ent˜ao asi = 1. Segue que b prii
i = asi = 1. Seja ei
a ordem multiplicativa de bi em K. Ent˜ao ei|prii. Sendo pi um n´umero primo, temos
que ei = psii para algum 0 ≤ si ≤ ri. Por outro lado, temos que b pri−1i
i = a
s/pi i 6= 1.
Logo, si = ri e ei = prii.
Seja b := b1. . . bm, e e a ordem multiplicativa de b em K. Afirmamos que b ´e um
gerador de K∗, ou seja, e = s. Suponhamos, por absurdo, o contr´ario. J´a que bs= 1,
seque que e|s. Sendo e um divisor pr´oprio de s, existe um ´ındice 1 ≤ i ≤ m tal que e divide s/pi. Suponhamos, sem perda de generalidade, que i = 1. Como be = 1, temos
que bs/p1 = 1. Observamos que
bs/p1 = bs/p1 1 . . . b
s/p1 m .
Consideremos 2 ≤ j ≤ m qualquer. Temos que prj
j divide s/p1. Como b prjj j = 1, segue que bs/p1 j = 1. Assim, 1 = bs/p1 = bs/p1 1 . . . b s/p1 m = b s/p1 1 .
Segue que a ordem de b1 divide s/p1. Como a ordem de b1 ´e pr11 e s/p1 =
= pr1−1 1 p
r2
2 . . . prmm, temos uma contradi¸c˜ao.
Lema 3.4.8. Seja p ≥ 2 um primo e f (x) um polinˆomio em Zp[x]. Ent˜ao,
f (x)p ≡ f (xp) (mod p).
Prova. A demonstra¸c˜ao ser´a feita por indu¸c˜ao sobre o grau d de f (x).
Se d = 0 ent˜ao f (x) = a para algum a ∈ Zp. Sendo p primo, temos que
ap ≡ a (mod p) (Lema 3.4.4). Logo, o resultado ´e verdadeiro.
Seja d ≥ 1. Suponhamos que o resultado seja verdadeiro para todos os polinˆomios em Zp[x] cujos graus sejam < d. Podemos reescrever f (x) = axd+ g(x), onde a ∈ Zp
e g(x) ´e um polinˆomio em Zp[x] de grau menor do que d. Ent˜ao,
(f (x))p = (axd+ g(x))p = p X i=0 p i aixid(g(x))p−i. Como p i
≡ 0 (mod p) para 1 ≤ i ≤ p − 1, temos (f (x))p = (g(x))p+ apxpd.
Pela hip´otese de indu¸c˜ao, (g(x))p ≡ g(xp) (mod p) e sendo ap ≡ a (mod p),
conclu´ımos que
(f (x))p = g(xp) + a(xp)d= f (xp).
Lema 3.4.9. Seja h(x) um fator qualquer de xr − 1. Se m ≡ m
r (mod r), ent˜ao
xm ≡ xmr (mod h(x)).
Prova. Seja m = kr +mr. Como, xr ≡ 1 mod (xr−1), ent˜ao xkr ≡ 1 mod (xr−1)
⇒ xkr+mr ≡ xmr mod (xr− 1) ⇒ xm ≡ xmr mod (xr− 1).
Portanto, xm ≡ xmr (mod h(x)).
Lema 3.4.10. Sejam p e r primos positivos distintos e d = ordrp . Ent˜ao, todo
polinˆomio irredut´ıvel em Zp[x] que divide x r−1
x−1 tem grau d.
Prova. Seja h(x) um polinˆomio irredut´ıvel em Zp[x] que divide x r−1
x−1 e cujo grau ´e
k. Pelo Lema 3.4.5, temos que F ´e um corpo com pk elementos. Tamb´em temos que
F∗ ´e c´ıclico de ordem pk− 1. Seja g(x) um gerador de F∗. Usando o Lema 3.4.8,
temos g(x)p ≡ g(xp) (mod p) ⇒ g(x)pd ≡ g(xpd) (mod p).
Seja f (x) o polinˆomio em Zp[x] tal que f (x)g(x) = xr − 1. Sendo
pd ≡ 1 (mod r) e usando o Lema 3.4.9, temos que xpd ≡ x mod h(x). Logo,
(g(x))pd ≡ g(x) mod h(x).
Sendo g(x) um gerador, g(x) 6≡ 1 mod h(x). Logo, g(x) tem um inverso multi-plicativo no corpo F , o que implica (g(x))pd−1 ≡ 1 mod h(x).
Como pk− 1 ´e a ordem de g(x), temos que (pk− 1)|(pd− 1) ⇒ k|d, conforme o
Lema 3.4.2.
Al´em disso, h(x)|(xr − 1) em Z
p[x] e, consequentemente, em F . Logo,
xr≡ 1 mod h(x). J´a que r ´e primo, ent˜ao r = ord
h(x)x. Como a ordem de F∗´e pk−1
temos que xpk−1
≡ 1 mod h(x), que implica r|(pk − 1), ou seja,
pk ≡ 1 (mod r). Logo, d|k. Portanto, d = k.
3.4.3
O algoritmo AKS
Primeiramente, apresentaremos o algoritmo AKS [3] e posteriormente discutiremos se o algoritmo funciona e sua complexidade.
Algoritmo 3 (AKS(n)). n ´e um inteiro positivo
1. se n ´e da forma ab, b > 1, ent˜ao retorne “composto”;
2. r = 1;
3. enquanto r < n fa¸ca
4. se mdc(n, r) 6= 1, ent˜ao retorne “composto”; 5. se r ´e primo, ent˜ao
7. se q ≥ d4√r log2ne e nr−1q 6≡ 1 (mod r), pare;
8. r ← r + 1;
9. para a = 1 at´e d2√r log2ne
10. se (x − a)n 6≡ (xn− a) mod (xr− 1, n), retorne “composto”;
11. Retorne “primo”.
No artigo [9] ´e proposto um algoritmo r´apido que detecta, em tempo polinomial, se um inteiro n > 1 ´e uma potˆencia perfeita ou n˜ao. Assim, o passo (1) do AKS pode ser executado em tempo polinomial.
O algoritmo possui dois loops. No primeiro loop, o algoritmo tenta encontrar um primo r tal que r − 1 tem o maior fator primo q ≥ d4√r log2ne e que q divida a ordem multiplicativa de n m´odulo r.
Para analisar se o algoritmo est´a correto e sua complexidade, consideraremos o lema a seguir.
Lema 3.4.11. Para cada n suficientemente grande, existem constantes c1 e c2
po-sitivas para os quais existe um primo r, onde c1(log2n)6 ≤ r ≤ c2(log2n)6 tal que
q = P (r − 1) ≥ 4√r log2n e q|ordrn.
Prova. Sejam c como no Lema 3.4.3 e P (r−1) o maior fator primo de r−1. Seja R o n´umero de primos r’s no intervalo [c1(log2n)6, c2(log2n)6] tal que
Assim, R = π0(c2(log2n) 6 ) − π0(c1(log2n) 6 ) ≥ π0(c2(log2n)6) − π(c1(log2n)6), pois π(x) ≤ c0logx 2x ≤ π
0(x) para algum c0, de acordo com os Lemas 3.4.1 e 3.4.3.
Ent˜ao, R ≥ c c2(log2n) 6 log2(c2(log2n)6) − π(c1(log2n) 6) ≥ c c2(log2n)6 log2(c2(log2n)6) − 8 c1(log2n)6 log2(c1(log2n)6) ≥ c c2(log2n) 6
log2c2+ 6 log2(log2n)
− 8 c1(log2n)
6
log2c1+ 6 log2(log2n)
. Como c2 ≤ log2n para n suficientemente grande, ent˜ao
R ≥ c c2(log2n)
6
log2(log2n) + 6 log2(log2n) − 8
c1(log2n)6
log2c1+ 6 log2(log2n)
≥ c c2(log2n) 6 7 log2(log2n) − 8 c1(log2n)6 6 log2(log2n) = (log2n) 6 log2(log2n) cc2 7 − 8c1 6 .
Seja c3 := cc72 − 8c61. Escolhemos c1 ≥ 46e c2 tal que c3 > 0. Seja x := c2(log2n)6
e definimos N := (n − 1)(n2− 1) · · · (nbx1/3c
− 1) = Qbx1/3c
i=1 (n i− 1).
Como qualquer inteiro positivo m tem no m´aximo log m fatores primos, ent˜ao o i-´esimo termo no produto acima tem no m´aximo i log m ≤ i log2n ≤ bx1/3c log
2n ≤
≤ x1/3log
2n fatores primos. Logo, N tem x2/3log2n fatores primos, no m´aximo.
Observamos que
x2/3log2n = c2/32 (log2n)5 < c3(log2n)
6
log2(log2n).
Ent˜ao, existe um primo r tal que c1(log2n)6 ≤ r ≤ c2(log2n)6 e P (r − 1) ≥ r2/3,
De fato, sendo r2/3 = r1/6√r e que r1/6 ≥ c1/61 log2n ≥ 4 log2n, ent˜ao r2/3 ≥ 4√r log2n.
Antes de provarmos que q|ordr(n), mostraremos que q|ordr(n) ´e equivalente a
nr−1q 6≡ 1 mod r.
Suponhamos que q|ordr(n). Como q ≥ 4
√
r log2n, ent˜ao q ≥ r2/3 > √r > > (r − 1)1/2 ⇒ q2 > r − 1 ⇒ q > r−1
q . Sendo ordr(n) > q, ent˜ao ordr(n) > r−1
q ⇒
⇒ nr−1q 6≡ 1 mod r (pela defini¸c˜ao de ord r(n)).
Suponhamos que q - ordr(n). Como ordr(n)|(r − 1) (pois mdc(n, r) e
nr−1 ≡ 1 mod r), temos que r − 1 = ord
r(n) · d ⇒ ordr(n)|r−1q ⇒ n r−1
q ≡ 1 mod r.
Agora podemos mostrar que q|ordr(n). De fato, suponhamos, por absurdo, que
nr−1q ≡ 1 (mod r). Ent˜ao, r|(n r−1 q − 1). Como q ≥ r2/3, r ≤ c 2(log2n)6 e x = c2(log2n)6, temos r − 1 q < r q ≤ r r2/3 = r 1/3≤ (c 2(log2n)6)1/3= x1/3.
Assim (nr−1q −1) ´e um termo de N . Mas isto implica que r|N , o que ´e contradi¸c˜ao.
Observamos que como q ´e um inteiro (pois ´e primo), teremos que q ≥ d4√r log2ne. Teorema 3.4.2. Se n ´e primo, ent˜ao o algoritmo retorna “primo”.
Prova. O primeiro loop n˜ao retornar´a “composto” pois mdc(n, r) 6= 1 para todo r ≤ c2(log2n)6 onde c2 ´e como no Lema 3.4.11. Ent˜ao, no segundo loop tamb´em n˜ao
retorna ”composto”, pois a congruˆencia (3.4.2) sempre ser´a satisfeita. Portanto, o algoritmo sempre retorna ”primo”quando n for primo.
Agora, vamos verificar se o algoritmo funciona quando temos n composto como entrada. Vamos considerar que n n˜ao seja uma potˆencia perfeita e que todo fator primo de n seja maior do que r, pois caso contr´ario n seria detectado como composto no passo (1) ou (4) do algoritmo. Vamos mostrar que n ser´a detectado no segundo loop.
Seja n = pe1 1 · · · p
ek
k a decomposi¸c˜ao de n. Neste caso, ordrn|mmc{ordr(pi)}ki=1. De
fato, se λ =mmc{ordr(pi)}ki=1, ent˜ao λ = ordr(pi)mi, mi escolhido para cada ordr(pi).
Logo, nλ = k Y i=1 peiλ i = k Y i=1 pei·ordr(pi)mi i = k Y i=1 (pordr(pi) i ) eimi = 1.
Desta forma, existe um primo p fator de n tal que q|ordrp onde q = P (r − 1) para
o r encontrado no primeiro loop, pois todo fator primo de mmc{ordr(pi)}ki=1 ´e um
fator primo para pelo menos uma ordr(pi) De agora em diante, p ser´a tal fator primo
de n.
No segundo loop, o algoritmo usa o valor de r encontrado para fazer o c´alculo de l = d2√r log2ne binˆomios: (x − a) para 1 ≤ a ≤ l.
Pelo Lema 3.4.10, temos um polinˆomio h(x) que ´e fator de xr − 1 de grau
d = ordr(p), onde p ´e o fator primo de n tal que q|ordrp e tal polinˆomio ´e irredut´ıvel