Teste `
a Primalidade
(M´
etodo de Monte Carlo)
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 1
Gera¸
c˜
ao de N´
umeros Primos (Grandes)
• Como se pode obter um n´umero primo grande? Gerando n´umeros grandes e testando se s˜ao primos.
• Se π(n) denotar o n´umero de primos que n˜ao excedem n, lim n→+∞ π(n) n ln n = 1. Exemplo: π(109) = 50 847 534 e ln 101099 ≈ 48 254 942.
• A probabilidade de um n´umero n escolhido aleatoriamente ser primo pode ser aproximada por ln n1 .
• Ser´a necess´ario testar cerca de ln n2 n´umeros ´ımpares pr´oximos de n para encontrar um que seja primo.
Aritm´
etica Modular
Propriedade 1 (P1)
((a mod k) × (b mod k)) mod k = (a × b) mod k
Propriedade 2 (P2)
Se a ≥ b e a mod k = b mod k, ent˜ao:
(a − b) mod k = 0.
Propriedade 3 (P3)
Se p ´e um n´umero primo e (a × b) mod p = 0, ent˜ao: a mod p = 0 ou b mod p = 0.
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 3
Lema de Fermat
Se p ´e um n´umero primo e x ´e um inteiro positivo tal que x mod p �= 0, ent˜ao
0 x mod p 1 x mod p · · · (p − 1) x mod p ´e uma permuta¸c˜ao de 0 1 · · · (p − 1).
Demonstra¸c˜ao
Se existissem i e j (0 ≤ i < j ≤ p − 1) tais que i x mod p = j x mod p, por (P2), (j − i) x mod p = 0 e, por (P3), (j − i) mod p = 0 ou x mod p = 0. Mas (j − i) mod p �= 0, porque 0 < (j − i) < p, e
Teorema de Fermat
[1640]
Sejam p um n´umero primo e x um inteiro positivo tal que x mod p �= 0. Ent˜ao, xp−1mod p = 1.
Demonstra¸c˜ao
Pelo Lema de Fermat, (1 x mod p) × · · · × ((p − 1) x mod p) = (p − 1)!
⇒ [(1 x mod p) × · · · × ((p − 1) x mod p)] mod p = (p − 1)! mod p (P1)
⇒ [(1 x) × · · · × (p − 1) x] mod p = (p − 1)! mod p ⇒ (p − 1)! xp−1 mod p = (p − 1)! mod p (P2) ⇒ [(p − 1)! xp−1 − (p − 1)!] mod p = 0 ⇒ (p − 1)! (xp−1− 1) mod p = 0 (P3) ⇒ (xp−1− 1) mod p = 0 (mod) ⇒ xp−1 mod p = 1
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 5
Pseudo-primos
Seja p ≥ 3 um n´umero inteiro.
• p ´e um n´umero pseudo-primo se: – p n˜ao for primo; e
– existir uma base x ∈ {2, . . . , p − 1} tal que xp−1 mod p = 1. Exemplos: 341, 561, 645, 1105 (base 2).
• p ´e um n´umero de Carmichael [1912] se: – p n˜ao for primo; e
– para qualquer base x ∈ {1, 2, . . . , p − 1} tal que m.d.c.(x, p) = 1 (c.f. Anexo A), xp−1 mod p = 1.
Potˆ
encia Modular
int modPower( int b, int e, int n ) // β = max(b, e, n).
{ int base = b; int exp= e; int result= 1; while ( exp > 0 )
{ // Cycle invariant: (baseexp× result) mod n = be mod n. while ( exp % 2 == 0 )
{ base = base ∗ base % n; exp = exp / 2;
}
result = result ∗ base % n; exp = exp − 1;
}
return result; }
Complexidade: O(log e) oper. aritm´eticas; O(log3β) oper. com bits. Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 7
Teste de Fermat
// If this method returns true, p is definitely composite; // if it returns false, p can be composite or prime.
// Pre-condition: p > 2 is an odd integer and 2 ≤ x ≤ p − 1.
boolean isWitnessF( int p, int x ) {
return modPower(x, p − 1, p) �= 1;
}
Erro do Teste de Fermat
• H´a apenas 22 n´umeros pseudo-primos para os quais o teste de Fermat falha com a base 2 em {2, . . . ,10 000}.
• Seja p um n´umero com α algarismos. Estima-se que a probabilidade do teste de Fermat falhar com a base 2 n˜ao excede:
10−6, quando α = 50; 10−13, quando α = 100. [Pomerance 1981]
• H´a apenas 255 n´umeros de Carmichael em {2, . . . ,100 000 000}.
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 9
Como Reduzir o Erro
• Testar a primalidade de n´umeros grandes. A probabilidade de um n´umero aleat´orio ser um pseudo-primo tende para zero, quando o n´umero de algarismos tende para infinito [Pomerance 1981].
• Testar com v´arias bases. Os n´umeros de Carmichael s˜ao extrema-mente raros.
• Complementar o teste de Fermat com o teste proposto por Miller [1976] e refinado por Rabin [1980]. `A combina¸c˜ao dos dois testes chama-se teste de Miller-Rabin.
Teste de Miller-Rabin
Sejam p um n´umero primo e x um inteiro positivo tal quex2mod p = 1.
Ent˜ao, x mod p = 1 ou x mod p = p− 1. Demonstra¸c˜ao
x2 mod p = 1 (mod)
⇒ (x2− 1) mod p = 0
⇒ (x − 1)(x + 1) mod p = 0 (P3)
⇒ (x − 1) mod p = 0 ou (x + 1) mod p = 0 (mod)
⇒ x mod p = 1 ou x mod p = p − 1
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 11
Teste de Miller-Rabin
// Pre-condition: p − 1 = 2kf , where k ≥ 1 and f is odd; 2 ≤ x ≤ p − 1. boolean isWitnessMR( int p, int k, int f, int x )
{ int result= modPower(x, f, p); // result = xf×20 mod p. for ( int i = 1; i≤ k; i++ )
{ int base = result;
result = result ∗ result % p; // result = xf×2i mod p. if ( result == 1 && base �= 1 && base �= p − 1 )
return true; // Miller-Rabin test.
}
return result �= 1; // Fermat test.
}
Decompor n da forma 2
k
f , com k
≥ 1 e f ´ımpar
// Pre-condition: n ≥ 2 is an even integer.
int[] decompose( int n ) { int f = n; int k = 0; while ( f % 2 == 0 ) { // Cycle invariant: f × 2k = n. f = f / 2; k = k + 1; }
return new int[] {k, f}; }
Complexidade: O(log n) oper. aritm´eticas; O(log2n) oper. com bits. Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 13
Teste `
a Primalidade
// Pre-condition: p > 2 is an odd integer and t > 0.
boolean isPrime( int p, int t ) { int[] dec = decompose(p − 1);
for ( int i = 0; i < t; i++ ) {
int x = randomInt(2, p − 1); // 2 ≤ x ≤ p − 1.
if ( isWitnessMR(p, dec[0], dec[1], x) ) return false;
}
return true; }
Erro de
isPrime
• A probabilidade do teste de Miller-Rabin falhar ´e inferior a: 1
4 = 4−1.
• Se t for o n´umero de bases testadas, a probabilidade do algoritmo
isPrime falhar ´e inferior a:
4−t.
Exemplo: se a probabilidade de ocorrer um erro de hardware numa m´aquina que execute 1 milh˜ao de instru¸c˜oes por segundo for
4−40,
espera-se que ocorra um erro em cada 30 mil milh˜oes de anos.
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 15
Alguns N´
umeros Pseudo-primos e de Carmichael
N´umero Fermat Miller- %
Testado m.d.c. = 1 m.d.c. �= 1 -Rabin Sucesso
341 200 40 48 85.5 561 0 240 248 98.4 645 224 308 84 98.0 1071 568 494 0 99.9 1105 0 336 492 97.4 1111 900 110 48 95.6 1729 0 432 1120 90.7
Anexo A
Para qualquer inteiro positivo n, sejam: • a ≡ b (mod n) ⇐⇒ a mod n = b mod n; • [a]n = {b ∈ Z | a ≡ b (mod n)}; • Zn = {[0]n, [1]n, . . . , [n− 1]n}; • Zn+ = {[1]n, . . . , [n− 1]n}; • Zn∗ = {[a]n ∈ Zn | m.d.c.(a, n) = 1}. Proposi¸c˜oes • (Zn, +n) e (Zn∗,·n) s˜ao grupos comutativos. • Se n for primo, Zn∗ = Zn+. • Se n n˜ao for primo, |Zn∗| < n − 1.
Margarida Mamede, DI – FCT/UNL APD, 2010/11, Teste `a Primalidade 17
Anexo A
Justifica¸
c˜
ao da Defini¸
c˜
ao de N´
umero de Carmichael
Proposi¸c˜ao
Se n n˜ao for primo e x ∈ Zn+\ Zn∗ (ou seja, m.d.c.(x, n) �= 1),