﻿Analysis started: 2026-11-02T22:09:13
Machine: Microsoft Windows NT 10.0.26300.0, cores = 12, 64-bit process = True, CLR 4.0.30319.42000
Model: exact copy of rng32.c (rng32_seed_s, rng32_next_u32_s, tent_step32)

=== 1. Self-checks ===
xoshiro128** test vector, state [1,2,3,4]: 00002D00 00000000 005A7080  expected 00002D00 00000000 005A7080 -> OK
First 8 output words, testbench key, warm-up 0 : F74AA527 5BDE2F8D 8F74C822 0286C4C9 F24B1332 294D67A7 CE04E32A A78D7116
First 8 output words, same key with s0 bit0 flipped: F74AA527 5BDE410D 8F74E2A2 0173DD49 F3C21332 2F207127 29231C2A 42CA71E2
(compare these words with the C-simulation output of tb_prng32.cpp: normal.bin / flipped.bin)

=== 2. Integer Tent map over all 2^32 states ===
Tent(x) == Tent(~x) for every x: mismatches = 0  (0 means t0 and ~t0 give identical output sequences)
Image size |f(S)| = 2147483648  (2^31.000)
  cycle 1: length 1 (2^0.000), smallest state on it = 00000000
  cycle 2: length 650116965 (2^29.276), smallest state on it = 00000002
  cycle 3: length 650116965 (2^29.276), smallest state on it = 00000006
  cycle 4: length 650116965 (2^29.276), smallest state on it = 0000000A
  cycle 5: length 130023393 (2^26.954), smallest state on it = 00000032
  cycle 6: length 20971515 (2^24.322), smallest state on it = 0000006E
  cycle 7: length 20971515 (2^24.322), smallest state on it = 000000B2
  cycle 8: length 20971515 (2^24.322), smallest state on it = 000001D6
  cycle 9: length 4194303 (2^22.000), smallest state on it = 000005FE
  cycle 10: length 465 (2^8.861), smallest state on it = 00DB4615
  cycle 11: length 31 (2^4.954), smallest state on it = 0BB5CCB5
  cycle 12: length 15 (2^3.907), smallest state on it = 14DF2A54
Number of cycles = 12, states on cycles = 2147483648
All image states lie on cycles: True
=> every initial Tent state reaches a cycle in at most 1 step (non-image states map into the image in one step).
Tent analysis time: 168 s

=== 3. Exact state-sequence periods ===
State-sequence period (the output period divides it):
  V0 xoshiro128** only : 2^128-1 = 2^128.000
  V1 + Weyl            : lcm(2^128-1, 2^32) = 2^160.000
  Share of random t0 seeds that fall on each Tent cycle = L / 2^31
  Tent cycle length L | share of seeds | V2 (+Tent) period | V3 (full) period
  1 | 0.000000 % | 2^128.000 | 2^160.000
  650116965 | 30.273430 % | 2^153.369 | 2^185.369
  650116965 | 30.273430 % | 2^153.369 | 2^185.369
  650116965 | 30.273430 % | 2^153.369 | 2^185.369
  130023393 | 6.054686 % | 2^153.369 | 2^185.369
  20971515 | 0.976562 % | 2^148.415 | 2^180.415
  20971515 | 0.976562 % | 2^148.415 | 2^180.415
  20971515 | 0.976562 % | 2^148.415 | 2^180.415
  4194303 | 0.195312 % | 2^148.415 | 2^180.415
  465 | 0.000022 % | 2^132.954 | 2^164.954
  31 | 0.000001 % | 2^132.954 | 2^164.954
  15 | 0.000001 % | 2^128.000 | 2^160.000

=== 4. Bit-level sensitivity to the 192 seed bits ===
Mean fraction of output bits that change when ONE seed bit is flipped
(4 random seeds x 600 output words; ideal = 0.5000)
  V3 flip s0..s3 bits (128): mean 0.4967  (min 0.4864, max 0.5111)
  V3 flip w0 bits (32): mean 0.1249  (min 0.1206, max 0.1396)
  V3 flip t0 bits (32): mean 0.4841  (min 0.4699, max 0.5016)
  V0 flip s0..s3 bits (plain xoshiro128**): mean 0.4967

Total time: 168 s
Analysis finished: 2026-11-02T22:12:01

