Modular exponentiation: Difference between revisions

→‎{{header|Haskell}}: Added mod=1 case and improved readability by moving final expression into the pattern match and introducing where variables
(Frink)
(→‎{{header|Haskell}}: Added mod=1 case and improved readability by moving final expression into the pattern match and introducing where variables)
Line 876:
 
=={{header|Haskell}}==
<lang haskell>
<lang haskell>powmmodPow :: Integer -> Integer -> Integer -> Integer -> Integer
powm b 0 m r = r
powmmodPow b e m1 r = 0
powmmodPow b 0 m r = r
| e `mod` 2 == 1 = powm (b * b `mod` m) (e `div` 2) m (r * b `mod` m)
modPow b e m r
powm b e m r = powm (b * b `mod` m) (e `div` 2) m r
| e `mod` 2 == 1 = powmmodPow (b' * b `mod` m) (e `div` 2)' m (r * b `mod` m)
| otherwise = modPow b' e' m r
where
b' = b * b `mod` m
e' = e `div` 2
 
main ::= IO ()do
print (modPow 2988348162058574136915891421498819466320163312926952423791023078876139
main =
print $
powm
2988348162058574136915891421498819466320163312926952423791023078876139
2351399303373464486466122544523690094744975233415544072992656881240319
(10 ^ 40)
1</lang>)
</lang>
{{out}}
<pre>1527229998585248450016808958343740453059</pre>