Module: Ob
- Defined in:
- lib/ob.rb
Overview
++ ob
Class Method Summary collapse
-
.F(j, arg) ⇒ Object
A pseudorandom function for j in (0..3).
- .Fe(r, a, b, k, f, m) ⇒ Object
- .fe(r, a, b, f, m) ⇒ Object
- .fein(arg) ⇒ Object
- .fein_loop(pyn) ⇒ Object
- .feis(arg) ⇒ Object
-
.fen(r, a, b, f, m) ⇒ Object
TODO: FIXME.
- .Fen(r, a, b, k, f, m) ⇒ Object
- .fynd(arg) ⇒ Object
- .fynd_loop(cry) ⇒ Object
- .tail(arg) ⇒ Object
Class Method Details
.F(j, arg) ⇒ Object
A pseudorandom function for j in (0..3)
8 9 10 11 |
# File 'lib/ob.rb', line 8 def self.F(j, arg) raku = [0xb76d5eed, 0xee281300, 0x85bcae01, 0x4b387af7] Muk.muk(raku[j], arg) end |
.Fe(r, a, b, k, f, m) ⇒ Object
17 18 19 20 |
# File 'lib/ob.rb', line 17 def self.Fe(r, a, b, k, f, m) c = fe(r, a, b, f, m) c < k ? c : fe(r, a, b, f, c) end |
.fe(r, a, b, f, m) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/ob.rb', line 22 def self.fe(r, a, b, f, m) loop_fn = lambda do |j, ell, arr| if j > r if r.odd? a * arr + ell else arr == a ? a * arr + ell : a * ell + arr end else eff = f.call(j - 1, arr) # Assuming f is a Proc/lambda tmp = if j.odd? (ell + eff) % a else (ell + eff) % b end loop_fn.call(j + 1, arr, tmp) end end left = m % a right = m / a loop_fn.call(1, left, right) end |
.fein(arg) ⇒ Object
98 99 100 |
# File 'lib/ob.rb', line 98 def self.fein(arg) fein_loop(arg) end |
.fein_loop(pyn) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/ob.rb', line 85 def self.fein_loop(pyn) lo = pyn & 0xffffffff hi = pyn & 0xffffffff00000000 if (pyn >= 0x10000) && (pyn <= 0xffffffff) 0x10000 + feis(pyn - 0x10000) elsif (pyn >= 0x100000000) && (pyn <= 0xffffffffffffffff) hi | fein_loop(lo) else pyn end end |
.feis(arg) ⇒ Object
13 14 15 |
# File 'lib/ob.rb', line 13 def self.feis(arg) Fe(4, 65_535, 65_536, 0xffffffff, method(:F), arg) end |
.fen(r, a, b, f, m) ⇒ Object
TODO: FIXME
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/ob.rb', line 59 def self.fen(r, a, b, f, m) # Inner recursive function using Ruby way of doing recursion loop_fn = lambda do |j, ell, arr| return a * arr + ell if j < 1 eff = f.call(j - 1, ell) # Assuming f is a Proc/lambda # Same comment about deviation from B&R (2002) tmp = if j.odd? (arr + a - (eff % a)) % a else (arr + b - (eff % b)) % b end loop_fn.call(j - 1, tmp, ell) end ahh = r.odd? ? m / a : m % a ale = r.odd? ? m % a : m / a left = ale == a ? ahh : ale right = ale == a ? ale : ahh loop_fn.call(r, left, right) end |
.Fen(r, a, b, k, f, m) ⇒ Object
53 54 55 56 |
# File 'lib/ob.rb', line 53 def self.Fen(r, a, b, k, f, m) c = fen(r, a, b, f, m) c < k ? c : fen(r, a, b, f, c) end |
.fynd(arg) ⇒ Object
115 116 117 |
# File 'lib/ob.rb', line 115 def self.fynd(arg) fynd_loop(arg) end |
.fynd_loop(cry) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/ob.rb', line 102 def self.fynd_loop(cry) lo = cry & 0xffffffff hi = cry & 0xffffffff00000000 if (cry >= 0x10000) && (cry <= 0xffffffff) 0x10000 + tail(cry - 0x10000) elsif (cry >= 0x100000000) && (cry <= 0xffffffffffffffff) hi | fynd_loop(lo) else cry end end |
.tail(arg) ⇒ Object
49 50 51 |
# File 'lib/ob.rb', line 49 def self.tail(arg) Fen(4, 65_535, 65_536, 0xffffffff, method(:F), arg) end |