; diffie hellman key exchange
(define (expm b e m)
(define (m* x y) (modulo (* x y) m))
(cond ((zero? e) 1)
((even? e) (expm (m* b b) (/ e 2) m))
(else (m* b (expm (m* b b) (/ (- e 1) 2) m)))))
(display (expm 5 6 23)) (newline)
(display (expm 5 15 23)) (newline)
(display (expm 19 6 23)) (newline)
(display (expm 8 15 23)) (newline)