問題2.94 – SICP(計算機プログラムの構造と解釈)その103

問題2.94

多項式の算術演算パッケージに最大公約数を求める手続きを追加する。

(define (install-polynomial-package)
...
  (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 "Polys not in same var -- GCD-POLY" (list p1 p2))))
...
  (put 'greatest-common-divisor '(polynomial polynomial)
       (lambda (p1 p2) (tag (gcd-poly p1 p2))))
...
  'done)

整数の算術演算パッケージにに最大公約数を求める手続きを追加する。

(define (install-integer-package)
...
  (define (gcd a b)
    (if (= b 0)
        a
        (gcd b (remainder a b))))
...
  (put 'greatest-common-divisor '(integer integer) gcd)
...
  'done)

汎用演算として greatest-common-divisor 手続きを追加する。

(define (greatest-common-divisor a b) (apply-generic 'greatest-common-divisor a b))

実行結果

(define p1 (make-polynomial 'x '((4 1) (3 -1) (2 -2) (1 2)))) ;; x^4 - x^3 - 2x^2 + 2x
;(polynomial x (4 1) (3 -1) (2 -2) (1 2))
(define p2 (make-polynomial 'x '((3 1) (1 -1)))) ;; x^3 - x
;(polynomial x (3 1) (1 -1))
(greatest-common-divisor p1 p2)
gosh> (polynomial x (2 -1) (1 1))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»