冪乗のバイナリ法による演算

知りませんでした。
これはすごい。すごいと書いてるけど納得はしてない。
指数を 2 で割りながら反復する、同時にそのときの底を二乗する。
指数が 2 の冪乗でないときは、余った分の最初の底を乗じる。
これは素敵すぎるな。
冪乗 - Wikipedia
プログラマーに数学は必須 ? | スラド サイエンス
Good Programmers learn Mathematics

;; 10進数を2進数に
(define (dec2bin n)
  (define (iter x l)
    (cond ((= 0 x)
           (reverse l))
          ((= 0 (remainder x 2))
           (iter (quotient x 2) (append l '(0))))
          (else
           (iter (quotient x 2) (append l '(1))))))
  (iter n '()))

;; 下位桁から
(define (powerexponential a n)
  (define (iter p n v)
    (display (format "~a ~a ~a" p n v))
    (newline)
    (if (= n 0)
        v
        (iter (* p p)
              (quotient n 2)
              (if (= 1 (remainder n 2))
                  (* v p)
                  v))))
  (iter a n 1))

;; 上位桁から
(define (powerexponential a n)
  (define (iter n v)
    (display (format "~a ~a" n v))
    (newline)
    (if (null? n)
        v
        (iter (cdr n) (* v v (if (= 1 (car n)) a 1)))))
  (iter (dec2bin n) 1))
# 下位桁バージョン
gosh> (powerexponential 2 43)
2 43 1
4 21 2
16 10 8
256 5 8
65536 2 2048
4294967296 1 2048
18446744073709551616 0 8796093022208
8796093022208
# 上位桁バージョン
gosh> (powerexponential 2 43)
(1 0 1 0 1 1) 1
(0 1 0 1 1) 2
(1 0 1 1) 4
(0 1 1) 32
(1 1) 1024
(1) 2097152
() 8796093022208
8796093022208