128-bit MCG Passes PractRand
As is probably evident, I've been on a bit of a PractRand binge lately. Some of the news hasn't been good, so I'll try to temper the bad news with some better news.
I'm pleased to report that truncated 128-bit multiplicative linear congruential generators (sometimes known as a Lehmer generators) pass PractRand.
First, we'll test the generator which whose essence is:
state *= 92563704562804186071655587898373606109; return state >> 64;
Here are the results from PractRand:
linux$ ./mcg | ./RNG_test stdin64 RNG_test using PractRand version 0.93 RNG = RNG_stdin64, seed = 0x201aba44 test set = normal, folding = standard (64 bit) rng=RNG_stdin64, seed=0x201aba44 length= 128 megabytes (2^27 bytes), time= 2.1 seconds no anomalies in 148 test result(s) [...] rng=RNG_stdin64, seed=0x201aba44 length= 16 terabytes (2^44 bytes), time= 258421 seconds no anomalies in 329 test result(s) rng=RNG_stdin64, seed=0x201aba44 length= 32 terabytes (2^45 bytes), time= 515954 seconds Test Name Raw Processed Evaluation DC6-9x1Bytes-1 R= -4.5 p =1-8.6e-3 unusual ...and 338 test result(s) without anomalies
One question here is whether this result at 32 TB is an ordinary blip, common in testing, or the start of something worse. The next test should help answer that question.
Using 92563704562804186071655587898373606109 is following standard practice, since it's a 128-bit constant for a 128-bit generator, but it's a bit of a pain both to enter such a constant, and for the generated code to perform the multiplication. It'd be easier if we could use a 64-bit multiplier instead, so that's what I tried.
So for this test, I used 15750249268501108917. That's not the best possible constant, with an 8-dimensional spectral test result of 0.633, but it's reasonable. Let's see how it does.
linux$ ./mcg-fast | ./RNG_test stdin64 RNG_test using PractRand version 0.93 RNG = RNG_stdin64, seed = 0x763044db test set = normal, folding = standard (64 bit) rng=RNG_stdin64, seed=0x763044db length= 128 megabytes (2^27 bytes), time= 2.5 seconds Test Name Raw Processed Evaluation [Low1/64]BCFN(2+4,13-8,T) R= -4.6 p =1-2.6e-4 unusual ...and 147 test result(s) without anomalies rng=RNG_stdin64, seed=0x763044db length= 256 megabytes (2^28 bytes), time= 5.5 seconds no anomalies in 159 test result(s) rng=RNG_stdin64, seed=0x763044db length= 512 megabytes (2^29 bytes), time= 10.8 seconds no anomalies in 169 test result(s) [...] rng=RNG_stdin64, seed=0x763044db length= 8 terabytes (2^43 bytes), time= 151085 seconds no anomalies in 319 test result(s) rng=RNG_stdin64, seed=0x763044db length= 16 terabytes (2^44 bytes), time= 300042 seconds no anomalies in 329 test result(s) rng=RNG_stdin64, seed=0x763044db length= 32 terabytes (2^45 bytes), time= 605024 seconds no anomalies in 339 test result(s)
Here we got a minor blip in the first result (not uncommon), but nice clean results at the end.
Looks good to me!