Working on 2.92
This commit is contained in:
@@ -788,6 +788,7 @@
|
|||||||
(define (coeff term) (cadr term))
|
(define (coeff term) (cadr term))
|
||||||
|
|
||||||
(define (add-terms L1 L2)
|
(define (add-terms L1 L2)
|
||||||
|
;(display "ADD-TERMS ") (display L1) (display L2) (newline)
|
||||||
(cond ((empty-termlist? L1) L2)
|
(cond ((empty-termlist? L1) L2)
|
||||||
((empty-termlist? L2) L1)
|
((empty-termlist? L2) L1)
|
||||||
(else
|
(else
|
||||||
@@ -805,13 +806,57 @@
|
|||||||
(add-terms (rest-terms L1)
|
(add-terms (rest-terms L1)
|
||||||
(rest-terms L2)))))))))
|
(rest-terms L2)))))))))
|
||||||
|
|
||||||
|
(define (get-coercion-target p1 p2)
|
||||||
|
(let ((v1 (variable p1))
|
||||||
|
(v2 (variable p2)))
|
||||||
|
(cond
|
||||||
|
; Here we could introduce an ordering where we find the variable with
|
||||||
|
; the highest ordering and return it, but for testing purposes let's
|
||||||
|
; just hardcode it.
|
||||||
|
((and (eq? v1 'y) (eq? v2 'x)) 'x)
|
||||||
|
((and (eq? v1 'x) (eq? v2 'y)) 'x)
|
||||||
|
(else (error "Coercion not supported -- GET-COERCION-TARGET"
|
||||||
|
(list p1 p2))))))
|
||||||
|
|
||||||
|
(define (coerce-terms terms target-var)
|
||||||
|
(display "COERCE-TERMS ") (display terms) (newline)
|
||||||
|
(define (coerce-term t)
|
||||||
|
(display "COERCE-TERM ") (display t) (newline)
|
||||||
|
; XXX: implement this
|
||||||
|
(make-term (order t) 1))
|
||||||
|
(if (empty-termlist? terms)
|
||||||
|
terms
|
||||||
|
(adjoin-term (coerce-term (first-term terms))
|
||||||
|
(coerce-terms (rest-terms terms) target-var))))
|
||||||
|
|
||||||
|
|
||||||
|
(define (coerce-poly p target-var)
|
||||||
|
(display "COERCE-POLY ") (display p) (newline)
|
||||||
|
(if (eq? (variable p) target-var)
|
||||||
|
p
|
||||||
|
(make-poly target-var (coerce-terms (term-list p) target-var))))
|
||||||
|
|
||||||
|
(define (coerce-polys p1 p2)
|
||||||
|
(let ((coercion-target-variable (get-coercion-target p1 p2)))
|
||||||
|
(if coercion-target-variable
|
||||||
|
(list (coerce-poly p1 coercion-target-variable)
|
||||||
|
(coerce-poly p2 coercion-target-variable))
|
||||||
|
#f)))
|
||||||
|
|
||||||
(define (add-poly p1 p2)
|
(define (add-poly p1 p2)
|
||||||
|
;(display "ADD-POLY ") (display p1) (display p2) (newline)
|
||||||
(if (same-variable? (variable p1) (variable p2))
|
(if (same-variable? (variable p1) (variable p2))
|
||||||
(make-poly (variable p1)
|
(make-poly (variable p1)
|
||||||
(add-terms (term-list p1)
|
(add-terms (term-list p1)
|
||||||
(term-list p2)))
|
(term-list p2)))
|
||||||
(error "Polys not in same var -- ADD-POLY"
|
(let ((coerced-polys (coerce-polys p1 p2)))
|
||||||
(list p1 p2))))
|
(display "COERCED-POLYS ") (newline)
|
||||||
|
(display "1 ") (display (car coerced-polys)) (newline)
|
||||||
|
(display "2 ") (display (cadr coerced-polys)) (newline)
|
||||||
|
(if coerced-polys
|
||||||
|
(add-poly (car coerced-polys) (cadr coerced-polys))
|
||||||
|
(error "Polys not in same var -- ADD-POLY"
|
||||||
|
(list p1 p2))))))
|
||||||
|
|
||||||
(define (sub-poly p1 p2)
|
(define (sub-poly p1 p2)
|
||||||
(define (negate-term term)
|
(define (negate-term term)
|
||||||
@@ -856,14 +901,6 @@
|
|||||||
(error "Polys not in same var -- MUL-POLY"
|
(error "Polys not in same var -- MUL-POLY"
|
||||||
(list p1 p2))))
|
(list p1 p2))))
|
||||||
|
|
||||||
; Division can be performed via long division. That is, divide the
|
|
||||||
; highest-order term of the dividend by the highest-order term of the
|
|
||||||
; divisor. The result is the first term of the quotient. Next, multiply the
|
|
||||||
; result by the divisor, subtract that from the dividend, and produce the
|
|
||||||
; rest of the answer by recursively dividing the difference by the divisor.
|
|
||||||
; Stop when the order of the divisor exceeds the order of the dividend and
|
|
||||||
; declare the dividend to be the remainder. Also, if the dividend ever
|
|
||||||
; becomes zero, return zero as both quotient and remainder.
|
|
||||||
(define (div-terms L1 L2)
|
(define (div-terms L1 L2)
|
||||||
(define (negate-term t)
|
(define (negate-term t)
|
||||||
(make-term (order t) (negate (coeff t))))
|
(make-term (order t) (negate (coeff t))))
|
||||||
@@ -958,5 +995,20 @@
|
|||||||
(assert (cadr result) (make-poly-dense 'x '((1 1) (0 -1)))))
|
(assert (cadr result) (make-poly-dense 'x '((1 1) (0 -1)))))
|
||||||
|
|
||||||
|
|
||||||
(display "\nex-2.92\n")
|
(display "\nex-2.92 - coerce polynomials\n")
|
||||||
|
|
||||||
|
(define p1 (make-poly-dense
|
||||||
|
'x
|
||||||
|
(list (list 1 (make-poly-dense
|
||||||
|
'y
|
||||||
|
'((2 1) (0 1)))))))
|
||||||
|
(define p2 (make-poly-dense
|
||||||
|
'y
|
||||||
|
(list (list 2 (make-poly-dense
|
||||||
|
'x
|
||||||
|
'((2 1) (0 1)))))))
|
||||||
|
|
||||||
|
(display (add p1 p2)) (newline)
|
||||||
|
|
||||||
|
(display "\nex-2.93\n")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user