RosettaCodeData/Task/Modular-exponentiation/Haskell/modular-exponentiation-2.hs

22 lines
527 B
Haskell

powerMod :: Integer -> Integer -> Integer -> Integer
powerMod b e m = x
where
(_, _, x) =
until
(\(_, e, _) -> e <= 0)
(\(b, e, x) ->
( mod (b * b) m
, div e 2
, if 0 /= mod e 2
then mod (b * x) m
else x))
(b, e, 1)
main :: IO ()
main =
print $
powerMod
2988348162058574136915891421498819466320163312926952423791023078876139
2351399303373464486466122544523690094744975233415544072992656881240319
(10 ^ 40)