Open Source WEB

##(link2sicp "book-Z-H-18.html#%_thm_2.97" "Exercise 2.97")

解答例

a

polynomialパッケージに追加。

(define (reduce-poly p1 p2)
    (if (same-variable? (variable p1) (variable p2))
        (map (lambda (x) (make-polynomial (variable p1) x))
             (reduce-terms (term-list p1)
                           (term-list p2)))
        (error "Polys not in same var -- REDUCE-POLY"
               (list p1 p2))))

(define (reduce-terms t1 t2)
    (let ((gcdterms (gcd-terms t1 t2)))
      (list (car (div-terms t1 gcdterms))
            (car (div-terms t2 gcdterms)))))

(put 'reduce '(polynomial polynomial) reduce-poly)

汎用演算に追加。

(define (reduce n d) (apply-generic 'reduce n d))
b

rationalパッケージに追加。 正規化(分母の最初の係数が負の時、分母分子の係数を正負反転する) も行うようにしてある。

(define (make-rat n d)
    (cond ((and (eq? 'scheme-number (type-tag n))
               (eq? 'scheme-number (type-tag d)))
           (let* ((result (reduce n d))
                  (numer (car result))
                  (denom (cadr result)))
             (if (> 0 denom)
                 (cons (negate numer) (negate denom))
                 (cons (car result) (cadr result)))))
          ((and (eq? 'polynomial (type-tag n))
                (eq? 'polynomial (type-tag d)))
           (let* ((result (reduce n d))
                  (numer (car result))
                  (denom (cadr result)))
             (if (> 0 (coeff 1 denom))
                 (cons (negate numer) (negate denom))
                 (cons (car result) (cadr result)))))))

scheme-numberパッケージに追加。

(define (reduce-integers n d)
    (let ((g (gcd n d)))
      (list (/ n g) (/ d g))))

(put 'reduce '(scheme-number scheme-number) reduce-integers)

polynomialパッケージに追加。

(define (nth-coeff n p)
    (let loop ((n n)
               (tl (term-list p)))
      (if (= n 1)
          (coeff (first-term tl))
          (loop (- n 1) (rest-terms tl)))))
(put 'coeff '(scheme-number polynomial) nth-coeff)

汎用演算に追加。

(define (coeff n x) (apply-generic 'coeff n x))

実行例

Gauche-0.8.5を使う。

a

gosh> (define p1 (make-polynomial 'x '((1 1) (0 1))))  ;; x + 1
p1
gosh> (define p2 (make-polynomial 'x '((3 1) (0 -1)))) ;; x^3 - 1
p2
gosh> (define p3 (make-polynomial 'x '((1 1))))        ;; x
p3
gosh> (define p4 (make-polynomial 'x '((2 1) (0 -1)))) ;; x^2 - 1
p4
gosh> (reduce p1 p2)
((polynomial x (1 -1) (0 -1)) (polynomial x (3 -1) (0 1)))
gosh> (reduce p1 p4)
((polynomial x (0 1)) (polynomial x (1 1) (0 -1)))
gosh> (reduce p2 p4)
((polynomial x (2 1) (1 1) (0 1)) (polynomial x (1 1) (0 1)))

p1 = x + 1 p2 = x^3 - 1 = (x - 1)*(x^2 + x + 1) p3 = x p4 = x^2 - 1 = (x - 1)*(x + 1)

b

gosh> (define rf1 (make-rational p1 p2))
rf1
gosh> (define rf2 (make-rational p3 p4))
rf2
gosh> (add rf1 rf2)
(rational (polynomial x (3 1) (2 2) (1 3) (0 1)) 
           polynomial x (4 1) (3 1) (1 -1) (0 -1))

--hidenao

コード

##(sicp-answer-code "ex-2.97.scm")

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us