sicp 1.25

比较下面两个函数:

 

(define (expmod1 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))))

 

(define (expmod2 base exp m)
  (remainder (fast-expt base exp) m))

(define (fast-expt b n)
  (fast-expt-iter 1 b n))

(define (fast-expt-iter a b n)
  (cond ((= n 0) a)
        ((even? n) (fast-expt-iter a (square b) (/ n 2)))
        (else (fast-expt-iter (* a b) b (- n 1)))))

(define (square x)
  (* x x))

 

例如计算b ^ n mod m

expmod1的方式:((((b ^ 2) ^ 2)...^2) mod m * (b ^ n') mod m) mod m

expmod2的方式:((((b ^ 2) ^ 2)...^2) * (b ^ n')) mod m

区别在于mod运算的时间,expmod1并未计算出最终的b ^ n的值,通过中间的mod运算,减少了运算量(数字越大运算量越大)

 

你可能感兴趣的:(SICP)