Esercizio - Test di Miller-Rabin su 221 e 561 e confronto con il test di Fermat
Testo. Il test di Miller-Rabin scrive con dispari e dichiara testimone di composizione se e per .
- Per eseguire il test con e con .
- Per calcolare (test di Fermat) e poi eseguire Miller-Rabin con e .
- Quante basi sono bugiarde per e per (contare con un programma)? Qual è l'errore dopo basi indipendenti e quale quello garantito dal teorema di Rabin ( di testimoni)?
Soluzione
Punto 1, . , quindi , . Si calcolano e modulo .
- : , . I valori e non sono né : è un testimone, quindi è composto (certo).
- : e . La condizione è soddisfatta: è un bugiardo (non prova nulla, benché sia composto).
Punto 2, . , , .
- Fermat: . Il test di Fermat passa (561 è un numero di Carmichael, lo passa per ogni base coprima, basi): non lo smaschera.
- Miller-Rabin con : i valori per sono . Nessuno degli vale e : è un testimone. Il valore è una radice quadrata di diversa da (): in un campo non esisterebbe, quindi non è primo.
- Con : , già al primo passo: bugiardo.
Punto 3. Un programma che prova tutte le basi trova:
- : bugiardi , cioè su ; testimoni , il .
- : bugiardi , su ; testimoni il . Il test di Fermat ha basi che passano.
Con basi indipendenti uniformi la probabilità di errore (tutte bugiarde) è, per i valori veri, per e per ; il teorema di Rabin garantisce per ogni composto , molto più largo.
Risultati: : testimone, bugiardo, bugiardi. : Fermat passa, Miller-Rabin con lo smaschera, bugiardi.
python
def valori(a, n):
d, s = n - 1, 0
while d % 2 == 0: d //= 2; s += 1
return [pow(a, d * 2**r, n) for r in range(s)]
def bugiardo(a, n):
v = valori(a, n)
return v[0] == 1 or (n - 1) in v
print(valori(2, 221), valori(174, 221), pow(2, 560, 561), valori(2, 561), valori(50, 561))
for n in (221, 561):
L = [a for a in range(1, n) if bugiardo(a, n)]
print(n, len(L), L, sum(pow(a, n - 1, n) == 1 for a in range(1, n)))
print((6 / 220)**10, (10 / 560)**10, 0.25**10)Versione ripasso
- Test: ; testimone se e per (Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazioneUn algoritmo randomizzato usa bit casuali indipendenti; la probabilità è sulle scelte dell'algoritmo, mai sull'input (garanzia per ogni input). Las Vegas: sempre corretto, tempo aleatorio (conta il tempo atteso). Monte Carlo: tempo fisso, risposta sbagliata con probabilità limitata; errore unilaterale (RP: accetta solo se x sta nel linguaggio, accetta con prob almeno 1/2) o bilaterale (BPP: giusto con prob almeno 2/3). ZPP = RP ∩ co-RP = Las Vegas con tempo atteso polinomiale. Amplificazione: unilaterale, k ripetizioni indipendenti, errore (1-p)^k ≤ e^(-pk), serve k ≥ ln(1/ε)/p; bilaterale, voto di maggioranza su k esecuzioni, errore binomiale esatto, esponenziale in k (Chernoff, e^(-k/18) per p=2/3) mentre Chebyshev dà solo 8/k. Las Vegas -> Monte Carlo: interrompere a c volte il tempo atteso (Markov, errore ≤ 1/c). Monte Carlo -> Las Vegas: solo se la risposta si verifica in fretta. Esempio: Miller-Rabin, errore ≤ 1/4 per esecuzione.Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazione →).
- (, ): : , testimone; : , bugiardo. Bugiardi : .
- (, ): Fermat passa (Carmichael, basi passano). Miller-Rabin : , testimone ( radice non banale). : , bugiardo. Bugiardi .
- Errore dopo basi: valori veri e ; garanzia di Rabin .
- Errori tipici: fermarsi al solo controllo ; dimenticare il passo (basta ); non vedere che una radice di diversa da prova che è composto.