-
Notifications
You must be signed in to change notification settings - Fork 194
Closed
Description
The code below shows this issue.
On Truffleruby, using pow(a, m)
is orders of magnitude slower than on [C|J]Ruby, where it's the fastest.
# Enable YJIT if using CRuby >= 3.3"
RubyVM::YJIT.enable if RUBY_ENGINE == 'ruby' and RUBY_VERSION.to_f >= 3.3
def modinv(a0, m0)
return 1 if m0 == 1
a, m = a0, m0
x0, inv = 0, 1
while a > 1
inv -= (a / m) * x0
a, m = m, a % m
x0, inv = inv, x0
end
inv += m0 if inv < 0
inv
end
def modinv1(r, m)
inv = r
while (r * inv) % m != 1; inv %= m; inv *= r end
inv % m
end
def modinv2(r, m)
inv = r
while (r * inv) % m != 1; inv = (inv * r) end
inv #% m
end
def modinv3(r, m, rescnt)
(r ** (rescnt-1)) % m
end
def modinv4(r, m, rescnt)
r.pow(rescnt-1, m)
end
def tm; t = Time.now; yield; Time.now - t end
resp7 = [11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,
97,101,103,107,109,113,121,127,131,137,139,143,149,151,157,163,
167,169,173,179,181,187,191,193,197,199,209,211]
print resp7.map { |r| modinv(r, 210) }
puts
print resp7.map { |r| modinv1(r, 210) }
puts
print resp7.map { |r| modinv2(r, 210) }
puts
print resp7.map { |r| modinv3(r, 210, 48) }
puts
print resp7.map { |r| modinv4(r, 210, 48) }
puts
puts tm{ 100000.times {resp7.each { |r| modinv(r, 210) } } }
puts tm{ 100000.times {resp7.each { |r| modinv1(r, 210) } } }
puts tm{ 100000.times {resp7.each { |r| modinv2(r, 210) } } }
puts tm{ 100000.times {resp7.each { |r| modinv3(r, 210, 48) } } }
puts tm{ 100000.times {resp7.each { |r| modinv4(r, 210, 48) } } }