Changeset 2002
- Timestamp:
- 2015-06-16T15:26:56-07:00 (10 years ago)
- File:
-
- 1 edited
-
branches/f4grobner/pol.lisp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/f4grobner/pol.lisp
r2001 r2002 136 136 (defmethod poly-uminus ((self poly))) 137 137 138 (defmethod poly-mul ((p poly) ( poly q)))138 (defmethod poly-mul ((p poly) (q poly))) 139 139 140 140 (defmethod poly-expt ((self poly) n)) … … 148 148 of polynomials in internal form. A similar operation in another computer 149 149 algebra system could be called 'expand' or so." 150 (cond151 ((null expr) (error "Empty expression"))152 ((eql expr 0) (make-poly-zero))153 ((member expr vars :test #'equalp)154 (let ((pos (position expr vars :test #'equalp)))155 (make-poly-variable ring (length vars) pos)))156 ((atom expr)157 (scalar->poly ring expr vars))158 ((eq (car expr) list-marker)159 (cons list-marker (p-eval-list (cdr expr))))160 (t161 (case (car expr)162 (+ (reduce #'p-add (p-eval-list (cdr expr))))163 (- (case (length expr)164 (1 (make-poly-zero))165 (2 (poly-uminus ring (p-eval (cadr expr))))166 (3 (poly-sub ring-and-order (p-eval (cadr expr)) (p-eval (caddr expr))))167 (otherwise (poly-sub ring-and-order (p-eval (cadr expr))168 (reduce #'p-add (p-eval-list (cddr expr)))))))169 (*170 (if (endp (cddr expr)) ;unary171 (p-eval (cdr expr))172 (reduce #'(lambda (p q) (poly-mul ring-and-order p q)) (p-eval-list (cdr expr)))))173 (/174 ;; A polynomial can be divided by a scalar175 (cond176 ((endp (cddr expr))177 ;; A special case (/ ?), the inverse178 (scalar->poly ring (apply (ring-div ring) (cdr expr)) vars))179 (t180 (let ((num (p-eval (cadr expr)))181 (denom-inverse (apply (ring-div ring)182 (cons (funcall (ring-unit ring))183 (mapcar #'p-eval-scalar (cddr expr))))))184 (scalar-times-poly ring denom-inverse num)))))185 (expt186 (cond187 ((member (cadr expr) vars :test #'equalp)188 ;;Special handling of (expt var pow)189 (let ((pos (position (cadr expr) vars :test #'equalp)))190 (make-poly-variable ring (length vars) pos (caddr expr))))191 ((not (and (integerp (caddr expr)) (plusp (caddr expr))))192 ;; Negative power means division in coefficient ring193 ;; Non-integer power means non-polynomial coefficient194 (scalar->poly ring expr vars))195 (t (poly-expt ring-and-order (p-eval (cadr expr)) (caddr expr)))))196 (otherwise197 (scalar->poly ring expr vars)))))))150 (cond 151 ((null expr) (error "Empty expression")) 152 ((eql expr 0) (make-poly-zero)) 153 ((member expr vars :test #'equalp) 154 (let ((pos (position expr vars :test #'equalp))) 155 (make-poly-variable ring (length vars) pos))) 156 ((atom expr) 157 (scalar->poly ring expr vars)) 158 ((eq (car expr) list-marker) 159 (cons list-marker (p-eval-list (cdr expr)))) 160 (t 161 (case (car expr) 162 (+ (reduce #'p-add (p-eval-list (cdr expr)))) 163 (- (case (length expr) 164 (1 (make-poly-zero)) 165 (2 (poly-uminus ring (p-eval (cadr expr)))) 166 (3 (poly-sub ring-and-order (p-eval (cadr expr)) (p-eval (caddr expr)))) 167 (otherwise (poly-sub ring-and-order (p-eval (cadr expr)) 168 (reduce #'p-add (p-eval-list (cddr expr))))))) 169 (* 170 (if (endp (cddr expr)) ;unary 171 (p-eval (cdr expr)) 172 (reduce #'(lambda (p q) (poly-mul ring-and-order p q)) (p-eval-list (cdr expr))))) 173 (/ 174 ;; A polynomial can be divided by a scalar 175 (cond 176 ((endp (cddr expr)) 177 ;; A special case (/ ?), the inverse 178 (scalar->poly ring (apply (ring-div ring) (cdr expr)) vars)) 179 (t 180 (let ((num (p-eval (cadr expr))) 181 (denom-inverse (apply (ring-div ring) 182 (cons (funcall (ring-unit ring)) 183 (mapcar #'p-eval-scalar (cddr expr)))))) 184 (scalar-times-poly ring denom-inverse num))))) 185 (expt 186 (cond 187 ((member (cadr expr) vars :test #'equalp) 188 ;;Special handling of (expt var pow) 189 (let ((pos (position (cadr expr) vars :test #'equalp))) 190 (make-poly-variable ring (length vars) pos (caddr expr)))) 191 ((not (and (integerp (caddr expr)) (plusp (caddr expr)))) 192 ;; Negative power means division in coefficient ring 193 ;; Non-integer power means non-polynomial coefficient 194 (scalar->poly ring expr vars)) 195 (t (poly-expt ring-and-order (p-eval (cadr expr)) (caddr expr))))) 196 (otherwise 197 (scalar->poly ring expr vars)))))) 198 198 199 199 (defun poly-eval-scalar (expr
Note:
See TracChangeset
for help on using the changeset viewer.
