You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
2.2 KiB
204 lines
2.2 KiB
2 years ago
|
|
||
|
Exercise 1.19: There is a clever algorithm for
|
||
|
computing the Fibonacci numbers in a logarithmic number of steps. Recall the
|
||
|
transformation of the state variables
|
||
|
a
|
||
|
and
|
||
|
b
|
||
|
in the fib-iter
|
||
|
process of 1.2.2:
|
||
|
a
|
||
|
←
|
||
|
a
|
||
|
+
|
||
|
b
|
||
|
and
|
||
|
b
|
||
|
←
|
||
|
a
|
||
|
.
|
||
|
Call this transformation
|
||
|
T
|
||
|
, and observe that applying
|
||
|
T
|
||
|
over and over
|
||
|
again
|
||
|
n
|
||
|
times, starting with 1 and 0, produces the pair
|
||
|
|
||
|
Fib
|
||
|
(
|
||
|
n
|
||
|
+
|
||
|
1
|
||
|
)
|
||
|
|
||
|
and
|
||
|
|
||
|
|
||
|
Fib
|
||
|
(
|
||
|
n
|
||
|
)
|
||
|
|
||
|
. In other words, the Fibonacci numbers are produced
|
||
|
by applying
|
||
|
|
||
|
T
|
||
|
n
|
||
|
|
||
|
, the
|
||
|
|
||
|
n
|
||
|
|
||
|
th
|
||
|
|
||
|
|
||
|
power of the transformation
|
||
|
T
|
||
|
,
|
||
|
starting with the pair (1, 0). Now consider
|
||
|
T
|
||
|
to be the special case of
|
||
|
|
||
|
|
||
|
p
|
||
|
=
|
||
|
0
|
||
|
|
||
|
and
|
||
|
|
||
|
q
|
||
|
=
|
||
|
1
|
||
|
|
||
|
in a family of transformations
|
||
|
|
||
|
T
|
||
|
|
||
|
p
|
||
|
q
|
||
|
|
||
|
|
||
|
,
|
||
|
where
|
||
|
|
||
|
T
|
||
|
|
||
|
p
|
||
|
q
|
||
|
|
||
|
|
||
|
transforms the pair
|
||
|
|
||
|
(
|
||
|
a
|
||
|
,
|
||
|
b
|
||
|
)
|
||
|
|
||
|
according to
|
||
|
|
||
|
a
|
||
|
←
|
||
|
|
||
|
b
|
||
|
q
|
||
|
|
||
|
+
|
||
|
|
||
|
a
|
||
|
q
|
||
|
|
||
|
+
|
||
|
|
||
|
a
|
||
|
p
|
||
|
|
||
|
and
|
||
|
b
|
||
|
←
|
||
|
|
||
|
b
|
||
|
p
|
||
|
|
||
|
+
|
||
|
|
||
|
a
|
||
|
q
|
||
|
|
||
|
.
|
||
|
Show that if we apply such a transformation
|
||
|
|
||
|
T
|
||
|
|
||
|
p
|
||
|
q
|
||
|
|
||
|
|
||
|
twice, the
|
||
|
effect is the same as using a single transformation
|
||
|
|
||
|
T
|
||
|
|
||
|
|
||
|
p
|
||
|
′
|
||
|
|
||
|
|
||
|
q
|
||
|
′
|
||
|
|
||
|
|
||
|
|
||
|
of the
|
||
|
same form, and compute
|
||
|
|
||
|
p
|
||
|
′
|
||
|
|
||
|
|
||
|
and
|
||
|
|
||
|
q
|
||
|
′
|
||
|
|
||
|
|
||
|
in terms of
|
||
|
p
|
||
|
and
|
||
|
q
|
||
|
. This
|
||
|
gives us an explicit way to square these transformations, and thus we can
|
||
|
compute
|
||
|
|
||
|
T
|
||
|
n
|
||
|
|
||
|
using successive squaring, as in the fast-expt
|
||
|
procedure. Put this all together to complete the following procedure, which
|
||
|
runs in a logarithmic number of steps:41
|
||
|
|
||
|
|
||
|
(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
|
||
|
⟨??⟩ ;compute p'
|
||
|
⟨??⟩ ;compute q'
|
||
|
(/ count 2)))
|
||
|
(else
|
||
|
(fib-iter (+ (* b q)
|
||
|
(* a q)
|
||
|
(* a p))
|
||
|
(+ (* b p)
|
||
|
(* a q))
|
||
|
p
|
||
|
q
|
||
|
(- count 1)))))
|