http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_thm_1.19
; T_pq_(a,b): a' <- bq + aq + ap, b' <- bp + aq ; T_pq_(a',b'): b'' <- p(bp + aq) + q(bq + aq + ap) ; <- bpp + apq + bqq + aqq + apq ; <- (pp + qq)b + (2pq + qq)a ; look for p' = (pp + qq), q' = (2pq + qq) ; a'' <- (bpq + aqq) + (q + p)(bq + aq + ap) ; <- bpq + aqq + bqq + aqq + apq + bpq + apq + app ; <- b(2pq + qq) + a(2pq + qq) + a(qq + pp) (define (fib n) (fib-iter 1 0 0 1 n)) (define (fib-iter a b p q count) (cond ((= count 0) b) ((even? count) (fib-iter a b (+ (* p p) (* q q)) ; compute p' (+ (* 2 p q) (* q q)) ; compute q' (/ count 2))) (else (fib-iter (+ (* b q) (* a q) (* a p)) (+ (* b p) (* a q)) p q (- count 1)))))