Mod "inside" or "outside"
-- O(n), but bounded by n
encode' n 0 msg = 1
encode' n 1 msg = mod msg n
encode' n e msg = mod ((mod (msg * msg) n) *
(encode' n (e-1) msg)) n
Log-n
encode'' n 0 msg = 1
encode'' n 1 msg = mod msg n
encode'' n e msg =
let bits = bitsrep e
modexp a n d b' =
if d then mod (d * d * a) n
else mod (d * d) n
in foldr1 (modexp msg n 1) bitsrep