Skip to content

2.88

; Extend the polynomial system to include subtraction of polynomials. (Hint: You may
; find it helpful to define a generic negation operation.)

(load "packages/general.scm")

; Add the following genric negation operations
; (i) scheme-numer
(put 'negate '(scheme-number) (lambda (x) (tag (- x))))

; (ii) rational
(put 'negate '(rational) 
    (lambda (r) (make-rat (- numer r) (denom r))))

; (iii) complex
(put 'negate '(complex)
    (lambda (z) (make-from-real-imag 
                    (- (real-part z))
                    (- (imag-part z)))))

; (iv) Polynomial package
(define (negate-terms term-list)
    (if (empty-termlist? term-list)
        the-empty-termlist
        (adjoin-term
            (make-term 
                (order (first-term term-list)) 
                (negate (coeff (first-term term-list))))
            (negate-terms (rest-terms term-list)))))
(define (sub-poly p1 p2)
    (if (same-variable? (variable p1) (variable p2))
        (make-poly 
            (variable p1)
            (add-terms (term-list p1) (negate-terms (term-list p2))))
        (error "Polys not in same var: SUB-POLY" (list p1 p2))))
(put 'negate '(polynomial)
    (lambda (p) 
        (make-polynomial 
            (variable p)
            (negate-terms (term-list p)))))
(put 'sub '(polynomial polynomial)
    (lambda (p1 p2) (tag (sub-poly p1 p2))))

(load "packages/polynomial.scm")
(load "arithmetic-package.scm")

(install-polynomial-package)

; Testing
(define p1 
    (make-polynomial 
        'x
        (list (make-term  2  (make-scheme-number 2))
              (make-term  1  (make-scheme-number 5))
              (make-term  0  (make-scheme-number 3))))) ; 2x^2 + 5x + 3

(define p2 
    (make-polynomial 
        'x
        (list (make-term  3  (make-scheme-number 1))
              (make-term  1  (make-scheme-number 4))
              (make-term  0  (make-scheme-number 2))))) ; x^3 + 4x + 2

(sub p2 p1)
; (polynomial x 
;    (3 (scheme-number . 1)) 
;    (2 (scheme-number . -2))
;    (1 (scheme-number . -1))
;    (0 (scheme-number . -1)) -> x^3 - 2x^2 - c - 1