Skip to content

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.