4. Simulări și rezultate
Validarea implementării
Suita de validare confirmă că motorul rapid coincide cu DFT-ul direct (eroare ) pentru lungimi de la la , inclusiv ne-puteri ale lui 2 (calea Bluestein).
Pe exemplul din NIST SP 800-22 §2.6.8 (100 de biți), implementarea produce:
identic cu codul de referință NIST (compilat separat). Documentația raportează ; vezi controverse.
Comportamentul spectral: aleator vs periodic
La stânga, o secvență aleatoare are spectru relativ plat, cu vârfuri
peste prag. La dreapta, o secvență periodică concentrează energie la armonice.
În runner, tiparul 0001 sau „numai 1” dau
(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 atinge maximul și 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șier | Proporție | Uniformitate p | Verdict |
|---|---|---|---|
data.e | 99/100 | 0.000233 | PASS |
data.pi | 100/100 | 0.162606 | PASS |
data.sqrt2 | 100/100 | 0.048716 | PASS |
data.sqrt3 | 100/100 | 0.003996 | PASS |
data.sha1 | 100/100 | 0.455937 | PASS |
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 biți (Bluestein) | 0.43 s |
| 500 fluxuri × biți (toate cele 5 fișiere) | 1.7 s |
Simulare Monte-Carlo sub H0
Pe secvențe aleatoare de (generator PCG64, nu rand()):
deviația standard empirică a lui este , iar
cea presupusă de NIST este (raport , deci în loc de ). Rata empirică de
respingere sub este , peste valoarea nominală : testul
respinge generatoare bune ceva mai des decât ar trebui. Valoarea se
potrivește cu 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 () se vede și pe sursele reale, am împărțit fiecare fișier ( biți) în blocuri de , am calculat pe fiecare bloc și am comparat deviația standard empirică cu .
| Generator | Blocuri | N1 mediu | σ_emp | σ_emp / σ_NIST | Var(d) |
|---|---|---|---|---|---|
data.e | 245 | 1946.0 | 6.95 | 0.997 | 0.994 |
data.pi | 245 | 1945.5 | 6.77 | 0.971 | 0.943 |
data.sqrt2 | 245 | 1946.2 | 6.79 | 0.973 | 0.947 |
data.sqrt3 | 245 | 1946.0 | 7.56 | 1.084 | 1.176 |
data.sha1 | 244 | 1945.5 | 6.74 | 0.967 | 0.934 |
| PCG64 (Monte-Carlo) | 10⁶ | 1945.6 | 7.17 | 1.028 | 1.056 |
Cele cinci surse reale se grupează strâns în jurul lui (rapoarte
între 0.97 și 1.08, medie 0.998); niciuna nu prezintă o varianță anormală. Un singur
fișier oferă însă doar de blocuri, adică o incertitudine de eșantionare
de circa : la acest nivel de zgomot, umflarea de
nu poate fi distinsă dintr-un singur fișier (intervalul
acoperă atât 1.00, cât și 1.03 măsurat de simulare), iar doar cele de secvențe
ale simulării Monte-Carlo o separă clar de zero. Reproductibil cu docs/sigma_table.py.