Salta al contenuto
Note per Studenti Esercizio - Impronta di stringhe con un primo casuale e comunicazione

Esercizio - Impronta di stringhe con un primo casuale e comunicazione

Testo. Alice e Bob hanno due stringhe di nn bit, viste come interi aa e bb. Alice sceglie un primo pp uniformemente fra i primi ≤M\le M e invia (p, a mod p)(p,\ a\bmod p); Bob dichiara «uguali» se a mod p=b mod pa\bmod p=b\bmod p.

  1. Con n=8n=8, a=181a=181, b=165b=165 e pp scelto uniformemente in {2,3,5,7,11,13}\{2,3,5,7,11,13\}, calcolare esattamente la probabilità di errore. Ripetere con b′=151b'=151.
  2. Dimostrare che l'errore è ≤n/π(M)\le n/\pi(M). Calcolarlo per n=1000n=1000, M=106M=10^6 (π(106)=78498\pi(10^6)=78498).
  3. Quale MM garantisce con questo bound un errore ≤10−3\le10^{-3} per n=1000n=1000? Quanti bit si comunicano rispetto a 10001000?
  4. Migliorando il bound (il prodotto dei 130130 primi più piccoli supera 210002^{1000}), che errore si ottiene con M=106M=10^6? E quante prove indipendenti con M=106M=10^6 servono per scendere sotto 10−910^{-9} usando il bound semplice?

Teoria: 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 → (sezione 5); Hashing randomizzato - famiglie universali, filtri di Bloom e fingerprintHashing con catene e costo atteso 1+alfa; famiglie universali (probabilità di collisione al più 1/m) e costruzione h(x)=((ax+b) mod p) mod m con dimostrazione; hashing perfetto a due livelli (spazio lineare, ricerca O(1) nel caso peggiore); filtri di Bloom: falsi positivi (1-e^(-kn/m))^k e k ottimo (m/n) ln 2; fingerprint di stringhe e numero di bit necessari.Hashing randomizzato - famiglie universali, filtri di Bloom e fingerprint →.

Soluzione

Punto 1. Se a=ba=b il test è sempre giusto. Qui a≠ba\ne b e Bob sbaglia se p∣(a−b)p\mid(a-b).

  • a−b=181−165=16=24a-b=181-165=16=2^4: l'unico primo divisore è 22. I resti sono a mod p=(1,1,1,6,5,12)a\bmod p=(1,1,1,6,5,12) e b mod p=(1,0,0,4,0,9)b\bmod p=(1,0,0,4,0,9) per p=2,3,5,7,11,13p=2,3,5,7,11,13: coincidono solo per p=2p=2. Errore 1/61/6.
  • a−b′=181−151=30=2⋅3⋅5a-b'=181-151=30=2\cdot3\cdot5: coincidono per p=2,3,5p=2,3,5 (resti aa: 1,1,11,1,1; b′b': 1,1,11,1,1) e non per 7,11,137,11,13 (6,5,126,5,12 contro 4,8,84,8,8). Errore 3/6=1/23/6=1/2.

Punto 2. Sia d=∣a−b∣d=|a-b|, con 1≤d<2n1\le d<2^n. Se dd avesse tt primi divisori distinti, tutti ≥2\ge2, sarebbe d≥2td\ge2^t, e da d<2nd<2^n segue t<nt<n, cioè t≤nt\le n. Scegliendo pp uniforme fra i π(M)\pi(M) primi, cade fra quei tt con probabilità t/π(M)≤n/π(M)t/\pi(M)\le n/\pi(M). Con n=1000n=1000 e M=106M=10^6: 1000/78498=0,01271000/78498=0{,}0127.

Punto 3. Serve π(M)≥106\pi(M)\ge10^6. Il milionesimo primo è 15 485 86315\,485\,863, quindi M≈1,55⋅107M\approx1{,}55\cdot10^7; con M=1,6⋅107M=1{,}6\cdot10^7 si ha π(M)=1 031 130\pi(M)=1\,031\,130 e errore ≤0,00097\le0{,}00097. Alice comunica pp (circa log⁡2M=24\log_2M=24 bit) e il resto (altri ≤24\le24 bit): circa 4848 bit invece di 10001000.

Punto 4. Il prodotto dei primi 130130 più piccoli è maggiore di 210002^{1000} (la somma dei log⁡2\log_2 dei primi 129129 vale 999,4999{,}4, quella dei primi 130130 vale 10091009): un d<21000d<2^{1000} ha al più 129129 divisori primi distinti, quindi errore ≤129/78498=0,00164\le129/78498=0{,}00164. Con il bound semplice 0,01270{,}0127 e kk prove con primi indipendenti: 0,0127k≤10−90{,}0127^k\le10^{-9} dà k≥20,724,366=4,75k\ge\frac{20{,}72}{4{,}366}=4{,}75, quindi k=5k=5 (con 0,001640{,}00164: k=4k=4, perché 0,001644=7⋅10−120{,}00164^4=7\cdot10^{-12} e 0,001643=4,4⋅10−90{,}00164^3=4{,}4\cdot10^{-9} non bastano).

Risultati: 1/61/6 e 1/21/2; errore ≤0,0127\le0{,}0127 (0,001640{,}00164 con il bound fine); M=1,6⋅107M=1{,}6\cdot10^7, 4848 bit; k=5k=5.

python
def primi(M):
    s = bytearray([1]) * (M + 1); s[0] = s[1] = 0
    for i in range(2, int(M**0.5) + 1):
        if s[i]: s[i * i::i] = bytearray(len(s[i * i::i]))
    return [i for i in range(M + 1) if s[i]]
q = [2, 3, 5, 7, 11, 13]
for b in (165, 151):
    print(b, [p for p in q if 181 % p == b % p])
P = primi(10**6)
print(len(P), 1000 / len(P), 129 / len(P))
import math
print(sum(math.log2(p) for p in P[:129]), sum(math.log2(p) for p in P[:130]))
print(len(primi(16 * 10**6)), 1000 / len(primi(16 * 10**6)))

Versione ripasso

Teoria collegata