namofure

LCG_64

Dec 14th, 2025 (edited)
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.47 KB | Gaming | 0 0
  1. local Rand_addr = 0x02235798 --B2/JP
  2.  
  3. function LCG_64(U32,L32)
  4.     --64bit multiplication
  5.     local l16, u16, Carry16
  6.     local l24, u24, Carry24
  7.     local Carry
  8.     local x, y, z = {}, {}, {}
  9.    
  10.     x[0] = bit.band(L32, 255)
  11.     x[1] = bit.band(bit.rshift(L32, 8), 255)
  12.     x[2] = bit.band(bit.rshift(L32, 16), 255)
  13.     x[3] = bit.band(bit.rshift(L32, 24), 255)
  14.  
  15.     y[0] = bit.band(x[0] * 1812433253, 4294967295)
  16.     y[1] = bit.band(bit.lshift(x[1] * 1812433253, 8), 4294967295)
  17.     y[2] = bit.band(bit.lshift(x[2] * 1812433253, 16), 4294967295)
  18.     y[3] = bit.band(bit.lshift(x[3] * 1812433253, 24), 4294967295)
  19.  
  20.     l16 = bit.band(y[0], 0xFFFF) + bit.band(y[1], 0xFFFF) + bit.band(y[2], 0xFFFF) + bit.band(y[3], 0xFFFF)
  21.     Carry16 = bit.rshift(l16, 16)
  22.     u16 = bit.rshift(y[0], 16) + bit.rshift(y[1], 16) + bit.rshift(y[2], 16) + bit.rshift(y[3], 16) + Carry16
  23.    
  24.     z[0] = bit.rshift(u16, 16)
  25.     z[1] = math.floor((x[0] * 1812433253) / 0x100000000)
  26.     z[2] = math.floor((x[1] * 1812433253) / 0x1000000)
  27.     z[3] = math.floor((x[2] * 1812433253) / 0x10000)
  28.     z[4] = math.floor((x[3] * 1812433253) / 0x100)
  29.  
  30.     l32 = bit.band((y[0] + y[1] + y[2] + y[3]), 4294967295)
  31.  
  32.     u32 = z[0] + z[1] + z[2] + z[3] + z[4]
  33.     u32 = bit.band(LCG_32(L32, 1566083941, u32), 4294967295)
  34.     u32 = bit.band(LCG_32(U32, 1812433253, u32), 4294967295)
  35.  
  36.     l24 = bit.band(y[0], 0xFFFFFF) + bit.band(y[1], 0xFFFFFF) + bit.band(y[2], 0xFFFFFF) + bit.band(y[3], 0xFFFFFF) + 2531011
  37.     Carry24 = bit.rshift(l24, 24)
  38.     u24 = bit.rshift(y[0], 24) + bit.rshift(y[1], 24) + bit.rshift(y[2], 24) + bit.rshift(y[3], 24) + Carry24
  39.  
  40.     Carry = bit.rshift(u24, 24)
  41.     l32 = bit.band((l32 + 2531011), 4294967295)
  42.     u32 = u32 + Carry
  43.  
  44.     return l32, u32
  45. end
  46.  
  47. function LCG_32(rand, a, b)
  48.     --32bit multiplication
  49.     local x, y = {}, {}
  50.  
  51.     x[0] = bit.band(rand, 255)
  52.     x[1] = bit.band(bit.rshift(rand, 8), 255)
  53.     x[2] = bit.band(bit.rshift(rand, 16), 255)
  54.     x[3] = bit.band(bit.rshift(rand, 24), 255)
  55.  
  56.     y[0] = bit.band(x[0] * a, 4294967295)
  57.     y[1] = bit.band(bit.lshift(x[1] * a, 8), 4294967295)
  58.     y[2] = bit.band(bit.lshift(x[2] * a, 16), 4294967295)
  59.     y[3] = bit.band(bit.lshift(x[3] * a, 24), 4294967295)
  60.  
  61.     return bit.band((y[0] + y[1] + y[2] + y[3] + b), 4294967295)
  62. end
  63.  
  64. function Fn()
  65.    
  66.     L32 = memory.readdword(Rand_addr)
  67.     U32 = memory.readdword(Rand_addr + 4)
  68.    
  69.     for i = 0, 16 do
  70.         gui.text(0,10 * i, string.format("%08X%08X", U32, L32))
  71.         L32, U32 = LCG_64(U32,L32)
  72.        
  73.     end
  74. end
  75. gui.register(Fn)
Advertisement
Add Comment
Please, Sign In to add comment