Salta al contenuto
Note per Studenti Esercizio - Dimostrazione che ZPP è uguale a RP intersecato co-RP

Esercizio - Dimostrazione che ZPP è uguale a RP intersecato co-RP

Testo (domanda da orale). Si ricordano: RP = linguaggi con un algoritmo polinomiale che, se x∈Lx\in L, risponde SI con probabilità ≥1/2\ge1/2 e, se x∉Lx\notin L, risponde NO sempre; co-RP = complementi; ZPP = linguaggi con un algoritmo Las Vegas di tempo atteso polinomiale.

  1. Dimostrare che ZPP⊆RP∩co-RP\text{ZPP}\subseteq\text{RP}\cap\text{co-RP}.
  2. Dimostrare che RP∩co-RP⊆ZPP\text{RP}\cap\text{co-RP}\subseteq\text{ZPP} e calcolare il numero atteso di giri.
  3. Se gli algoritmi AA (RP) e BB (co-RP) hanno probabilità di riuscita 0,30{,}3 invece di 1/21/2, quanti giri servono in media?

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 → (classi e teorema ZPP).

Soluzione

Punto 1. Sia VV un Las Vegas per LL con E[T]≤q(n)E[T]\le q(n), qq polinomio. Per la disuguaglianza di Markov (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 →) Pr⁡[T≥2q(n)]≤E[T]2q(n)≤12\Pr[T\ge2q(n)]\le\frac{E[T]}{2q(n)}\le\frac12.

  • Algoritmo AA: si esegue VV per al più 2q(n)2q(n) passi. Se finisce, si risponde come VV (sempre corretto). Se non finisce, si risponde NO.
  • Se x∉Lx\notin L: VV, quando finisce, dice NO; e il time-out dà NO. Quindi AA non dice mai SI: errore 00.
  • Se x∈Lx\in L: AA dice SI se VV finisce in tempo, probabilità ≥1/2\ge1/2. Quindi AA è un algoritmo RP, polinomiale perché si ferma a 2q(n)2q(n) passi.
  • Algoritmo BB: uguale, ma al time-out risponde SI. Con lo stesso ragionamento BB non dice mai NO se x∈Lx\in L e dice NO con probabilità ≥1/2\ge1/2 se x∉Lx\notin L: è co-RP.

Punto 2. Siano AA RP e BB co-RP per LL. L'algoritmo Las Vegas esegue giri:

  1. si esegue A(x)A(x); se risponde SI, si risponde SI (certo, perché AA non ha falsi SI);
  2. si esegue B(x)B(x); se risponde NO, si risponde NO (certo, perché BB non ha falsi NO);
  3. altrimenti si ricomincia da 1 con nuovi bit casuali.

La risposta è sempre corretta. In un giro: se x∈Lx\in L allora AA dice SI con probabilità ≥1/2\ge1/2; se x∉Lx\notin L allora BB dice NO con probabilità ≥1/2\ge1/2. Quindi ogni giro termina con probabilità ≥1/2\ge1/2, i giri sono indipendenti, il loro numero è geometrico e in media ≤2\le2. Il tempo atteso è ≤2\le2 volte il costo di un giro, polinomiale.

Punto 3. Se la riuscita per giro è q=0,3q=0{,}3 (indipendentemente dal caso, x∈Lx\in L o x∉Lx\notin L), il numero di giri è geometrico di parametro 0,30{,}3: in media 1/0,3=3,331/0{,}3=3{,}33 giri. Una simulazione con 2⋅1052\cdot10^5 giri indipendenti dà 3,343{,}34; per q=1/2q=1/2 dà 2,002{,}00.

Risultato: ZPP=RP∩co-RP\text{ZPP}=\text{RP}\cap\text{co-RP}; giri attesi ≤2\le2 (e 10/310/3 per q=0,3q=0{,}3).

python
import random
def giri(q):
    n = 0
    while True:
        n += 1
        if random.random() < q: return n
for q in (0.5, 0.3):
    print(q, sum(giri(q) for _ in range(200000)) / 200000, 1 / q)      # 2.00, 3.34 (attesi 2 e 3.33)

Versione ripasso

Teoria collegata