1.26
; Louis Reasoner is having great difficulty doing Exercise 1.24.
; His fast-prime? test seems to run more slowly than his prime?
; test. Louis calls his friend Eva Lu Ator over to help. When
; they examine Louis’s code, they find that he has rewritten
; the expmod procedure to use an explicit multiplication,
; rather than calling square:
(define (expmod base exp m)
(cond ((= exp 0) 1)
((even? exp)
(remainder (* (expmod base (/ exp 2) m)
(expmod base (/ exp 2) m))
m))
(else
(remainder (* base
(expmod base (- exp 1) m))
m))))
; “I don’t see what difference that could make,” says Louis.
; “I do.” says Eva. “By writing the procedure like that, you
; have transformed the Θ(logn) process into a Θ(n) process.”
; Explain.
; ANSWER
; Explicit multiplication will compute (expmod ...) first,
; and square the result later
; But, in this case, (expmod ...) is computed twice and
; squared later. Morever, this becomes a tree-recursion with
; execution time is linear.