练习1.16要求仿造fast-expt使用迭代方式求幂。这种方式求幂实在是高明!正常的求幂方式是n*n*...*n,需要乘n趟,但是这个方式每次将解空间缩减一半(很像二分查找),所以最后只需要求logn次。
这里尾递归每趟的不变量就是fast_iter_expt的结果,即p,同样的,偶数时,利用(b^2)^n/2的关系,即每趟n减半,p加倍,而奇数时则变换为偶数
(define (even? n)
(= (remainder n 2) 0))
(define (fast_iter_expt n p)
(cond ((= n 1) p)
((even? n) (fast_iter_expt (/ n 2) (* p p)))
(else (* p (fast_iter_expt (- n 1) p)))))
练习1.19主要是证明出应用Tpq变换2次等于同样形式的Tp'q'。
由题可知,第一次代换结果是:
a=bq+aq+ap
b=bp+aq
第二次代换结果是:
a'=bpq+aq^2+bpq+apq+ap^2+bq^2+aq^2+apq
b'=bp^2+apq+bq^2+aq^2+apq
整理后得到:
a‘=b(p^2+q^2)+a(q^2+2pq)+a(p^2+q^2)
b’=b(p^2+q^2)+a(q^2+2pq)
于是a和b不变的情况下,p变为p‘,q变为q’,即p'=p^2+q^2, q'=q^2+2pq,原题得证。