ウォンツテック

そでやまのーと

問題 1.19

直感的に行列の変換だと思ったので以下のように解く

ベクトル(a,b)に対して行列T_{pq}を作用させた後のベクトルを
\text{(a', b')}とするとT_{pq}T_{pq} = \small     \begin{pmatrix} p+q & q \\ q & p \end{pmatrix}
となる。
よって、(a, b)にT_{pq}を2回作用させると
\begin{pmatrix} a'' \\ b'' \end{pmatrix} = T_{pa}^2 \begin{pmatrix} a \\ b \end{pmatrix}
 = {\small \begin{pmatrix} p+q & q \\ q & p \end{pmatrix}}^2 \begin{pmatrix} a \\ b \end{pmatrix}
 =  \small \begin{pmatrix} p^2+q^2 + q^2+2pq & q^2+2pq \\ q^2+2pq & p^2+q^2 \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix}
となるのでここで
p' = p^2+q^2 ... ①
q' = q^2+2pq ... ②
と置くと
\begin{pmatrix} a'' \\ b'' \end{pmatrix} = \small \begin{pmatrix} p'+q' & q' \\ q' & p' \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix}
と書けるので求めるq'とp'は①、②の通りである。
\begin{pmatrix} a \\ b \end{pmatrix}T_{pq}をn回作用させる問題はT_{pq}^nを求める問題と同義であり、それは以下のようなアルゴリズムとなる
(define (fib n) 
  (define (fib-iter a b p q n) 
    (cond ((= n 0) b) 
          ((even? n) (fib-iter a 
                               b 
                               (+ (square p) (square q)) 
                               (+ (square q) (* 2 p q)) 
                               (/ n 2))) 
          (else (fib-iter (+ (* a p) (* a q) (* b q)) 
                          (+ (* a q) (* b p)) 
                          p 
                          q 
                          (- n 1))))) 
  (define (square x) (* x x)) 
  (define (even? n) (= (remainder n 2) 0)) 
  (fib-iter 1 0 0 1 n))