Você está na página 1de 4

Teste de primalidade de Miller-Rabin

O teste Miller-Rabin (por Gary Miller e Michael Rabin) um teste probabilistico da primitividade
de um dado nmero n. Se um nmero n no passar pelo teste, n com certeza um nmero composto
(ou seja, no-primo). Se o nmero passar no teste, ele primo, com uma probabilidade P(nP)0,75,
sendo que P denomina o conjunto de todos nmeros primos.
A margem de erro pode ser diminuda aleatoriamente, aplicando-se o teste vrias vezes ao mesmo
nmero n.
O teste parecido com o o teste Solovay-Strassen, portanto sua margem de erro bem menor.
A importncia desse algoritmo se deve criptografia assimtrica, onde a necessidade de uma grande
quantidade de nmeros primos grandes vital para a segurana dos algoritmos. Tais nmeros so
to grandes que testes no probabilisticos como o da simples diviso por nmeros primos menores
que o nmero gerado ou o tabelamento de todos os nmeros primos so impraticveis.
importante dizer que o teste Miller-Rabin, ou Rabin-Miller como as vezes tambm chamado,
no d indcios sobre a fatorizao no nmero n. Devido suas caractersticas, esse teste o mais
utilizado para o teste da primitividade.

Funcionamento
Seja n um nmero primo e a um nmero inteiro escolhido aleatriamente, tal que 1<a<p.
Seja s = max {r
Seja d =

N:

divide(n1)}. s o maior expoente, tal que

(n1).

. Por definio de s, d , necessariamente mpar.

Teorema: Se n um nmero primo e a no tiver um divisor em comum com p, ento


1 mod n

ou, existe um r

{0,1,...,s1}, tal que

1 mod n
Um nmero a que no satisfaz o teorema acima denominado de testemunha contra a primalidade de n.

Teste de primalidade de Eratstenes


O Crivo de Eratstenes um mtodo bastante prtico para encontrar os primos de 2 at um valor
limite, que pode ser feito a mo e fcil de implementar.

O algoritmo consiste em:


1.Determinar (ou receber na entrada do programa) o valor limite, isto , o maior nmero que
desejamos saber se primo.
2.Fazer a raiz quadrada do valor limite. Pode-se arredondar para baixo caso a raiz no seja
exata (e quase nunca ).
3.Criar um vetor (lista) com os nmeros de 2 at o valor limite.
4.Para i=2 at raiz do valor limite, caso o nmero (i) no esteja riscado insira-o na lista dos
primos (ou imprima-o, ou no faa nada, isso depende da utilidade que voc quer dar para o
crivo) e risque todos os seus mltiplos na lista.
H vrias maneiras de implementar este algoritmo. ele assim:
/* primeiro passo */
recebe valorLimite
/* Segundo passo */

raiz
/* Terceiro passo */
para i 2 at valorLimite
vetor[i] i
fim-para
/* Quarto passo */
para i 2 at raiz
se vetor[i] = i
imprima "O nmero " i " primo."
para j i + i at valorLimite, de i e i
vetor[j] 0
fim-para
fim-se
fim-para

CRIVO DE ERATSTENES IMPLEMENTADO EM C

#include <stdio.h>
#include <math.h> // necessrio para raiz
#define NMAX 1000000 // valor mximo para o valor mximo
int main() {
int i, j, vetor[NMAX];
int valorMaximo, raiz;
// Primeiro passo
scanf("%d", &valorMaximo);
// Segundo passo
raiz=sqrt(valorMaximo);
// Terceiro passo
for (i=2; i<=valorMaximo; i++) {
vetor[i]=i;
}
// Quarto passo
for (i=2; i<=raiz; i++) {
if (vetor[i]==i) {
printf("%d primo!n", i);
for (j=i+i; j<=valorMaximo; j+=i) {
vetor[j]=0; // removendo da lista
}
}
}
return 0;
}

Você também pode gostar