SICP 問題 1.26 (計算の呼び出し回数による増加の割合の違い)
【問題】
Louis Reasoner は問題 1.24 がなかなかうまくいかなかった。彼のfast-prime?よりずっと遅いようであった。
Louis は友人の Eva Lu Ator に助けを求めた。
Louis のプログラムを見ていると、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))))
「違いが分からん」とLouis。「分かる」とEvaが言った。
「手続きをこのように書き換えたので、Θ(log n)のプロセスをΘ(n)にしてしまった。
説明せよ。
【解答】
expが偶数のとき、expmodを一回計算すればよいところを2回計算することになっているため?