Multiplicative order: Difference between revisions

Content added Content deleted
(Added EchoLisp)
(→‎{{header|Ruby}}: corrected require (deprecated 'mathn'), add output)
Line 858: Line 858:
=={{header|Ruby}}==
=={{header|Ruby}}==


<lang ruby>require 'rational' # for lcm
<lang ruby>require 'prime'
require 'mathn' # for prime_division


def powerMod(b, p, m)
def powerMod(b, p, m)
p.to_s(2).each_char.inject(1) do |result, bit|
result = 1
bits = p.to_s(2)
for bit in bits.split('')
result = (result * result) % m
result = (result * result) % m
if bit == '1'
bit=='1' ? (result * b) % m : result
result = (result * b) % m
end
end
end
result
end
end


Line 878: Line 872:
r = 1
r = 1
for q, e in t.prime_division
for q, e in t.prime_division
x = powerMod(a, t / q ** e, pk)
x = powerMod(a, t / q**e, pk)
while x != 1
while x != 1
r *= q
r *= q
Line 888: Line 882:


def multOrder(a, m)
def multOrder(a, m)
m.prime_division.inject(1) {|result, f|
m.prime_division.inject(1) do |result, f|
result.lcm(multOrder_(a, *f))
result.lcm(multOrder_(a, *f))
}
end
end
end


puts multOrder(37, 1000) # 100
puts multOrder(37, 1000)
b = 10**20-1
b = 10**20-1
puts multOrder(2, b) # 3748806900
puts multOrder(2, b)
puts multOrder(17,b) # 1499522760
puts multOrder(17,b)
b = 100001
b = 100001
puts multOrder(54,b)
puts multOrder(54,b)
Line 905: Line 899:
puts 'Everything checks.'
puts 'Everything checks.'
end</lang>
end</lang>

{{out}}
<pre>
100
3748806900
1499522760
9090
1
Everything checks.
</pre>


=={{header|Seed7}}==
=={{header|Seed7}}==