Salta al contenuto
Note per Studenti Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazione

Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazione

In questa pagina 7

Probabilità di base: Spazi di probabilità discreti e uniformiIn uno spazio discreto la probabilità è determinata dalla densità discreta p(ω) = P({ω}), con somma 1, e P(A) è la somma di p(ω) sugli esiti di A; negli spazi uniformi (esiti equiprobabili) P(A) = |A| / |Ω|, casi favorevoli su casi possibili.Spazi di probabilità discreti e uniformi →, Indipendenza di eventiA e B sono indipendenti se P(A ∩ B) = P(A) P(B), cioè se sapere che uno si è verificato non cambia la probabilità dell'altro; l'indipendenza passa ai complementari, non va confusa con l'incompatibilità, e per più eventi va richiesta su ogni sottofamiglia.Indipendenza di eventi →, Valore attesoIl valore atteso E[X] = Σ x p_X(x) è la media dei valori di X pesata con le loro probabilità (esiste se la serie converge assolutamente); per una funzione g vale E[g(X)] = Σ g(x) p_X(x) senza trovare la legge di g(X), ed E è lineare: E[aX + bY + c] = aE[X] + bE[Y] + c.Valore atteso →, Distribuzione geometricaGeo(p) è il numero della prova in cui arriva il primo successo in prove indipendenti: P(X = n) = (1−p)^(n−1) p per n ≥ 1, P(X > n) = (1−p)^n (lunga attesa), media 1/p, varianza (1−p)/p², ed è senza memoria.Distribuzione geometrica →. Complessità: Complessità in tempo e caso pessimoPerché lo studio sperimentale non basta; complessità al caso pessimo come massimo sul numero di operazioni tra le istanze di una data taglia; stima con limiti superiore e inferiore senza trovare l'istanza peggiore; esempi arrayMax, prefixAverages e InsertionSort; efficienza asintotica e limiti dell'analisi.Complessità in tempo e caso pessimo →, Notazione asintoticaDefinizioni di O, Omega, Theta e o piccolo con le costanti c ed n0; esempi con costanti esplicite; proprietà (polinomi, esponenziali, logaritmi, somme, implicazioni tra notazioni); sommatorie notevoli; terminologia (logaritmica, lineare, polinomiale, esponenziale).Notazione asintotica →.

1. Il modello

Un algoritmo randomizzato è un algoritmo che, oltre all'input, legge un flusso di bit casuali indipendenti ed equi (lanci di moneta). Il suo comportamento è quindi una variabile aleatoria, definita sullo spazio dei bit casuali.

Garanzia. Le probabilità sono sui bit casuali, non sull'input. Un enunciato come «per ogni input xx, Pr⁡[errore]≤1/4\Pr[\text{errore}]\le 1/4» vale nel caso peggiore sull'input: nessun avversario che scelga xx in anticipo può fare peggio. È diverso dall'analisi del caso medio, dove si assume una distribuzione sugli input. Un esempio piccolo in cui una scelta casuale batte ogni strategia deterministica nel caso pessimo: Esercizio - Due scatole di caramelle e soglia casuale contro ogni input (lezioni MIT).

Perché servono: sono spesso più semplici e più veloci di quelli deterministici (verifica di prodotti di matrici, test di primalità, taglio minimo: Union bound e verifica randomizzata - identità polinomiali e prodotti di matriciSpazi discreti richiamati; inclusione-esclusione (con le troncate di Bonferroni) e union bound Pr[unione] ≤ somma, valido senza indipendenza e stretto quando gli eventi sono rari (collisioni: C(n,2)/m). Principio delle decisioni differite: si fissa tutto tranne una scelta casuale e si limita la probabilità su quella. Lemma di Schwartz-Zippel: un polinomio non nullo di grado totale d, valutato in un punto di S^n scelto uniformemente, si annulla con prob ≤ d/|S| (induzione sul numero di variabili); test di identità polinomiale con errore unilaterale, ripetuto (d/|S|)^k. Freivalds: per verificare AB=C si controlla A(Br)=Cr con r in {0,1}^n in tempo O(n^2), errore ≤ 1/2 (stretto), 2^-k con k prove. Fingerprint: due stringhe di n bit si confrontano con a mod p per un primo casuale p ≤ M, errore ≤ n/π(M).Union bound e verifica randomizzata - identità polinomiali e prodotti di matrici →, Taglio minimo randomizzato - algoritmo di KargerTaglio minimo globale di un multigrafo con n vertici. Algoritmo di Karger: finché restano più di 2 vertici, scegliere un arco uniformemente tra i rimasti e contrarlo (fondere gli estremi, tenere i paralleli, togliere i cappi); gli archi tra i due supervertici finali sono un taglio. Un taglio minimo C di k archi sopravvive se nessun suo arco viene contratto; con n_i vertici il grado minimo è ≥ k, quindi |E_i| ≥ n_i k/2 e Pr[contrarre un arco di C] ≤ 2/n_i; il prodotto telescopico dà Pr[output = C] ≥ 2/(n(n-1)) = 1/C(n,2). Con t = C(n,2) ln(1/δ) ripetizioni indipendenti il fallimento è ≤ δ. Corollario: un grafo ha al più C(n,2) tagli minimi (stretto per il ciclo). Karger-Stein: contrarre fino a n/√2+1 vertici (sopravvive con prob ≥ 1/2) e ricorrere due volte, T(n) = O(n² log n), successo Ω(1/log n).Taglio minimo randomizzato - algoritmo di Karger →). Un esempio già noto è quicksort con pivot casuale, che diventa Las Vegas (Algoritmi di ordinamentoSelection sort e insertion sort (quadratici, con invarianti), merge sort (divide et impera, Theta(n log n)), quick sort (caso pessimo quadratico, medio n log n), heap sort (in loco, Theta(n log n)), ordinamento senza confronti per chiavi intere in un intervallo piccolo, limite inferiore Omega(n log n) per gli algoritmi basati su confronti.Algoritmi di ordinamento →, Analisi probabilistica di quicksort e quickselectCon pivot casuale due elementi di rango $i<j$ vengono confrontati con probabilità $2/(j-i+1)$; sommando sulle coppie il numero atteso di confronti di quicksort è esattamente $2(n+1)H_n-4n\approx2n\ln n-2{,}85,n$ (stessa formula dalla ricorrenza $C_n=n-1+\frac2n\sum_{k<n}C_k$). Quickselect trova il $k$-esimo elemento con attesa lineare, al più $4n$ confronti (mediana $\approx3{,}39,n$). Pivot fisso su input casuale equivale a pivot casuale su input qualunque.Analisi probabilistica di quicksort e quickselect →).

2. Las Vegas e Monte Carlo

Definizione. Un algoritmo è Las Vegas se la risposta è sempre corretta e il tempo di esecuzione TT è una variabile aleatoria: si studia E[T]E[T]. È Monte Carlo se il tempo è limitato (deterministico) ma la risposta può essere sbagliata con una probabilità limitata.

Esempio (cerca un 1). Un array A[0..n−1]A[0..n-1] ha almeno metà delle celle uguali a 11. Si vuole un indice ii con A[i]=1A[i]=1.

  • Las Vegas: si sceglie un indice a caso, si legge, e si ripete finché si trova un 11. Ogni tentativo riesce con probabilità p≥1/2p\ge 1/2 e i tentativi sono indipendenti, quindi TT è geometrica e E[T]=1/p≤2E[T]=1/p\le 2.
  • Monte Carlo: si fanno kk tentativi e, se nessuno riesce, si restituisce l'ultimo indice estratto (sbagliato). L'errore è (1−p)k≤2−k(1-p)^k\le 2^{-k}.

Esecuzione a mano su A=[0,1,1,0,0,1,0,1]A=[0,1,1,0,0,1,0,1] (n=8n=8, quattro 11, p=1/2p=1/2) con la sequenza casuale 3,0,6,5,…3,0,6,5,\dots: A[3]=0A[3]=0, A[0]=0A[0]=0, A[6]=0A[6]=0, A[5]=1A[5]=1. Si restituisce 55 dopo T=4T=4 tentativi. In generale Pr⁡[T≥4]=(1/2)3=1/8\Pr[T\ge 4]=(1/2)^3=1/8 (i primi tre falliscono), Pr⁡[T=4]=1/16\Pr[T=4]=1/16.

python
import random

def cerca_uno_lv(A):                       # Las Vegas: sempre corretto, tempo aleatorio
    t = 0
    while True:
        t += 1
        i = random.randrange(len(A))
        if A[i] == 1:
            return i, t

def cerca_uno_mc(A, k):                    # Monte Carlo: k tentativi, errore <= 2^-k
    for _ in range(k):
        i = random.randrange(len(A))
        if A[i] == 1:
            return i
    return i                               # sbagliato con prob (1-p)^k

A = [0, 1, 1, 0, 0, 1, 0, 1]
N = 100000
print(sum(cerca_uno_lv(A)[1] for _ in range(N)) / N)                 # circa 2
print(sum(A[cerca_uno_mc(A, 3)] == 0 for _ in range(N)) / N)         # circa 1/8

3. Errore unilaterale e bilaterale, classi di complessità

Per un problema di decisione (linguaggio LL: si risponde SI se x∈Lx\in L, NO altrimenti) si distinguono tre casi di Monte Carlo.

Definizione (errore unilaterale). Un algoritmo è RP (randomized polynomial time) se lavora in tempo polinomiale e

  • x∈L ⇒ Pr⁡[SI]≥1/2x\in L\ \Rightarrow\ \Pr[\text{SI}]\ge 1/2;
  • x∉L ⇒ Pr⁡[SI]=0x\notin L\ \Rightarrow\ \Pr[\text{SI}]=0.

Un SI è quindi certo, un NO può essere un errore. La classe co-RP è speculare: un NO è certo, un SI può essere un errore.

Definizione (errore bilaterale). Un algoritmo è BPP (bounded-error probabilistic polynomial time) se, in tempo polinomiale, risponde correttamente con probabilità almeno 2/32/3 per ogni xx, sia in LL sia fuori.

Definizione. ZPP (zero-error) è la classe dei linguaggi decisi da un algoritmo Las Vegas con tempo atteso polinomiale.

In breve vale P⊆ZPP⊆RP⊆BPP\text{P}\subseteq\text{ZPP}\subseteq\text{RP}\subseteq\text{BPP}. Le costanti 1/21/2 e 2/32/3 sono arbitrarie, perché l'amplificazione (sezione 4) le porta ovunque in (0,1)(0,1) e (1/2,1)(1/2,1). Per esempio RP⊆BPP\text{RP}\subseteq\text{BPP} perché un errore unilaterale ≤1/2\le1/2, ripetuto due volte, diventa ≤1/4<1/3\le1/4<1/3.

Teorema. ZPP=RP∩co-RP\text{ZPP}=\text{RP}\cap\text{co-RP}.

Dimostrazione. (⊇\supseteq) Siano AA un algoritmo RP e BB un co-RP per LL. A turno: si esegue AA e, se dice SI, si risponde SI (certo); si esegue BB e, se dice NO, si risponde NO (certo); altrimenti si ricomincia. Se x∈Lx\in L, AA dice SI con probabilità ≥1/2\ge 1/2 (e BB non dice mai NO); se x∉Lx\notin L, BB dice NO con probabilità ≥1/2\ge 1/2. Ogni giro termina quindi con probabilità ≥1/2\ge 1/2: i giri sono geometrici, in media ≤2\le 2, e la risposta è sempre corretta. (⊆\subseteq) Sia VV un Las Vegas con E[T]≤q(n)E[T]\le q(n) polinomiale. Lo si interrompe a 2q(n)2q(n) passi: per Markov Pr⁡[T>2q(n)]≤1/2\Pr[T>2q(n)]\le 1/2. Se si risponde NO allo scadere del tempo si ottiene un algoritmo RP (un SI è sempre certo, perché prodotto da VV concluso, e se x∈Lx\in L si risponde SI con probabilità ≥1/2\ge1/2); se si risponde SI si ottiene un co-RP. □\square

4. Amplificazione

Errore unilaterale: ripetizione

Si esegue l'algoritmo kk volte con bit casuali indipendenti e si risponde SI se almeno una esecuzione dice SI.

  • Se x∉Lx\notin L nessuna esecuzione dice SI: errore 00.
  • Se x∈Lx\in L, ogni esecuzione sbaglia con probabilità ≤1−p\le 1-p, e per indipendenza tutte sbagliano con probabilità (1−p)k(1-p)^k.

Poiché 1−x≤e−x1-x\le e^{-x} (la retta tangente in 00 sta sotto la convessa e−xe^{-x}), Pr⁡[errore]≤(1−p)k≤e−pk≤εsek≥ln⁡(1/ε)p.\Pr[\text{errore}]\le(1-p)^k\le e^{-pk}\le\varepsilon\qquad\text{se}\qquad k\ge\frac{\ln(1/\varepsilon)}{p}.

Esempi numerici (verificati): con p=1/2p=1/2 e ε=2−20\varepsilon=2^{-20} servono esattamente k=20k=20 ripetizioni (la formula con ee dice 2828); con p=0,3p=0{,}3 e ε=10−6\varepsilon=10^{-6} servono k=⌈ln⁡10−6/ln⁡0,7⌉=39k=\lceil\ln10^{-6}/\ln0{,}7\rceil=39 (la formula con ee dice 4747, pessimistica ma semplice). Il costo cresce linearmente in kk, l'errore cala esponenzialmente: per questo gli algoritmi randomizzati sono pratici.

Errore bilaterale: voto di maggioranza

Con errore bilaterale non si può fidare di un SI isolato. Si eseguono kk esecuzioni indipendenti (kk dispari) e si risponde come la maggioranza. Ogni esecuzione è giusta con probabilità p≥2/3p\ge2/3, quindi il numero di esecuzioni giuste è X∼Bin(k,p)X\sim\text{Bin}(k,p) (Bernoulli, binomiale e uniforme discretaBernoulli Be(p): un solo tentativo, vale 1 con probabilità p; binomiale Bin(n, p): numero di successi in n prove indipendenti, P(X = k) = C(n,k) p^k (1−p)^(n−k), media np e varianza np(1−p); uniforme discreta: n valori equiprobabili.Bernoulli, binomiale e uniforme discreta →) e Pr⁡[errore]=Pr⁡[X≤k−12]=∑j=0(k−1)/2(kj)pj(1−p)k−j.\Pr[\text{errore}]=\Pr\Big[X\le\tfrac{k-1}{2}\Big]=\sum_{j=0}^{(k-1)/2}\binom kj p^j(1-p)^{k-j}.

Valori esatti per p=2/3p=2/3 (calcolati con Python):

kk 11 33 1111 2121 4141 8181
errore 0,33330{,}3333 0,25930{,}2593 0,12210{,}1221 0,05570{,}0557 0,01350{,}0135 0,000970{,}00097

Per k=3k=3: (30)(1/3)3+(31)(2/3)(1/3)2=127+627=727=0,2593\binom30(1/3)^3+\binom31(2/3)(1/3)^2=\frac1{27}+\frac6{27}=\frac7{27}=0{,}2593, cioè sbaglia se le giuste sono 00 o 11 su 33.

Quanto decresce? Con Chebyshev (Disuguaglianze di Markov, Chebyshev e JensenMarkov: per X ≥ 0, P(X ≥ a) ≤ E[X]/a; Chebyshev: P(|X − μ| ≥ ε) ≤ Var(X)/ε²; Jensen: per φ convessa, φ(E[X]) ≤ E[φ(X)]. Stimano probabilità e medie conoscendo solo media e varianza.Disuguaglianze di Markov, Chebyshev e Jensen →): E[X]=2k/3E[X]=2k/3, Var[X]=2k/9\text{Var}[X]=2k/9, l'evento X≤k/2X\le k/2 richiede uno scarto di almeno k/6k/6, quindi Pr⁡≤2k/9(k/6)2=8k\Pr\le\frac{2k/9}{(k/6)^2}=\frac8k. È solo 1/k1/k: per k=81k=81 dà 0,0990{,}099, contro il valore vero 0,000970{,}00097. Il limite di Chernoff-Hoeffding (Limiti di Chernoff e di HoeffdingMarkov applicato a e^(tX) dà code esponenziali. Per somme di Bernoulli indipendenti con media μ: P(X ≥ (1+δ)μ) ≤ [e^δ/(1+δ)^(1+δ)]^μ ≤ e^(-δ²μ/3) per 0<δ≤1, P(X ≤ (1-δ)μ) ≤ e^(-δ²μ/2), P(X ≥ R) ≤ 2^(-R) se R ≥ 6μ. Hoeffding per X_i in [a_i,b_i]: P(|S-E[S]| ≥ t) ≤ 2exp(-2t²/Σ(b_i-a_i)²). Applicazioni: n ≥ ln(2/δ)/(2ε²) campioni per stimare una probabilità, amplificazione BPP con k = O(log 1/ε) ripetizioni, bilanciamento di insiemi con scarto √(4m ln n).Limiti di Chernoff e di Hoeffding →) dà invece Pr⁡[errore]≤e−2k(p−1/2)2=e−k/18(p=2/3),\Pr[\text{errore}]\le e^{-2k(p-1/2)^2}=e^{-k/18}\qquad(p=2/3), esponenziale in kk. Per ottenere errore ≤0,01\le0{,}01 servono 4747 esecuzioni esatte (la formula di Hoeffding ne chiede ⌈18ln⁡100⌉=83\lceil18\ln100\rceil=83). Serve però uno scarto costante da 1/21/2: se p=1/2+1/poly(n)p=1/2+1/\text{poly}(n) il numero di ripetizioni sale a poly(n)\text{poly}(n).

5. Da Las Vegas a Monte Carlo e ritorno

Las Vegas →\to Monte Carlo (Markov). Sia μ=E[T]\mu=E[T]. Per la disuguaglianza di Markov Pr⁡[T≥cμ]≤1c.\Pr[T\ge c\mu]\le\frac1c. Si interrompe l'algoritmo dopo cμc\mu passi e, se non ha finito, si restituisce una risposta qualsiasi: si ottiene un Monte Carlo con errore ≤1/c\le 1/c e tempo cμc\mu. Ripetendo kk blocchi indipendenti di durata cμc\mu e tenendo la prima risposta completata, l'errore cala a c−kc^{-k}.

Nell'esempio «cerca un 1» μ=2\mu=2: fermarsi a 1010 tentativi (c=5c=5) dà per Markov errore ≤0,2\le0{,}2, mentre il valore vero è Pr⁡[T>10]=2−10≈0,00098\Pr[T>10]=2^{-10}\approx0{,}00098. Markov sfrutta solo la media, quindi è largo ma sempre valido.

Monte Carlo →\to Las Vegas. Si può fare solo se la risposta si può verificare in fretta: si ripete il Monte Carlo finché il verificatore accetta. Con errore ε\varepsilon il numero di ripetizioni è geometrico, in media 1/(1−ε)1/(1-\varepsilon). Nell'esempio, il verificatore legge A[i]A[i]. Senza un verificatore (per esempio un Monte Carlo bilaterale su un problema di decisione) non si sa in generale farlo: che BPP sia uguale a ZPP è una questione aperta.

6. Esempio: test di primalità di Miller-Rabin

Dato nn dispari si scrive n−1=2sdn-1=2^sd con dd dispari. Un numero a∈[1,n−1]a\in[1,n-1] è un testimone di composizione se ad≢1(modn)ea2rd≢−1(modn)  per r=0,1,…,s−1.a^d\not\equiv1\pmod n\quad\text{e}\quad a^{2^rd}\not\equiv-1\pmod n\ \text{ per }r=0,1,\dots,s-1.

L'algoritmo sceglie aa a caso e risponde COMPOSTO se è un testimone, PROBABILMENTE PRIMO altrimenti. L'errore è unilaterale (un COMPOSTO è certo) e ≤1/4\le1/4 per esecuzione: con kk esecuzioni indipendenti ≤4−k\le4^{-k}, per la formula della sezione 4 con p=3/4p=3/4. Il valore 4−k4^{-k} è la probabilità che un composto fissato superi il test; la probabilità che un numero estratto a caso e promosso dal test sia composto si ricava con la regola di Bayes e dipende da quanti primi ci sono (Esercizio - Moneta a due teste e regola di Bayes per le risposte di un test randomizzato (lezioni MIT)).

A mano, n=221=13⋅17n=221=13\cdot17. n−1=220=22⋅55n-1=220=2^2\cdot55, quindi s=2s=2, d=55d=55.

  • a=2a=2: 255 mod 221=1282^{55}\bmod221=128 (non è 11 né 220220) e 1282=16384≡30128^2=16384\equiv30 (non è 220220). Nessuna condizione di non-testimone è soddisfatta: 22 è un testimone, quindi 221221 è composto.
  • a=174a=174: 17455≡47174^{55}\equiv47 e 472=2209≡220=−147^2=2209\equiv220=-1: qui aa è un «bugiardo» (passa il test pur con nn composto).

Contando tutte le basi con Python: per n=221n=221 i bugiardi sono solo {1,21,47,174,200,220}\{1,21,47,174,200,220\}, cioè 66 su 220220 (97,3%97{,}3\% di testimoni, ben oltre 3/43/4). Il test di Fermat da solo (an−1≡1a^{n-1}\equiv1) è molto peggiore: su 561=3⋅11⋅17561=3\cdot11\cdot17 (primo numero di Carmichael) tutte le 320320 basi coprime con 561561 lo superano, mentre Miller-Rabin ha solo 1010 bugiardi su 560560.

python
import random

def testimone(a, n):                       # True se a prova che n e' composto
    d, s = n - 1, 0
    while d % 2 == 0:
        d //= 2; s += 1
    x = pow(a, d, n)
    if x in (1, n - 1):
        return False
    for _ in range(s - 1):
        x = x * x % n
        if x == n - 1:
            return False
    return True

def miller_rabin(n, k=20):                 # n dispari >= 5; errore <= 4^-k
    return not any(testimone(random.randrange(2, n - 1), n) for _ in range(k))

print(miller_rabin(221), miller_rabin(561), miller_rabin(1000003))   # False False True

Domande d'esame

  1. Differenza tra Las Vegas e Monte Carlo, con un esempio. Las Vegas: risposta sempre giusta, tempo aleatorio (quicksort con pivot casuale, «cerca un 1»). Monte Carlo: tempo fisso, risposta sbagliata con probabilità limitata (Miller-Rabin).
  2. Dimostra che ZPP=RP∩co-RP\text{ZPP}=\text{RP}\cap\text{co-RP}. Vedi il teorema della sezione 3: i due algoritmi a turno nel verso ⊇\supseteq, Markov a 2q(n)2q(n) passi nel verso ⊆\subseteq.
  3. Un algoritmo RP ha p=1/2p=1/2. Quante ripetizioni per errore ≤2−30\le2^{-30}? (1/2)k≤2−30(1/2)^k\le2^{-30} dà k=30k=30; la formula con ee ne chiede ⌈30ln⁡2/0,5⌉=42\lceil30\ln2/0{,}5\rceil=42.
  4. Un Las Vegas ha tempo atteso 100100 ms. Come ottenere un Monte Carlo con errore ≤1%\le1\%? Markov con c=100c=100: interromperlo a 1010 s; l'errore è ≤1/100\le1/100.

Versione ripasso

Esercizi su questo argomento

Teoria collegata