先利用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,就會得到一個有理數結果,這導致結果中存在有理數。