(lambda (b p m) (if (= p 0) 1 (let me ((p p)) (if (= p 1) b (let* ((z (me (arithmetic-shift p -1)))(y (modulo (* z z) m))) (if (odd? p) (modulo (* y b) m) y)))))) (lambda (b p m) (let me ((p p))(cond ((= p 0) 1) ((even? p)(let ((x (me (arithmetic-shift p -1))))(modulo (* x x) m))) (#t (modulo (* b (me (- p 1))) m))))) ; test (let* ((G ((((fileVal "RC4") "Seed stuff") 'rbi) (expt 2 6500))) (me (fileVal "mod-exp")) (g (G))(a (G))(b (G))(n (G))) (= (me (me g a n) b n) (me (me g b n) a n))) ; => #t (10.5 sec)