4. Simulări și rezultate

Validarea implementării

Suita de validare confirmă că motorul rapid coincide cu DFT-ul direct (eroare 1013\sim 10^{-13}) pentru lungimi de la n=2n=2 la n=1000n=1000, inclusiv ne-puteri ale lui 2 (calea Bluestein).

Pe exemplul din NIST SP 800-22 §2.6.8 (100 de biți), implementarea produce:

N1=48,N0=47.5,d=0.458831,p=0.646355,N_1 = 48,\quad N_0 = 47.5,\quad d = 0.458831,\quad p = 0.646355,

identic cu codul de referință NIST (compilat separat). Documentația raportează N1=46N_1 = 46; vezi controverse.

Comportamentul spectral: aleator vs periodic

Spectru aleator vs periodic

La stânga, o secvență aleatoare are spectru relativ plat, cu 5%\approx 5\% vârfuri peste prag. La dreapta, o secvență periodică concentrează energie la armonice. În runner, tiparul 0001 sau „numai 1” dau p0p \approx 0 (respinse). O subtilitate: o secvență de perioadă 2 (0101...) are vârful pe componenta Nyquist (exclusă), dar este totuși respinsă - indirect: toate componentele numărate rămân nule, deci N1N_1 atinge maximul și dd devine puternic pozitiv.

Rularea pe fișierele de date NIST

Pe toate secvențele pe care NIST și-a validat suita (100 fluxuri × 10000 biți):

FișierProporțieUniformitate pVerdict
data.e99/1000.000233PASS
data.pi100/1000.162606PASS
data.sqrt2100/1000.048716PASS
data.sqrt3100/1000.003996PASS
data.sha1100/1000.455937PASS

Toate trec; data.e are uniformitatea la limită. Acestea pot fi explorate interactiv în Secvențe NIST.

Performanță

Transformata rapidă face testul practic chiar și la scară mare (g++ 14.2, -O2):

SarcinăTimp
Un FFT pe 10610^6 biți (Bluestein)0.43 s
500 fluxuri × 10410^4 biți (toate cele 5 fișiere)1.7 s

Simulare Monte-Carlo sub H0

Distribuția N1 și p sub H0

Pe 10610^6 secvențe aleatoare de n=4096n = 4096 (generator PCG64, nu rand()): deviația standard empirică a lui N1N_1 este σemp7.17\sigma_{\text{emp}} \approx 7.17, iar cea presupusă de NIST este σNIST6.97\sigma_{\text{NIST}} \approx 6.97 (raport 1.03\approx 1.03, deci Var(d)1.056\operatorname{Var}(d) \approx 1.056 în loc de 11). Rata empirică de respingere sub H0H_0 este 0.012\approx 0.012, peste valoarea nominală 0.010.01: testul respinge generatoare bune ceva mai des decât ar trebui. Valoarea 1.0561.056 se potrivește cu 4/3.81.054/3.8 \approx 1.05 prezisă de constanta corectată a lui Pareschi - vezi controverse.

Deviația standard pe fiecare generator

Ca să verificăm dacă ușoara umflare a varianței (Var(d)1.056\operatorname{Var}(d) \approx 1.056) se vede și pe sursele reale, am împărțit fiecare fișier (106\approx 10^6 biți) în blocuri de n=4096n = 4096, am calculat N1N_1 pe fiecare bloc și am comparat deviația standard empirică cu σNIST=n/40.950.056.97\sigma_{\text{NIST}} = \sqrt{n/4 \cdot 0.95 \cdot 0.05} \approx 6.97.

GeneratorBlocuriN1 mediuσ_empσ_emp / σ_NISTVar(d)
data.e2451946.06.950.9970.994
data.pi2451945.56.770.9710.943
data.sqrt22451946.26.790.9730.947
data.sqrt32451946.07.561.0841.176
data.sha12441945.56.740.9670.934
PCG64 (Monte-Carlo)10⁶1945.67.171.0281.056

Cele cinci surse reale se grupează strâns în jurul lui σNIST\sigma_{\text{NIST}} (rapoarte între 0.97 și 1.08, medie 0.998); niciuna nu prezintă o varianță anormală. Un singur fișier oferă însă doar 245\approx 245 de blocuri, adică o incertitudine de eșantionare de circa 1/22454.5%1/\sqrt{2 \cdot 245} \approx 4.5\%: la acest nivel de zgomot, umflarea de 5%\approx 5\% nu poate fi distinsă dintr-un singur fișier (intervalul [0.97,1.08][0.97, 1.08] acoperă atât 1.00, cât și 1.03 măsurat de simulare), iar doar cele 10610^6 de secvențe ale simulării Monte-Carlo o separă clar de zero. Reproductibil cu docs/sigma_table.py.