- 636 名前:デフォルトの名無しさん mailto:sage [2005/07/27(水) 04:38:27 ]
- >>633 乗算回数最小はこれでどうだろう? 最速かどうかは知らない。
(define (pow2 x n) (define (pow2-sub l m r) (if (= m 0) r (let loop ((l l)) (if (> (caar l) m) (loop (cdr l)) (pow2-sub (cdr l) (- m (caar l)) (* (cdar l) r)))))) (if (= n 0) 1 (let loop ((m 1) (two^prevm 1) (two^m 2) (r x) (l (list (cons 1 x)))) (if (<= two^m n) (let ((rr (* r r))) (loop (+ m 1) two^m (+ two^m two^m) rr (cons (cons two^m rr) l))) (pow2-sub l (- n two^prevm) r)))))
|

|