文責: | @naoiwata |
---|
べき乗計算におけるプロセスを考える.
から以下の手続きに翻訳できる.
(define (expt b n)
(if (= n 0)
1
(* b (expt b (- n 1)))))
ステップ数は \(\Theta(n)\), スペースは \(\Theta(n)\) を要する.
(define (expt b n)
(expt-iter b n 1))
(define (expt-iter b counter product)
(if (= counter 0)
product
(* b product)))
ステップ数は \(\Theta(n)\), スペースは \(\Theta(1)\) を要する.
上の定義を用いて逐次平行を利用すると以下の手続きに翻訳できる.
(define (fast-expt b n)
(cond ((= n 0) 1)
((even? n) (square (fast-expt b (/ n 2))))
(else (* b (fast-expt b (- n 1)))))))
ステップ数は \(\Theta(\log n)\), スペースは \(\Theta(\log n)\) を要する.(log は 2 を底とする)
逐次平方を使うことでより少ないステップでの計算が可能になる.