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/.junk/poly-eval.lisp@ 1055

Last change on this file since 1055 was 1055, checked in by Marek Rychlik, 9 years ago

* empty log message *

  • Property svn:mime-type set to application/x-elc
File size: 2.8 KB
Line 
1(defun variable-basis (ring n &aux (basis (make-list n)))
2 "Generate a list of polynomials X[i], i=0,1,...,N-1."
3 (dotimes (i n basis)
4 (setf (elt basis i) (make-variable ring n i))))
5
6
7(defun poly-eval-1 (expr vars &optional (ring *ring-of-integers*) (order #'lex>)
8 &aux
9 (ring-and-order (make-ring-and-order :ring ring :order order))
10 (n (length vars))
11 (basis (variable-basis ring (length vars))))
12 "Evaluate an expression EXPR as polynomial by substituting operators
13+ - * expt with corresponding polynomial operators and variables VARS
14with the corresponding polynomials in internal form. We use special
15versions of binary operators $poly+, $poly-, $minus-poly, $poly* and
16$poly-expt which work like the corresponding functions in the POLY
17package, but accept scalars as arguments as well. The result is a
18polynomial in internal form. This operation is somewhat similar to
19the function EXPAND in CAS."
20 (cond
21 ((numberp expr)
22 (cond
23 ((zerop expr) NIL)
24 (t (make-poly-from-termlist (list (make-term (make-monom :dimension n) expr))))))
25 ((symbolp expr)
26 (nth (position expr vars) basis))
27 ((consp expr)
28 (case (car expr)
29 (expt
30 (if (= (length expr) 3)
31 ($poly-expt ring-and-order
32 (poly-eval-1 (cadr expr) vars ring order)
33 (caddr expr)
34 n)
35 (error "Too many arguments to EXPT")))
36 (/
37 (if (and (= (length expr) 3)
38 (numberp (caddr expr)))
39 ($poly/ ring (cadr expr) (caddr expr))
40 (error "The second argument to / must be a number")))
41 (otherwise
42 (let ((r (mapcar
43 #'(lambda (e) (poly-eval-1 e vars ring order))
44 (cdr expr))))
45 (ecase (car expr)
46 (+ (reduce #'(lambda (p q) ($poly+ ring-and-order p q n)) r))
47 (-
48 (if (endp (cdr r))
49 ($minus-poly ring (car r) n)
50 ($poly- ring-and-order
51 (car r)
52 (reduce #'(lambda (p q) ($poly+ ring-and-order p q n)) (cdr r))
53 n)))
54 (*
55 (reduce #'(lambda (p q) ($poly* ring-and-order p q n)) r))
56 )))))))
57
58
59
60(defun poly-eval (expr vars &optional (order #'lex>) (ring *ring-of-integers*))
61 "Evaluate an expression EXPR, which should be a polynomial
62expression or a list of polynomial expressions (a list of expressions
63marked by prepending keyword :[ to it) given in Lisp prefix notation,
64in variables VARS, which should be a list of symbols. The result of
65the evaluation is a polynomial or a list of polynomials (marked by
66prepending symbol '[) in the internal alist form. This evaluator is
67used by the PARSE package to convert input from strings directly to
68internal form."
69 (cond
70 ((numberp expr)
71 (unless (zerop expr)
72 (make-poly-from-termlist
73 (list (make-term (make-monom :dimension (length vars)) expr)))))
74 ((or (symbolp expr) (not (eq (car expr) :[)))
75 (poly-eval-1 expr vars ring order))
76 (t (cons '[ (mapcar #'(lambda (p) (poly-eval-1 p vars ring order)) (rest expr))))))
77
78
Note: See TracBrowser for help on using the repository browser.