Add dense termlist representation
This commit is contained in:
parent
b652e0d3d0
commit
a2e997a5eb
90
2_78.rkt
90
2_78.rkt
|
@ -634,6 +634,60 @@
|
||||||
(tag (negate-termlist termlist))))
|
(tag (negate-termlist termlist))))
|
||||||
'done)
|
'done)
|
||||||
|
|
||||||
|
(define (install-dense-package)
|
||||||
|
|
||||||
|
(define (highest-order-term term-list)
|
||||||
|
(- (length term-list) 1))
|
||||||
|
|
||||||
|
(define empty-termlist? null?)
|
||||||
|
|
||||||
|
(define (adjoin-term term term-list)
|
||||||
|
(define (zero-pad order term-list)
|
||||||
|
(if (= order (highest-order-term term-list))
|
||||||
|
term-list
|
||||||
|
(zero-pad order (cons 0 term-list))))
|
||||||
|
(let ((term-list-order (highest-order-term term-list)))
|
||||||
|
(cond ((and (null? term-list)
|
||||||
|
(= (order term) 0))
|
||||||
|
(list (coeff term)))
|
||||||
|
((= (order term) (+ term-list-order 1))
|
||||||
|
(cons (coeff term) term-list))
|
||||||
|
((= (coeff term) 0)
|
||||||
|
term-list)
|
||||||
|
(else
|
||||||
|
(cons (coeff term)
|
||||||
|
(zero-pad
|
||||||
|
(- (order term) 1)
|
||||||
|
term-list))))))
|
||||||
|
|
||||||
|
(define (tag l) (attach-tag 'dense l))
|
||||||
|
|
||||||
|
;; Constructors
|
||||||
|
(put 'the-empty-termlist 'dense
|
||||||
|
(lambda () (tag '())))
|
||||||
|
|
||||||
|
(put 'adjoin-term '(term dense)
|
||||||
|
(lambda (term termlist)
|
||||||
|
(tag (adjoin-term
|
||||||
|
(apply make-term term)
|
||||||
|
termlist))))
|
||||||
|
|
||||||
|
;; Selectors
|
||||||
|
(put 'first-term '(dense)
|
||||||
|
(lambda (termlist)
|
||||||
|
(make-term
|
||||||
|
(highest-order-term termlist)
|
||||||
|
(car termlist))))
|
||||||
|
|
||||||
|
(put 'rest-terms '(dense)
|
||||||
|
(lambda (termlist)
|
||||||
|
(tag (cdr termlist))))
|
||||||
|
|
||||||
|
(put 'empty-termlist? '(dense)
|
||||||
|
empty-termlist?)
|
||||||
|
|
||||||
|
'done)
|
||||||
|
|
||||||
(define (install-term-package)
|
(define (install-term-package)
|
||||||
(define (make-term order coeff)
|
(define (make-term order coeff)
|
||||||
(tag (list order coeff)))
|
(tag (list order coeff)))
|
||||||
|
@ -748,6 +802,7 @@
|
||||||
(install-complex-package)
|
(install-complex-package)
|
||||||
(install-termlist-package)
|
(install-termlist-package)
|
||||||
(install-sparse-package)
|
(install-sparse-package)
|
||||||
|
(install-dense-package)
|
||||||
(install-term-package)
|
(install-term-package)
|
||||||
(install-polynomial-package)
|
(install-polynomial-package)
|
||||||
|
|
||||||
|
@ -774,41 +829,6 @@
|
||||||
;; It isn't possible to coerce from one to the other, so a mixed-type operator is needed, and this
|
;; It isn't possible to coerce from one to the other, so a mixed-type operator is needed, and this
|
||||||
;; approach would fail.
|
;; approach would fail.
|
||||||
|
|
||||||
(define (highest-order-term term-list)
|
|
||||||
(length term-list))
|
|
||||||
|
|
||||||
(define (make-term-dense order coeff) (list order coeff))
|
|
||||||
(define (order-dense term) (car term))
|
|
||||||
(define (coeff-dense term) (cadr term))
|
|
||||||
(define first-term-dense car)
|
|
||||||
(define (rest-terms-dense term-list)
|
|
||||||
(cdr term-list))
|
|
||||||
(define (make-termlist-dense coeffs)
|
|
||||||
(cond ((null? coeffs) '())
|
|
||||||
((= 0 (car coeffs))
|
|
||||||
(make-termlist-dense (cdr coeffs)))
|
|
||||||
(else (cons (car coeffs)
|
|
||||||
(make-termlist-dense (cdr coeffs))))))
|
|
||||||
(define the-empty-termlist-dense '())
|
|
||||||
(define empty-termlist-dense? null?)
|
|
||||||
|
|
||||||
(define (adjoin-term-dense term term-list)
|
|
||||||
(let ((term-list-order (highest-order-term term-list)))
|
|
||||||
(cond ((and (= (order term) 1)
|
|
||||||
(= term-list-order 0))
|
|
||||||
(make-termlist-dense (list (coeff term))))
|
|
||||||
((= (order term) term-list-order)
|
|
||||||
(make-termlist-dense
|
|
||||||
(cons (add (coeff term)
|
|
||||||
(first-term term-list))
|
|
||||||
(rest-terms term-list))))
|
|
||||||
((> (order term) term-list-order)
|
|
||||||
(make-termlist-dense
|
|
||||||
(cons (coeff term)
|
|
||||||
(adjoin-term-dense
|
|
||||||
(make-term-dense (- (order term) 1) 0)
|
|
||||||
term-list))))
|
|
||||||
(else (adjoin-term-dense term (rest-terms term-list))))))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue