Я сделал несколько собственных попыток. Пока возведение в квадрат по квадрату работает хорошо, но та же проблема с bigNum. такая рекурсивная вещь как
def exponentiation(base, exp, y = 1)
if(exp == 0)
return y
end
case exp%2
when 0 then
exp = exp/2
base = (base*base)%@@mod
exponentiation(base, exp, y)
when 1 then
y = (base*y)%@@mod
exp = exp - 1
exponentiation(base, exp, y)
end
end
однако, как я понимаю, было бы ужасной идеей полагаться на первоклассный класс ruby в отношении чего-либо существенного. Руби использует Сито Эратосфена для своего основного генератора, но, что еще хуже, он использует пробное деление для gcd и тому подобного ...
о, и @@ mod была переменной класса, поэтому, если вы планируете использовать это сами, вы можете добавить ее в качестве параметра или чего-то еще.
Я заставил его работать довольно быстро за
ставит aexponentiation (100000000000000, 1222555345678)
чисел в этом диапазоне.
(с использованием @@ mod = 80233)