The following program is designed to calculate base^expo mod m
.
(define (expmod base expo m)
(define (square n)
(* n n))
(define (even? n)
(= (remainder n 2) 0))
(define (expmod-iter base expo m result)
(cond ((= expo 0) result)
((even? expo)
(expmod-iter base
(/ expo 2)
m
(remainder (square result) m)))
(else
(expmod-iter base
(- expo 1)
m
(remainder (* base result) m)))))
(expmod-iter base expo m 1))
In fact, I'm trying to convert a tail-recursive program from SICP to its iterative equivalent. Here is the original program:
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (square (expmod base (/ exp 2) m))
m))
(else
(remainder (* base (expmod base (- exp 1) m))
m))))
The result of (expmod 42 1000000007 1000000007)
is 270001056, but according to Fermat's Little Theorem, since 1000000007 is prime, the result should be 42.
What am I doing wrong?