;; Done in class ;; recursive version (define mod-expt (lambda (b e m) (define mod* (lambda (x y) (modulo (* x y) m))) (cond ((= e 0) 1) ((odd? e) (mod* b (mod-expt (mod* b b) (quotient e 2) m))) (else (mod-expt (mod* b b) (/ e 2) m))))) ;; iterative version (define mod-expt (lambda (b e m) (define mod* (lambda (x y) (modulo (* x y) m))) (define me (lambda (b e result) (cond ((= e 0) result) ((odd? e) (me (mod* b b) (quotient e 2) (mod* b result))) (else (me (mod* b b) (/ e 2) result))))) (me b e 1)))