<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ARadioGatun32%2Fdebug</id>
	<title>Module:RadioGatun32/debug - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ARadioGatun32%2Fdebug"/>
	<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:RadioGatun32/debug&amp;action=history"/>
	<updated>2026-05-01T02:52:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>http://70.231.62.181/index.php?title=Module:RadioGatun32/debug&amp;diff=14000252&amp;oldid=prev</id>
		<title>imported&gt;Samboy: rginput = rginput:gsub(&quot;%[%[Category[^%]]+%]%]&quot;,&quot;&quot;) -- Remove categories</title>
		<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:RadioGatun32/debug&amp;diff=14000252&amp;oldid=prev"/>
		<updated>2022-09-15T18:08:55Z</updated>

		<summary type="html">&lt;p&gt;rginput = rginput:gsub(&amp;quot;%[%[Category[^%]]+%]%]&amp;quot;,&amp;quot;&amp;quot;) -- Remove categories&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Placed in the public domain 2020, 2022 Sam Trenholme&lt;br /&gt;
&lt;br /&gt;
-- This is a version of RadioGatun[32] (RG32) which uses bit32.&lt;br /&gt;
-- Wikipedia has bit32 in an external library&lt;br /&gt;
if not bit32 then&lt;br /&gt;
  bit32 = require(&amp;quot;bit32&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Note that belt and mill are 1-indexed here&lt;br /&gt;
local function beltMill(belt, mill)&lt;br /&gt;
&lt;br /&gt;
  -- Mill to belt feedforward&lt;br /&gt;
  for z = 0, 11 do&lt;br /&gt;
    local offset = z + ((z % 3) * 13) + 1&lt;br /&gt;
    belt[offset] = bit32.bxor(belt[offset],mill[z + 2])&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- Mill core&lt;br /&gt;
  local rotate = 0&lt;br /&gt;
  local millPrime = {}&lt;br /&gt;
  for z = 0, 18 do&lt;br /&gt;
    rotate = rotate + z&lt;br /&gt;
    local view = (z * 7) % 19&lt;br /&gt;
    local num = mill[view + 1]&lt;br /&gt;
    view = (view + 1) % 19&lt;br /&gt;
    local viewPrime = (view + 1) % 19&lt;br /&gt;
    num = bit32.bxor(num,bit32.bor(mill[view + 1],&lt;br /&gt;
                     bit32.bnot(mill[viewPrime + 1])))&lt;br /&gt;
    num = bit32.rrotate(num,rotate)&lt;br /&gt;
    millPrime[z + 1] = num&lt;br /&gt;
  end&lt;br /&gt;
  for z = 0, 18 do&lt;br /&gt;
    local view = (z + 1) % 19&lt;br /&gt;
    local viewPrime = (z + 4) % 19&lt;br /&gt;
    mill[z + 1] = bit32.bxor(millPrime[z + 1],&lt;br /&gt;
        millPrime[view + 1],millPrime[viewPrime + 1])&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- Belt rotate&lt;br /&gt;
  for z = 39, 1, -1 do&lt;br /&gt;
     belt[z + 1] = belt[z]&lt;br /&gt;
  end&lt;br /&gt;
  for z = 0, 2 do&lt;br /&gt;
     belt[(z * 13) + 1] = belt[((z + 1) * 13) + 1]&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- Belt to mill&lt;br /&gt;
  for z = 0, 2 do&lt;br /&gt;
     mill[14 + z] = bit32.bxor(belt[(z * 13) + 1],mill[14 + z])&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- Iota&lt;br /&gt;
  mill[1] = bit32.bxor(mill[1],1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Debug function to show the belt and mill&lt;br /&gt;
local function showBeltMill(belt, mill)&lt;br /&gt;
  for z = 1, 13 do&lt;br /&gt;
    print(string.format(&amp;quot;%2d %08x %08x %08x %08x&amp;quot;,z,mill[z],belt[z],&lt;br /&gt;
                        belt[z + 13],belt[z + 26]))&lt;br /&gt;
  end&lt;br /&gt;
  for z = 14, 19 do&lt;br /&gt;
    print(string.format(&amp;quot;%2d %08x&amp;quot;,z,mill[z]))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function initBeltMill()&lt;br /&gt;
  local belt = {}&lt;br /&gt;
  local mill = {}&lt;br /&gt;
  for z = 1, 40 do&lt;br /&gt;
    belt[z] = 0&lt;br /&gt;
  end&lt;br /&gt;
  for z = 1, 19 do&lt;br /&gt;
    mill[z] = 0&lt;br /&gt;
  end&lt;br /&gt;
  return belt, mill&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Output strings which are hex numbers in the same endian order&lt;br /&gt;
-- as RadioGatun[32] test vectors, given a float&lt;br /&gt;
local function makeLittleEndianHex(i)&lt;br /&gt;
  local out = &amp;quot;&amp;quot;&lt;br /&gt;
  for z = 1, 4 do&lt;br /&gt;
    i = math.floor(i)&lt;br /&gt;
    out = out .. string.format(&amp;quot;%02X&amp;quot;,i % 256)&lt;br /&gt;
    i = i / 256&lt;br /&gt;
  end&lt;br /&gt;
  return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Output a 256-bit digest string, given a radiogatun state.  Affects belt and&lt;br /&gt;
-- mill, returns string&lt;br /&gt;
local function makeRG32sum(belt, mill)&lt;br /&gt;
  local out = &amp;quot;&amp;quot;&lt;br /&gt;
  for z = 1, 4 do&lt;br /&gt;
    out = out .. makeLittleEndianHex(mill[2]) .. makeLittleEndianHex(mill[3])&lt;br /&gt;
    beltMill(belt, mill)&lt;br /&gt;
  end&lt;br /&gt;
  return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- RadioGatun input map; given string return belt, mill&lt;br /&gt;
local function RG32inputMap(i)&lt;br /&gt;
  local belt, mill&lt;br /&gt;
  belt, mill = initBeltMill()&lt;br /&gt;
  local phase = 0;&lt;br /&gt;
  for a = 1, string.len(i) do&lt;br /&gt;
    local c = string.byte(i, a)&lt;br /&gt;
    local b&lt;br /&gt;
    c = c % 256&lt;br /&gt;
    c = c * (2 ^ (8 * (phase % 4)))&lt;br /&gt;
    b = math.floor(phase / 4) % 3&lt;br /&gt;
    belt[(13 * b) + 1] = bit32.bxor(belt[(13 * b) + 1],c)&lt;br /&gt;
    mill[17 + b] = bit32.bxor(mill[17 + b],c)&lt;br /&gt;
    phase = phase + 1&lt;br /&gt;
    if phase % 12 == 0 then&lt;br /&gt;
      beltMill(belt, mill)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  -- Padding byte&lt;br /&gt;
  local b = math.floor(phase / 4) % 3&lt;br /&gt;
  local c = 2 ^ (8 * (phase % 4))&lt;br /&gt;
  belt[(13 * b) + 1] = bit32.bxor(belt[(13 * b) + 1],c)&lt;br /&gt;
  mill[17 + b] = bit32.bxor(mill[17 + b],c)&lt;br /&gt;
&lt;br /&gt;
  -- Blank rounds&lt;br /&gt;
  for z = 1, 18 do&lt;br /&gt;
    beltMill(belt,mill)&lt;br /&gt;
  end&lt;br /&gt;
  return belt, mill&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get the input string from a function input&lt;br /&gt;
-- depending on how the parent function is called, this can be a Mediawiki &lt;br /&gt;
-- table with all args or it can be a simple string.&lt;br /&gt;
local function grabString(i)&lt;br /&gt;
  local input = i&lt;br /&gt;
  if type(input) == &amp;quot;table&amp;quot; then&lt;br /&gt;
    local args = nil&lt;br /&gt;
    local pargs = nil&lt;br /&gt;
    args = input.args&lt;br /&gt;
    pargs = input:getParent().args&lt;br /&gt;
    if args and args[1] then &lt;br /&gt;
      input = args[1]&lt;br /&gt;
    elseif pargs and pargs[1] then&lt;br /&gt;
      input = pargs[1]&lt;br /&gt;
    else&lt;br /&gt;
      input = &amp;quot;1234&amp;quot; -- Default value&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return input&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given an input string, make a string with the hex RadioGatun[32] sum&lt;br /&gt;
function p.rg32sum(i)&lt;br /&gt;
  local belt, mill = RG32inputMap(grabString(i))&lt;br /&gt;
  return makeRG32sum(belt,mill)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given an input to hash, return a formatted version of the hash&lt;br /&gt;
-- with both the input and hash value&lt;br /&gt;
function p.rg32(i)&lt;br /&gt;
  local input = grabString(i)&lt;br /&gt;
  local rginput&lt;br /&gt;
  -- Remove formatting from the string we give to the rg32 engine&lt;br /&gt;
  rginput = input:gsub(&amp;quot;{{Background color|#%w+|(%w+)}}&amp;quot;,&amp;quot;%1&amp;quot;)&lt;br /&gt;
  rginput = rginput:gsub(&amp;quot;&amp;lt;[^&amp;gt;]+&amp;gt;&amp;quot;,&amp;quot;&amp;quot;) -- Remove HTML tags&lt;br /&gt;
  rginput = rginput:gsub(&amp;quot;%[%[Category[^%]]+%]%]&amp;quot;,&amp;quot;&amp;quot;) -- Remove categories&lt;br /&gt;
  local sum = p.rg32sum(rginput)&lt;br /&gt;
  -- This is the output in Mediawiki markup format we give to&lt;br /&gt;
  -- the caller of this function&lt;br /&gt;
  return(&amp;#039; RadioGatun[32](&amp;quot;&amp;#039; .. input .. &amp;#039;&amp;quot;) =\n &amp;#039; .. sum)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This script is a standalone Lua script outside of the Wikipedia&lt;br /&gt;
if not mw then&lt;br /&gt;
  if arg and arg[1] then&lt;br /&gt;
    print(p.rg32(arg[1]))&lt;br /&gt;
  else&lt;br /&gt;
    print(p.rg32(&lt;br /&gt;
&amp;#039;The quick brown fox jumps over the lazy {{Background color|#87CEEB|d}}og&amp;#039;))&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Samboy</name></author>
	</entry>
</feed>