Skip to content

Instantly share code, notes, and snippets.

@vznvzn
Created October 11, 2018 16:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vznvzn/4a8b7fc1b2ed323abd9462358ba90576 to your computer and use it in GitHub Desktop.
Save vznvzn/4a8b7fc1b2ed323abd9462358ba90576 to your computer and use it in GitHub Desktop.
def f2(n)
return n.odd? ? (n * 3 + 1) / 2 : n / 2
end
def sub(s, x)
return {'a' => s['a'] * x['a'], 'b' => s['a'] * x['b'] + s['b']}
end
def eb(s)
if (s['a'].odd?) then
xe = {'a' => 2, 'b' => s['b'].odd? ? - 1 : 0}
return sub(s, xe), xe
end
return
end
def ob(s)
if (s['a'].odd?) then
xo = {'a' => 2, 'b' => s['b'].odd? ? 0 : -1 }
return sub(s, xo), xo
end
return
end
def sbt(tr)
if (tr[0, 1] == '0')
k = {'a' => 2, 'b' => 0}
t = {'a' => 1, 'b' => 0}
else
k = {'a' => 2, 'b' => -1}
t = {'a' => 3, 'b' => -1}
end
tr.split('')[1..-1].each \
{
|s|
if (s == '0') then
t, p = eb(t)
else
t, p = ob(t)
t['a'] *= 3
t['b'] = 3 * t['b'] + 1
end
t['a'] /= 2
t['b'] /= 2
k = sub(k, p)
}
return k, t
end
tr = '110110110101101101011011011010110110101101101101011011010110110110101101101011011010110110110101101101'
k, t = sbt(tr)
puts(['Trajectory', tr, ' start =', k, ' end =', t, ' pick any r = 1,2,3,...'].join(' '))
n = k['a'] * 1 + k['b']
tr2 = ''
tr.length.times \
{
tr2 << (n % 2).to_s
n = f2(n)
}
puts("tr == s #{tr == tr2}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment