计算机程序的构造和解释 练习题2.95

先利用2.94练习的程序,定义p1 p2 p3,然后计算q1 q2,最后求出最大公约多项式。

(define p1 (make-polynomial 'x (make-sparse-terms '((2 1) (1 -2) (0 1)))))
(define p2 (make-polynomial 'x (make-sparse-terms '((2 11) (0 7)))))
(define p3 (make-polynomial 'x (make-sparse-terms '((1 13) (0 5)))))
(define q1 (mul p1 p2))
(define q2 (mul p1 p3))
(mul p1 p2)
(mul p1 p3)
(greatest-common-div-divisor q1 q2)

运算结果像题目说的结果并不是p1,而是带有分数的结果。

'done
'done
'done
'done
'(polynomial x sparse (4 11) (3 -22) (2 18) (1 -14) (0 7))
'(polynomial x sparse (3 13) (2 -21) (1 3) (0 5))
'(polynomial x sparse (2 8 106/169) (1 -17 43/169) (0 8 106/169))

看下最终的结果,如果给每个系数都除以8又106/169,得到刚好是我们的p1,在最大公约多项式的时候出现了有理数,这显然不是我们希望的。接着我们跟踪gcd-terms,查看具体的运算结果。

  (define (div-terms L1 L2)
    (if (empty-termlist? L1)
        (list (the-empty-termlist) (the-empty-termlist))
        (let ((t1 (first-term L1))
              (t2 (first-term L2)))
          (if (> (order t2) (order t1))
              (list (the-empty-termlist) L1)
              (let ((new-c (div (coeff t1) (coeff t2)))
                    (new-o (- (order t1) (order t2))))
                (if (=zero? new-c)
                     (list (the-empty-termlist) L1)
                     (let ((rest-of-result (div-terms (sub-terms L1 (mul-term-by-all-terms (make-term new-o new-c) L2)) L2)))
                       (list (adjoin-term (make-term new-o new-c) (car rest-of-result)) (cadr rest-of-result))
                       )))))))

跟踪程序发现,其实产生分数的原因是得到商(new-c (div (coeff t1) (coeff t2))的新系数的时候,使用了div的通用表达式,两个整数使用div,就会得到一个有理数结果,这导致结果中存在有理数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值