awds_rng_reverse_iterate = function(number) number = (number ~= 0) and (number - 1) or 1073741823; -- State is tuple(A,B,C) satisfying A*x+B*x=c + 2^n*k local A = 4; local B = 5; local C = number; local i; local l = 0; local scale = 1; -- 30 bits in RNG state. for i = 0, 29 do l = l + scale * (C % 2); if C % 2 == 0 then A, B, C = 2 * A, B, C / 2; else A, B, C = 2 * A, 2 * A + B, (C - A - B) / 2; end scale = scale * 2; end return l; end awds_rng_forward_iterate = function(number) local low = number % 32768; -- max of 32767 local high = (number - low) / 32768; -- max of 32767 return (high * (262144 * low + 163840) + (low + 1) * (4 * low + 1)) % 1073741824; end