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