Salta al contenuto
Note per Studenti Esercizio - Paradosso del compleanno e collisioni di un hash a 32 bit

Esercizio - Paradosso del compleanno e collisioni di un hash a 32 bit

Teoria: Palline e urne - compleanno, carico massimo e approssimazione di PoissonModello palline e urne (m palline, n urne, scelte indipendenti e uniformi): paradosso del compleanno con soglia sqrt(2 n ln 2), urne vuote attese n e^(-m/n), carico massimo ln n / ln ln n con dimostrazione (first moment e union bound), approssimazione di Poisson con il fattore e sqrt(m), potere delle due scelte (ln ln n / ln 2).Palline e urne - compleanno, carico massimo e approssimazione di Poisson → (soglia del compleanno), Calcolo combinatorio per la probabilitàNegli spazi uniformi bisogna contare: principio di moltiplicazione, disposizioni con ripetizione n^k, disposizioni semplici n!/(n−k)!, permutazioni n!, combinazioni (n su k); estrazioni con e senza reinserimento e distribuzione ipergeometrica.Calcolo combinatorio per la probabilità →.

Testo. Si lanciano mm palline in nn urne in modo uniforme e indipendente. Con n=365n=365 le palline sono persone e le urne i giorni dell'anno (anni non bisestili, compleanni uniformi).

  1. Dimostrare, con il limite P(nessuna collisione)≤e−m(m−1)/2nP(\text{nessuna collisione})\le e^{-m(m-1)/2n}, che m=23m=23 basta per avere probabilità di collisione almeno 12\frac12 e che m=22m=22 non è dimostrato dallo stesso limite. Calcolare poi le probabilità esatte per m=22m=22 e m=23m=23.
  2. Quante persone servono per avere probabilità almeno 0,990{,}99 di un compleanno comune?
  3. Un sistema genera identificatori con un hash a 3232 bit (n=232n=2^{32} valori, uniformi). Dopo quanti identificatori la probabilità di collisione supera 10−310^{-3}? E quella di 12\frac12?
  4. Per m=23m=23 calcolare il numero atteso di coppie con lo stesso compleanno e spiegare perché non coincide con la probabilità di almeno una coppia.
  5. Calcolare il numero atteso E[T]E[T] di persone da interrogare fino alla prima coincidenza (compresa) per n=365n=365.

Soluzione

1. Limite superiore. La persona ii (i=0,…,m−1i=0,\dots,m-1 già presenti) evita i giorni occupati con probabilità 1−in1-\frac in, quindi P(nessuna)=∏i=0m−1(1−in)≤∏e−i/n=e−m(m−1)/2nP(\text{nessuna})=\prod_{i=0}^{m-1}(1-\frac in)\le\prod e^{-i/n}=e^{-m(m-1)/2n}, dove si è usato 1−x≤e−x1-x\le e^{-x} e ∑i<mi=m(m−1)2\sum_{i<m}i=\frac{m(m-1)}2. Si vuole che il membro di destra sia ≤12\le\frac12: m(m−1)2n≥ln⁡2  ⟺  m(m−1)≥2⋅365⋅ln⁡2=730⋅0,69315=505,997.\frac{m(m-1)}{2n}\ge\ln2\iff m(m-1)\ge2\cdot365\cdot\ln2=730\cdot0{,}69315=505{,}997. Con m=23m=23: 23⋅22=506≥505,99723\cdot22=506\ge505{,}997 (di un soffio). Con m=22m=22: 22⋅21=462<505,99722\cdot21=462<505{,}997, il limite non basta (e infatti la probabilità esatta è sotto 12\frac12). Esatto: P(coll.)=1−∏i<m(1−i365)P(\text{coll.})=1-\prod_{i<m}(1-\frac i{365}) vale 0,47570{,}4757 per m=22m=22 e 0,5073\boxed{0{,}5073} per m=23m=23; il limite dà 0,46890{,}4689 e 0,50000{,}5000.

2. Si cerca il minimo mm con 1−∏(1−i365)≥0,991-\prod(1-\frac i{365})\ge0{,}99: per m=56m=56 si ha meno di 0,990{,}99 e per m=57m=57 si ottiene 0,9901\boxed{0{,}9901}. Dal limite: e−m(m−1)/730≤0,01e^{-m(m-1)/730}\le0{,}01 dà m(m−1)≥730ln⁡100=3361,6m(m-1)\ge730\ln100=3361{,}6, m≥58,5m\ge58{,}5: m=59m=59 è dimostrato, il valore esatto è appena sotto.

3. La formula approssimata m≈2nln⁡11−pm\approx\sqrt{2n\ln\frac1{1-p}} viene dall'esponenziale. Per p=10−3p=10^{-3}: 2⋅232⋅0,0010005=2931,6\sqrt{2\cdot2^{32}\cdot0{,}0010005}=2931{,}6; il calcolo esatto del prodotto dà che servono 2933\boxed{2933} identificatori (probabilità 0,00100060{,}0010006), 29322932 non bastano. Per p=12p=\frac12: 2⋅232ln⁡2=77 162,7\sqrt{2\cdot2^{32}\ln2}=77\,162{,}7 e il valore esatto è 77 164\boxed{77\,164} (con 77 16377\,163 la probabilità è 0,499999890{,}49999989). Quindi un hash a 3232 bit non è adatto a identificare in modo unico decine di migliaia di oggetti.

4. Per la linearità il numero atteso di coppie coincidenti è (232)⋅1365=253365=0,6932\binom{23}2\cdot\frac1{365}=\frac{253}{365}=0{,}6932. Non è la probabilità di almeno una coppia (0,50730{,}5073): la variabile XX = numero di coppie può valere più di 11 (tre persone con lo stesso compleanno formano 33 coppie; due coppie disgiunte ne danno 22). Vale sempre P(X≥1)≤E[X]P(X\ge1)\le E[X] (Markov), qui 0,5073≤0,69320{,}5073\le0{,}6932; la differenza misura la sovrapposizione degli eventi.

5. TT = numero di persone fino alla prima coincidenza. T>kT>k significa nessuna coincidenza tra le prime kk, quindi P(T>k)=∏i<k(1−i365)P(T>k)=\prod_{i<k}(1-\frac i{365}) e E[T]=∑k≥0P(T>k)=24,617E[T]=\sum_{k\ge0}P(T>k)=\boxed{24{,}617} (il termine k=0k=0 vale 11, e i termini sono nulli da k=366k=366). Coincide con la formula asintotica πn2+23=23,94+0,67=24,61\sqrt{\frac{\pi n}2}+\frac23=23{,}94+0{,}67=24{,}61 (si noti che la mediana è 2323, la media 24,624{,}6).

Codice di verifica

python
from math import log, log1p, exp, sqrt

def p_coll(m, n):
    """Probabilità di almeno una collisione con m palline in n urne."""
    if m > n:                            # più palline che urne: collisione certa
        return 1.0
    return 1 - exp(sum(log1p(-i / n) for i in range(m)))

def minimo(p, n):
    lo, hi = 1, 10 ** 6
    while lo < hi:                       # ricerca binaria: p_coll è crescente in m
        mid = (lo + hi) // 2
        lo, hi = (lo, mid) if p_coll(mid, n) >= p else (mid + 1, hi)
    return lo

print(p_coll(22, 365), p_coll(23, 365))
print(minimo(0.99, 365), minimo(1e-3, 2**32), minimo(0.5, 2**32))
print(sum(1 - p_coll(k, 365) if k else 1 for k in range(366)))   # E[T]

Risultato: 0.4757 0.5073, poi 57 2933 77164, infine 24.6166.

Versione ripasso

Teoria collegata