Project Euler 97

http://projecteuler.net/index.php?section=problems&id=97


Haskellならそのまま計算できる。

main = print (mod (28433*(2^7830457)+1) (10^10))

これではあんまりなので、なるべく短い桁で計算できるよう、バイナリ法で。

pow_mod n 0 d = 1
pow_mod n m d = mod (if even m then p * p else (mod (p * p) d) * n) d
                    where p = pow_mod n (div m 2) d
main = print (mod (28433 * (pow_mod 2 7830457 (10^10)) + 1) (10^10))