Mencionamos na introdução deste capítulo que
não se conhece nenhuma fórmula simples
para gerar primos arbitrariamente grandes.
Uma palavra imprecisa mas importante nesta frase é ``simples''.
Existem fórmulas que geram números primos,
mas que são tão complicadas que não ajudam muito nem a gerar
números primos explicitamente nem a responder perguntas teóricas
sobre a distribuição dos primos.
Um exemplo de fórmula para pn, o n-ésimo primo, é
Um tipo de fórmula para primos, de certa forma mais intrigante,
são polinômios de coeficientes inteiros
em S variáveis com a seguinte propriedade quase mágica:
a interseção da imagem de
com
é exatamente o conjunto dos números primos.
Note que se tomarmos um ponto de
``ao acaso'',
o valor do polinômio neste ponto quase certamente será negativo;
assim, é difícil usar o polinômio para gerar primos.
A título de curiosidade, vejamos um exemplo de polinômio
com estas propriedades; aqui N = 26, o valor do polinômio é P,
as variáveis chamam-se
e
são expressões auxiliares:
Algumas observações simples: a única forma de P ser positivo
é se
;
neste caso seu valor será k+2.
Vemos assim que para produzir um número primo P com este polinômio
devemos antes de mais nada tomar k = P-2.
As expressões auxiliares viram equações:
como A = 0 temos
q = wz + h + j.
Assim, dado k para o qual k+2 é primo,
precisamos procurar valores para as outras letras
que satisfaçam estas equações.
Estes valores de certa forma encodificam
uma demonstração de que P = k+2 é primo.
Uma questão relacionada com a de gerar números primos é a de testar se um determinado número é primo. Existe um algoritmo bastante simples para testar se qualquer inteiro positivo n é primo: calcule o resto da divisão de npor cada inteiro m com . Se o resto for 0 em algum caso então n é composto e encontramos um divisor; se isto nunca ocorrer, n é primo. O inconveniente deste algoritmo é que ele é muito lento: mesmo para um inteiro de 200 algarismos, teríamos que fazer aproximadamente 10100 divisões o que não só está fora do alcance da tecnologia atual mas fora do alcance de qualquer tecnologia plausível de acordo com o que se conhece de física 3.1.
Alguns teoremas de teoria dos números podem ser usados para testar a primalidade de um inteiro positivo n. Pelo teorema de Wilson, por exemplo, podemos testar a primalidade de n calculando ; infelizmente, esta conta parece ser tão difícil de efetuar quanto a busca de divisores pelo algoritmo anterior. Observe que dizemos apenas que a conta parece difícil: não está excluída a possibilidade de alguém inventar um algoritmo rápido para calcular .
Uma idéia mais bem sucedida é a de usar o pequeno teorema de Fermat:
tomamos a, 1 < a < n, e calculamos
.
Se n for primo teremos
;
qualquer outro resultado indica que n é composto
mesmo sem termos encontrado um fator de n.
Observe que para calcular
não precisamos
calcular
,
n - 1 vezes.
Podemos fazer esta conta com menos de
operações
envolvendo inteiros menores do que n2:
se
,
,
então definimos
Se
,
por outro lado,
não demonstramos que n é primo;
se n for composto satisfazendo
dizemos que n é um pseudoprimo na base a.
Pseudoprimos existem mas são raros (ver (Cipolla]):
o menor pseudoprimo na base 2 é
e existem apenas 21.853 pseudoprimos na base 2 menores do que
(contra
1.091.987.405 primos).
Pomerance (melhorando um resultado anterior de Erdös) provou que
se
é o número de pseudoprimos até x na base a temos
Proposição 3.1:
Seja a > 1 e p primo, p > 2. Então
Dem:
Pelo pequeno Teorema de Fermat,
Uma idéia natural é a de testar vários valores de a.
Claramente, se (a,n) > 1, teremos
;
entretanto, se n for um produto de uns poucos primos grandes
os valores de a para os quais (a,n) > 1 são raros
e se formos obrigados a encontrar um tal valor de ateremos feito muito pouco progresso em relação aos primeiros algoritmos.
Aliás, uma vez encontrado a com (a,n) > 1 é fácil
encontrar (a,n) pelo algoritmo de Euclides,
o que nos dá uma fatoração (parcial) de n.
É um fato interessante que existam alguns raros números compostos n,
chamados números de Carmichael,
com a propriedade que se 0 < a < n e (a,n) = 1então
.
Foi até demonstrado recentemente por Alford, Granville e Pomerance
que se CN(x) é o número de números de Carmichael menores do que x então
Podemos refinar o conceito de pseudoprimo para definir pseudoprimos fortes na base a. Para definir quando n é um pseudoprimo forte na base ainicialmente escrevemos , com b ímpar. Se n > 2 é primo deve existir um menor valor de jpara o qual (observe que por Fermat ). Se j = 0 isto significa que ; caso contrário temos já que -1 é o único valor de x diferente de 1 (módulo n) para o qual . Assim, dizemos que n composto ímpar é um pseudoprimo forte na base ase ou ou existe j' < k com . Claramente todo pseudoprimo forte na base aé um pseudoprimo na base a mas pseudoprimos fortes são mais raros do que pseudoprimos.
Observe que se n for pseudoprimo base a mas não pseudoprimo forte base a, então o teste acima não apenas demonstra que n é composto mas produz uma fatoração parcial de n. De fato, seja c = (ab)2j-1; temos , mas . Assim, n = (n,c-1)(n,c+1).
Existem infinitos pseudoprimos fortes em qualquer base a > 1:
Pomerance provou que, se
é o número de pseudoprimos
fortes na base a menores ou iguais a x então
Proposição 3.2: Seja n > 1, n composto ímpar. Então o número de inteiros a, 0 < a < n, para os quais n é um pseudoprimo na base aé menor do que n/2.
Dem: Seja a fatoração completa de n. Pelo Teorema chinês dos restos e pela existência de raízes primitivas módulo piei, podemos escrever . Se escrevamos , com bi ímpar, podemos também escrever , onde e Go tem ordem ímpar. Não é difícil ver que n é um pseudoprimo forte na base ase e somente se a ordem das componentes de ab em cada componente é a mesma (onde com b ímpar). Mas dada uma ordem (digamos, a ordem de ab em ) o número de elementos de com aquela ordem prescrita é no máximo a metade da ordem do grupo.
Na verdade pode-se demonstrar um resultado mais forte (quase certamente o melhor possível):
Teorema 3.3: Seja n > 1, n composto ímpar. Então o número de inteiros a, 0 < a < n, para os quais n é um pseudoprimo na base aé menor do que n/4.
A demonstração deste teorema será omitida; o leitor pode considerar isto como um exercício. O caso em que n tem três ou mais fatores primos distintos pode ser tratado como na demonstração da proposição.
O teorema acima serve de base para os testes de primalidade probabilísticos. Dado n, tomamos N valores de a ao acaso no intervalo 1 < a < ne verificamos para cada a se n passa no teste de primalidade na base a. Se n for ímpar composto, a probabilidade de que um dado aacuse a não-primalidade de a é maior do que 3/4 (pelo teorema); assim, a probabilidade de que n escape a N testes é menor do que 4-N. Mesmo para valores moderados de N podemos dizer, se n passar no teste, que n é provavelmente primo. Este tipo de teste é extremamente útil em aplicações (como em criptografia) onde é importante criar primos relativamente grandes mas não existe a preocupação com demonstrações ou com perfeição absoluta. Nosso ponto de vista neste livro, entretanto, é o de um matemático: queremos não apenas um teste probabilístico mas uma demonstração da primalidade de n. Para isto nosso teste não parece tão bom: para demonstrarmos que n é primo ainda somos obrigados a testar aproximadamente n/4 valores de a, o que é lento demais.
Existe uma variação do conceito de pseudoprimalidade forte. Suponhamos que , . Seja a um inteiro, 0 < a < n. O pequeno teorema de Fermat diz que se n é primo devemos ter . Suponhamos que isto ocorra: nosso teste refinado consiste em considerar o último termo não côngruo a 1 módulo n da seqüência : chamemos este termo de c(se ocorrer não podemos aplicar o teste). Temos claramente e ; se n for primo devemos obrigatoriamente ter . Em outras palavras, se sabemos que n é composto. Assim como no caso de pseudoprimos fortes, se n for pseudoprimo na base a mas falhar este teste para algum primo pacabamos de obter uma fatoração para n: .
Já enunciamos a hipótese de Riemann no capítulo 1. Existe uma generalização importante da hipótese de Riemann, chamada hipótese de Riemann generalizada. Uma descrição precisa do enunciado da hipótese de Riemann generalizada está fora dos nossos objetivos mas ela tem conseqüências muito importantes para testes de primalidade.
Teorema 3.4: (Teste de Miller) Se a hipótese de Riemann generalizada é verdadeira então para todo n ímpar composto existe tal que nnão é um pseudoprimo forte na base a.
Não daremos a demonstração do teorema acima; o leitor interessado deve consultar [Bach].
Uma demonstração da hipótese de Riemann generalizada implicaria assim na existência de um teste de primalidade rápido e geral: não é difícil verificar que o tempo necessário para verificar primalidade de n pelo teste de Miller é limitado superiormente por um polinômio em . Existe um outro algoritmo, bem mais sofisticado, devido a Adleman, Pomerance e Rumely, que demonstra (sem a necessidade de invocar conjecturas como a hipótese de Riemann) a primalidade de um primo n em um tempo limitado por para uma certa constante positiva c.
Existem muitos valores de n para os quais é possível demonstrar primalidade em um tempo muito menor do que pelo teste de Miller. Veremos duas grandes classes de testes especiais: quando conhecemos uma fatoração (pelo menos parcial) para n-1 e quando conhecemos uma fatoração (também pelo menos parcial) para n+1.