Salta al contenuto
Note per Studenti Esercizio - Test di Miller-Rabin su 221 e 561 e confronto con il test di Fermat

Esercizio - Test di Miller-Rabin su 221 e 561 e confronto con il test di Fermat

Testo. Il test di Miller-Rabin scrive n−1=2sdn-1=2^sd con dd dispari e dichiara aa testimone di composizione se ad≢1a^d\not\equiv1 e a2rd≢−1(modn)a^{2^rd}\not\equiv-1\pmod n per r=0,…,s−1r=0,\dots,s-1.

  1. Per n=221n=221 eseguire il test con a=2a=2 e con a=174a=174.
  2. Per n=561=3⋅11⋅17n=561=3\cdot11\cdot17 calcolare 2560 mod 5612^{560}\bmod561 (test di Fermat) e poi eseguire Miller-Rabin con a=2a=2 e a=50a=50.
  3. Quante basi a∈[1,n−1]a\in[1,n-1] sono bugiarde per 221221 e per 561561 (contare con un programma)? Qual è l'errore dopo k=10k=10 basi indipendenti e quale quello garantito dal teorema di Rabin (≥3/4\ge3/4 di testimoni)?

Teoria: 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 → (sezione su Miller-Rabin).

Soluzione

Punto 1, n=221=13⋅17n=221=13\cdot17. n−1=220=4⋅55n-1=220=4\cdot55, quindi s=2s=2, d=55d=55. Si calcolano a55a^{55} e a110a^{110} modulo 221221.

  • a=2a=2: 255≡1282^{55}\equiv128, 2110≡1282=16384=74⋅221+30≡302^{110}\equiv128^2=16384=74\cdot221+30\equiv30. I valori 128128 e 3030 non sono 11 né 220=−1220=-1: 22 è un testimone, quindi 221221 è composto (certo).
  • a=174a=174: 17455≡47174^{55}\equiv47 e 174110≡472=2209=9⋅221+220≡−1174^{110}\equiv47^2=2209=9\cdot221+220\equiv-1. La condizione a2d≡−1a^{2d}\equiv-1 è soddisfatta: 174174 è un bugiardo (non prova nulla, benché 221221 sia composto).

Punto 2, n=561n=561. n−1=560=16⋅35n-1=560=16\cdot35, s=4s=4, d=35d=35.

  • Fermat: 2560≡1(mod561)2^{560}\equiv1\pmod{561}. Il test di Fermat an−1≡1a^{n-1}\equiv1 passa (561 è un numero di Carmichael, lo passa per ogni base coprima, 320320 basi): non lo smaschera.
  • Miller-Rabin con a=2a=2: i valori 235⋅2r2^{35\cdot2^r} per r=0,1,2,3r=0,1,2,3 sono 263, 166, 67, 1263,\ 166,\ 67,\ 1. Nessuno degli r=0,…,3r=0,\dots,3 vale −1=560-1=560 e x0=263≠1x_0=263\ne1: 22 è un testimone. Il valore 6767 è una radice quadrata di 11 diversa da ±1\pm1 (672=4489=8⋅561+167^2=4489=8\cdot561+1): in un campo non esisterebbe, quindi 561561 non è primo.
  • Con a=50a=50: 5035≡560=−150^{35}\equiv560=-1, già al primo passo: bugiardo.

Punto 3. Un programma che prova tutte le basi 1,…,n−11,\dots,n-1 trova:

  • n=221n=221: bugiardi {1,21,47,174,200,220}\{1,21,47,174,200,220\}, cioè 66 su 220220; testimoni 214214, il 97,3%97{,}3\%.
  • n=561n=561: bugiardi {1,50,101,103,256,305,458,460,511,560}\{1,50,101,103,256,305,458,460,511,560\}, 1010 su 560560; testimoni il 98,2%98{,}2\%. Il test di Fermat ha 320320 basi che passano.

Con k=10k=10 basi indipendenti uniformi la probabilità di errore (tutte bugiarde) è, per i valori veri, (6/220)10≈2⋅10−16(6/220)^{10}\approx2\cdot10^{-16} per 221221 e (10/560)10≈3⋅10−18(10/560)^{10}\approx3\cdot10^{-18} per 561561; il teorema di Rabin garantisce per ogni composto ≤(1/4)10=9,5⋅10−7\le(1/4)^{10}=9{,}5\cdot10^{-7}, molto più largo.

Risultati: 221221: 22 testimone, 174174 bugiardo, 6/2206/220 bugiardi. 561561: Fermat passa, Miller-Rabin con a=2a=2 lo smaschera, 10/56010/560 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

Esercizi su questo argomento

Teoria collegata