close Warning: Can't synchronize with repository "(default)" (The repository directory has changed, you should resynchronize the repository with: trac-admin $ENV repository resync '(default)'). Look in the Trac log for more information.

source: branches/f4grobner/slow-add.lisp

Last change on this file was 4539, checked in by Marek Rychlik, 8 years ago

* empty log message *

File size: 954 bytes
RevLine 
[4495]1(in-package :polynomial)
2
3(defun f-add (p q order-fn add-fn)
4 "Add two polynomials, P and Q, represented as lists of terms.
5The operation is destructive to both polynomials, as the terms
6of both lists are combined into the result. The operation does not
7create any new instance of TERM."
8 (do (r)
9 ((or (endp p) (endp q))
10 ;; NOTE: R contains the result in reverse order. Can it
11 ;; be more efficient to produce the terms in correct order?
12 (unless (endp q)
13 (setf r (nreconc r q)))
14 (unless (endp p)
15 (setf r (nreconc r p)))
16 r)
17 (multiple-value-bind
18 (greater-p equal-p)
19 (funcall order-fn (car p) (car q))
20 (cond
21 (greater-p
22 (rotatef (cdr p) r p)
23 )
24 (equal-p
25 (let ((s (funcall add-fn (lc p) (lc q))))
26 (cond
27 ((universal-zerop s)
28 (setf p (cdr p))
29 )
30 (t
31 (setf (lc p) s)
32 (rotatef (cdr p) r p))))
33 (setf q (cdr q))
34 )
35 (t
36 (rotatef (cdr q) r q))))))
Note: See TracBrowser for help on using the repository browser.