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))))
|
||||
'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 (make-term order coeff)
|
||||
(tag (list order coeff)))
|
||||
|
@ -748,6 +802,7 @@
|
|||
(install-complex-package)
|
||||
(install-termlist-package)
|
||||
(install-sparse-package)
|
||||
(install-dense-package)
|
||||
(install-term-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
|
||||
;; 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