-------------------------
-- 冪乗法
-----------------------------------------
-- 『素因数分解と素数判定』 p.29 参照
--
-- + 関数 f は Monoid 則を満していること。
-- + e の初期値 : 関数 f の単位元
--
-- ex : 2^100 == power (*) 1 2 100
--
power :: Integral a => (t -> t -> t) -> t -> t -> a -> t
power _ e _ 0 = e
power f e a n = power f (if odd n then f a e else e) (f a a) (div n 2)

--
-- a^n (mod m)
--
po
power :: Integral a => (t -> t -> t) -> t -> t -> a -> t
power _ e _ 0 = e
power _ e _ 0 = e