Chapter 2, Building Abstractions with Data

Section - 2.5 - Systems with Generic Operations

Exercise 2.94


Following are the required changes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
; gcd polynomial functions
(define (gcd-terms a b)
     (if (empty-termlist? b)
         a
         (gcd-terms b (remainder-terms a b))
     )
)

(define (remainder-terms a b)
      (cadr (div-terms a b))
)

(define (gcd-poly p1 p2)
    (if (same-variable? (variable p1) (variable p2))
        (make-poly (variable p1) (gcd-terms (term-list p1) (term-list p2)))
        (error "Polynomials are not in same variable")
    )
)


;changes for installing gcd

; generic gcd (outside all packages or global)
(define (greatest-common-divisor a b)
  (apply-generic 'greatest-common-divisor a b)
)

;in polynomial package
(put 'greatest-common-divisor '(polynomial polynomial) (lambda (a b) (tag (gcd-poly a b))))

; in integer package
(put 'greatest-common-divisor '(int int) (lambda (a b) (tag (gcd a b))))

; in 'scheme-number package
(put 'greatest-common-divisor '(scheme-number scheme-number) gcd)

Output:

1
2
3
4
> (define p1 (make-polynomial 'x (attach-tag 'sparse-termlist '((4 1) (3 -1) (2 -2) (1 2)))))
> (define p2 (make-polynomial 'x (attach-tag 'sparse-termlist '((3 1) (1 -1)))))
> (display (greatest-common-divisor p1 p2))
(polynomial x sparse-termlist (2 -1) (1 1))

Thus the gcd of and is . Manually I got the same gcd but with opposite sign i.e. .

Note that I also found a bug in my old div-terms procedure where I should be using cadr but was using cdr instead.