####
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