| LoopMix128 is a fast C PRNG I wrote for non-cryptographic tasks. GitHub (MIT): https://github.com/danielcota/LoopMix128 Highlights: * ~0.37 ns/value (GCC 11.4, -O3 -march=native), 98% faster than xoroshiro128++ and PCG64. * Passes TestU01 BigCrush & PractRand (32TB). * Guaranteed 2^128 period. * Proven injective (192-bit state) via Z3 SMT solver; allows parallel streams. * Core requires only stdint.h. Seeking feedback on design, use cases, or further testing. |
The state update function is effectively "a = rotate(a, constant) + b; b = rotate(b, constant) + constant;" and the output derivation is "output = (a + b) * constant".
That update function is _barely_ nonlinear, and the output derivation is linear. The output would probably be slightly better as "(a ^ b) * constant".
The slow_loop thing to guarantee 2^128 period is probably not needed - anyone with an application that cares about a period that high is probably going to choose a more robust generator (a few rounds of hardware-accelerated AES in counter mode is your best bet there)
The use of the Z3 prover is neat and I should read up on that more.