05/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)))))