计算机程序的构造与解释 练习1.16, 1.19

本文介绍了使用迭代方式实现快速幂运算的方法,并通过数学推导证明了特定变换应用于二次后的等价形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习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,原题得证。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值