2. Partea matematică: descrierea și justificarea testului

Procedura testului

Intrări:

  • ε=ε1εn\varepsilon = \varepsilon_1\dots\varepsilon_n - secvența de biți testată (εi{0,1}\varepsilon_i \in \{0,1\});
  • nn - lungimea secvenței (NIST recomandă n1000n \ge 1000);
  • α\alpha - nivelul de semnificație (implicit 0.010.01).

Ieșiri:

  • pp - valoarea pp a testului, p[0,1]p \in [0,1];
  • decizia: aleator (pαp \ge \alpha, nu se respinge H0H_0) sau nealeator.

Pașii:

  1. Conversie bipolară: xi=2εi1x_i = 2\varepsilon_i - 1.
  2. DFT: S=DFT(X)S = \mathrm{DFT}(X).
  3. Module: Mk=S[k]M_k = |S[k]|, pentru k=0,,n/21k = 0,\dots,n/2-1.
  4. Prag: T=ln(20)nT = \sqrt{\ln(20)\,n}.
  5. N0=0.95n/2N_0 = 0.95\cdot n/2 (numărul așteptat de vârfuri sub TT).
  6. N1N_1: câte module sunt sub TT.
  7. d=(N1N0)/n/40.950.05d = (N_1 - N_0)/\sqrt{n/4 \cdot 0.95 \cdot 0.05}.
  8. p=erfc(d/2)p = \operatorname{erfc}(|d|/\sqrt{2}).

Decizie (α=0.01\alpha = 0.01): dacă p<αp < \alpha, secvența e nealeatorie; altfel nu se respinge. Restul capitolului justifică fiecare pas.

Ipoteza nulă și conversia bipolară

Fie ε=ε1ε2εn\varepsilon = \varepsilon_1\varepsilon_2\dots\varepsilon_n secvența testată. Ipoteza nulă H0H_0 este că biții sunt independenți și identic distribuiți, fiecare cu Pr(εi=0)=Pr(εi=1)=1/2\Pr(\varepsilon_i = 0) = \Pr(\varepsilon_i = 1) = 1/2.

Primul pas transformă biții în valori bipolare:

xi=2εi1{1,+1}.x_i = 2\varepsilon_i - 1 \in \{-1, +1\}.

Sub H0H_0, E[xi]=0\mathbb{E}[x_i] = 0 și Var(xi)=1\operatorname{Var}(x_i) = 1. Centrarea elimină componenta medie, astfel încât spectrul reflectă structura, nu dezechilibrul global dintre 0 și 1.

Transformata Fourier discretă

S[k]=j=0n1xje2πijk/n,k=0,1,,n1.S[k] = \sum_{j=0}^{n-1} x_j\, e^{-2\pi i\, jk/n}, \qquad k = 0,1,\dots,n-1.

Deoarece xjx_j sunt reale, spectrul satisface simetria hermitiană S[nk]=S[k]S[n-k] = \overline{S[k]}, deci S[nk]=S[k]|S[n-k]| = |S[k]|. Informația neredundantă se află în primele n/2+1\lfloor n/2\rfloor + 1 componente. Testul folosește primele n/2n/2 module, S[0],,S[n/21]|S[0]|, \dots, |S[n/2-1]|: include componenta continuă (DC, S[0]=jxjS[0] = \sum_j x_j) și exclude componenta Nyquist S[n/2]S[n/2].

Distribuția modulelor sub H0

Scriind S[k]=Ak+iBkS[k] = A_k + iB_k, pentru 0<k<n/20 < k < n/2 părțile Ak,BkA_k, B_k sunt sume de variabile independente mărginite; prin teorema limită centrală sunt aproximativ gaussiene de medie nulă, cu

Ak,BkN ⁣(0,n2).A_k,\, B_k \sim \mathcal{N}\!\left(0, \tfrac{n}{2}\right).

Atunci S[k]2=Ak2+Bk2|S[k]|^2 = A_k^2 + B_k^2 urmează o lege exponențială de medie nn (echivalent, S[k]|S[k]| este Rayleigh):

Pr(S[k]2t)=1et/n.\Pr\big(|S[k]|^2 \le t\big) = 1 - e^{-t/n}.

(Componenta DC face excepție: S[0]N(0,n)S[0] \sim \mathcal{N}(0, n) este reală, deci S[0]2|S[0]|^2 este χ12\chi^2_1, nu exponențială - o mică inconsistență de model.)

Pragul de 95% și statistica de test

Căutăm pragul TT pentru care 95%95\% dintre module sunt sub TT:

1eT2/n=0.95    T2n=ln20,1 - e^{-T^2/n} = 0.95 \;\Longrightarrow\; \frac{T^2}{n} = \ln 20,

de unde

T=ln(20)n=2.995732274n.\boxed{\,T = \sqrt{\ln(20)\,n} = \sqrt{2.995732274\,n}\,.}

Aici ln\ln este logaritmul natural; standardul NIST notează „log\log”, iar valoarea folosită este cea naturală, ln20=2.9957\ln 20 = 2.9957.

Fie N1N_1 numărul de module sub prag și N0=0.95n2N_0 = 0.95 \cdot \tfrac{n}{2} valoarea așteptată (un număr de vârfuri, nu o mărime comparabilă cu TT). Dacă cele n/2n/2 evenimente ar fi independente, N1N_1 ar fi binomial cu varianță n20.950.05\tfrac{n}{2}\cdot 0.95 \cdot 0.05. În realitate, constrângerea lui Parseval introduce o corelație care reduce varianța; NIST folosește empiric jumătate din varianța binomială:

d=N1N0n40.950.05.d = \frac{N_1 - N_0}{\sqrt{\,\tfrac{n}{4}\cdot 0.95 \cdot 0.05\,}}.

Valoarea p și decizia

Sub H0H_0, dd este presupus N(0,1)\mathcal{N}(0,1), iar testul este bilateral:

p=erfc ⁣(d2).p = \operatorname{erfc}\!\left(\frac{|d|}{\sqrt{2}}\right).

Funcția erorilor și complementara ei sunt

erf(x)=2π0xet2dt,erfc(x)=1erf(x)=2πxet2dt.\operatorname{erf}(x) = \frac{2}{\sqrt{\pi}}\int_0^x e^{-t^2}\,dt, \qquad \operatorname{erfc}(x) = 1 - \operatorname{erf}(x) = \frac{2}{\sqrt{\pi}}\int_x^{\infty} e^{-t^2}\,dt.

Factorul 2\sqrt{2} vine din normalizarea gaussiană: pentru ZN(0,1)Z \sim \mathcal{N}(0,1), Pr(Z>a)=erfc(a/2)\Pr(|Z| > a) = \operatorname{erfc}(a/\sqrt{2}), deci pp este probabilitatea cozii bilaterale pentru d|d|.

La nivelul α=0.01\alpha = 0.01: dacă p<αp < \alpha, secvența este declarată nealeatorie. Un dd negativ înseamnă prea multe vârfuri peste prag (periodicitate); un dd pozitiv înseamnă prea puține (spectru anormal de neted).

Echivalent (valoare critică din tabelă): cum dd este sub H0H_0 aproximativ N(0,1)\mathcal{N}(0,1) și testul e bilateral, se respinge dacă d>z1α/2|d| > z_{1-\alpha/2}, adică dacă dd iese din intervalul de acceptare [z1α/2,z1α/2][-z_{1-\alpha/2}, z_{1-\alpha/2}]. Cele două reguli sunt identice: p=erfc(d/2)<α    d>z1α/2p = \operatorname{erfc}(|d|/\sqrt2) < \alpha \iff |d| > z_{1-\alpha/2}. Pentru α=0.01\alpha = 0.01: z0.995=2.576z_{0.995} = 2.576, deci se acceptă dacă d[2.576,2.576]d \in [-2.576, 2.576]; pentru α=0.05\alpha = 0.05, intervalul e [1.96,1.96][-1.96, 1.96].

Factorul n4\tfrac{n}{4} este doar aproximativ corect - vezi controversa varianței.

Exemplu numeric pas cu pas

Cei opt pași pe secvența de 100 de biți din NIST (sec. 2.6.8), ε=1100100100001111110110101010\varepsilon = 1100\,1001\,0000\,1111\,1101\,1010\,1010\dots

1. Conversie bipolară (xi=2εi1x_i = 2\varepsilon_i - 1, deci 010 \mapsto -1, 1+11 \mapsto +1):

ε:1,1,0,0,1,0,0,1,    x:+1,+1,1,1,+1,1,1,+1,\varepsilon: 1,1,0,0,1,0,0,1,\dots \;\longmapsto\; x: +1,+1,-1,-1,+1,-1,-1,+1,\dots

2. DFT: se calculează (prin FFT) S[0],,S[99]S[0],\dots,S[99]; S[0]=ixi=(#1)(#0)S[0] = \sum_i x_i = (\#1)-(\#0).

3. Module: reținem Mk=S[k]M_k = |S[k]| pentru k=0,,49k = 0,\dots,49 (S[0]S[0] inclus, S[50]S[50] exclus). Primele opt, calculate de implementare (identice cu numpy.fft):

| kk | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |-------|--------|-------|-------|-------|--------|--------|-------|-------| | MkM_k | 16.000 | 6.449 | 6.958 | 7.095 | 11.865 | 11.481 | 7.014 | 5.337 |

Toate sunt sub pragul T=17.31T = 17.31; S[0]=16|S[0]| = 16 confirmă S[0]=(#1)(#0)=4258=16S[0] = (\#1) - (\#0) = 42 - 58 = -16.

4. Prag: T=ln(20)100=299.5732=17.3082T = \sqrt{\ln(20)\cdot 100} = \sqrt{299.5732} = 17.3082.

5. Așteptat: N0=0.9550=47.5N_0 = 0.95 \cdot 50 = 47.5.

6. Observat: N1=#{k:Mk<17.3082}=48N_1 = \#\{k : M_k < 17.3082\} = 48.

7. Statistică:

d=N1N0n40.950.05=4847.5250.0475=0.51.08972=0.45883.d = \frac{N_1 - N_0}{\sqrt{\tfrac{n}{4}\cdot 0.95 \cdot 0.05}} = \frac{48 - 47.5}{\sqrt{25 \cdot 0.0475}} = \frac{0.5}{1.08972} = 0.45883.

8. Valoarea p:

p=erfc ⁣(d2)=erfc ⁣(0.458831.41421)=erfc(0.32445)=0.64636.p = \operatorname{erfc}\!\left(\frac{|d|}{\sqrt{2}}\right) = \operatorname{erfc}\!\left(\frac{0.45883}{1.41421}\right) = \operatorname{erfc}(0.32445) = 0.64636.

Cum p=0.64640.01p = 0.6464 \ge 0.01, secvența nu se respinge. Echivalent, d=0.459[2.576,2.576]d = 0.459 \in [-2.576, 2.576] (în afara zonei critice) - aceeași concluzie. Documentația raportează N1=46N_1 = 46 (deci d=1.376d = -1.376, p=0.168669p = 0.168669); și acest dd cade în [2.576,2.576][-2.576, 2.576], deci verdictul rămâne „aleator”, dar pp diferă mult. Neconcordanța apare la pasul 6 - vezi controverse.