Salta al contenuto
Note per Studenti Esercizio - Famiglia universale mod p mod m - verifica esaustiva e controesempio

Esercizio - Famiglia universale mod p mod m - verifica esaustiva e controesempio

Teoria: 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 → (famiglie universali e la costruzione ((ax+b) mod p) mod m((ax+b)\bmod p)\bmod m), Tabelle hashTabella hash per implementare una mappa: funzione hash = hash code + compression function, bucket array, separate chaining; hash code per numeri e stringhe (polynomial, cyclic shift), division e MAD; load factor, complessità al caso pessimo Theta(n) e medio O(1+lambda), rehashing; esempio svolto con inserimenti e collisioni.Tabelle hash →.

Testo. Sia p=7p=7, m=3m=3 e H={ha,b}\mathcal H=\{h_{a,b}\} con ha,b(x)=((ax+b) mod 7) mod 3h_{a,b}(x)=((ax+b)\bmod7)\bmod3, a∈{1,…,6}a\in\{1,\dots,6\}, b∈{0,…,6}b\in\{0,\dots,6\}, chiavi x∈{0,…,6}x\in\{0,\dots,6\}.

  1. Quante funzioni ha H\mathcal H? Elencare quelle che fanno collidere le chiavi 11 e 22 e calcolare Ph(h(1)=h(2))P_h(h(1)=h(2)).
  2. Contare esattamente le collisioni per ogni coppia di chiavi e verificare P≤1mP\le\frac1m. Spiegare il valore osservato con il conteggio delle coppie (r,s)(r,s), r≠sr\ne s, r≡s(mod3)r\equiv s\pmod 3.
  3. Se si ammette anche a=0a=0 (così a∈{0,…,6}a\in\{0,\dots,6\}, 4949 funzioni) la famiglia resta universale?
  4. Per la variante ga,b(x)=(ax+b) mod pg_{a,b}(x)=(ax+b)\bmod p con a∈{0,…,p−1}a\in\{0,\dots,p-1\} (senza  mod m\bmod m) e p=5p=5, verificare che per ogni x≠yx\ne y la coppia (g(x),g(y))(g(x),g(y)) è uniforme sulle 2525 coppie.

Soluzione

1. Funzioni e collisioni di (1,2)(1,2). ∣H∣=6⋅7=42|\mathcal H|=6\cdot7=42. Si ha h(1)=((a+b) mod 7) mod 3h(1)=((a+b)\bmod7)\bmod3 e h(2)=((2a+b) mod 7) mod 3h(2)=((2a+b)\bmod7)\bmod3. Le coppie (a,b)(a,b) che le fanno coincidere sono (1,5), (3,0), (3,4), (3,5), (3,6), (4,0), (4,1), (4,2), (4,6), (6,1),(1,5),\ (3,0),\ (3,4),\ (3,5),\ (3,6),\ (4,0),\ (4,1),\ (4,2),\ (4,6),\ (6,1), cioè 1010. Controlli a mano: (1,5)(1,5): a+b=6→6 mod 3=0a+b=6\to6\bmod3=0; 2a+b=7→0→02a+b=7\to0\to0. (3,0)(3,0): 3→03\to0; 6→06\to0. (4,1)(4,1): 5→25\to2; 9 mod 7=2→29\bmod7=2\to2. (6,1)(6,1): 7→0→07\to0\to0; 13 mod 7=6→013\bmod7=6\to0. Dunque P=1042=521=0,238≤13P=\frac{10}{42}=\boxed{\frac5{21}=0{,}238}\le\frac13.

2. Tutte le coppie e il conteggio. L'enumerazione esaustiva sulle (72)=21\binom72=21 coppie dà esattamente 1010 collisioni per ogni coppia. Spiegazione: la mappa (a,b)↦(r,s)=(ax+b mod 7, ay+b mod 7)(a,b)\mapsto(r,s)=(ax+b\bmod7,\ ay+b\bmod7) è una biiezione tra le 4242 funzioni e le 4242 coppie ordinate con r≠sr\ne s (dimostrazione nella teoria). Si ha collisione se r≡s(mod3)r\equiv s\pmod3. I resti in {0,…,6}\{0,\dots,6\} modulo 33 formano le classi {0,3,6}\{0,3,6\}, {1,4}\{1,4\}, {2,5}\{2,5\} di taglia 3,2,23,2,2: le coppie ordinate (r,s)(r,s), r≠sr\ne s, nella stessa classe sono 3⋅2+2⋅1+2⋅1=103\cdot2+2\cdot1+2\cdot1=10. Il limite generale è p(⌈p/m⌉−1)=7⋅2=14p(\lceil p/m\rceil-1)=7\cdot2=14 coppie, cioè P≤1442=13P\le\frac{14}{42}=\frac13: qui è largo perché le classi non sono tutte di taglia ⌈p/m⌉=3\lceil p/m\rceil=3.

3. Con a=0a=0 non è più universale. Per a=0a=0 la funzione è costante in xx: h0,b(x)=(b mod 7) mod 3h_{0,b}(x)=(b\bmod7)\bmod3 fa collidere ogni coppia. Sono 77 funzioni in più, quindi le collisioni di (1,2)(1,2) passano da 1010 a 10+7=1710+7=17 su 4949 funzioni: P=1749=0,347>13=0,333P=\frac{17}{49}=0{,}347>\frac13=0{,}333. La famiglia non è universale (la differenza è piccola ma basta a violare la definizione, e per pp piccolo rispetto a mm può essere grande). Per questo nella costruzione si impone a≠0a\ne0. Il caso di a=0a=0 senza  mod m\bmod m, invece, è compatibile con la pairwise independence (punto 4).

4. Pairwise independence senza  mod m\bmod m. Per p=5p=5 e ogni x≠yx\ne y la mappa (a,b)↦(ax+b, ay+b) mod 5(a,b)\mapsto(ax+b,\,ay+b)\bmod5 da {0,…,4}2\{0,\dots,4\}^2 in sé è biiettiva: il sistema ha determinante x−y≠0x-y\ne0 invertibile mod 55. Quindi ognuna delle 2525 coppie (i,j)(i,j) compare esattamente una volta e P(g(x)=i, g(y)=j)=125P(g(x)=i,\,g(y)=j)=\frac1{25} per ogni i,ji,j. L'enumerazione conferma, per tutte le 2020 coppie ordinate di chiavi distinte. Questa è una famiglia a coppie indipendente, più forte della universale; il  mod m\bmod m finale poi riduce il campo ma non garantisce uniformità esatta (se pp non è multiplo di mm le classi hanno taglie diverse).

Codice di verifica

python
from collections import Counter

p, m = 7, 3
def h(a, b, x): return ((a * x + b) % p) % m

print([(a, b) for a in range(1, p) for b in range(p) if h(a, b, 1) == h(a, b, 2)])
cont = Counter(sum(h(a, b, x) == h(a, b, y) for a in range(1, p) for b in range(p))
               for x in range(p) for y in range(x + 1, p))
print(cont)                                           # tutte le 21 coppie: 10 collisioni su 42
print(sum(h(a, b, 5) == h(a, b, 6) for a in range(p) for b in range(p)), "su", p * p)  # con a = 0

q = 5                                                 # variante senza mod m
ok = all(Counter(((a * x + b) % q, (a * y + b) % q) for a in range(q) for b in range(q)).most_common(1)[0][1] == 1
         for x in range(q) for y in range(q) if x != y)
print(ok)

Risultato: la lista delle 1010 coppie, Counter({10: 21}), 17 su 49, True.

Versione ripasso

Teoria collegata