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/mx-grobner.lisp@ 1725

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

* empty log message *

File size: 20.2 KB
Line 
1;;; -*- Mode: Lisp -*-
2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3;;;
4;;; Copyright (C) 1999, 2002, 2009, 2015 Marek Rychlik <rychlik@u.arizona.edu>
5;;;
6;;; This program is free software; you can redistribute it and/or modify
7;;; it under the terms of the GNU General Public License as published by
8;;; the Free Software Foundation; either version 2 of the License, or
9;;; (at your option) any later version.
10;;;
11;;; This program is distributed in the hope that it will be useful,
12;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;;; GNU General Public License for more details.
15;;;
16;;; You should have received a copy of the GNU General Public License
17;;; along with this program; if not, write to the Free Software
18;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19;;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21
22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23;;
24;; Load this file into Maxima to bootstrap the Grobner package.
25;; NOTE: This file does use symbols defined by Maxima, so it
26;; will not work when loaded in Common Lisp.
27;;
28;; DETAILS: This file implements an interface between the Grobner
29;; basis package NGROBNER, which is a pure Common Lisp package, and
30;; Maxima. NGROBNER for efficiency uses its own representation of
31;; polynomials. Thus, it is necessary to convert Maxima representation
32;; to the internal representation and back. The facilities to do so
33;; are implemented in this file.
34;;
35;; Also, since the NGROBNER package consists of many Lisp files, it is
36;; necessary to load the files. It is possible and preferrable to use
37;; ASDF for this purpose. The default is ASDF. It is also possible to
38;; simply used LOAD and COMPILE-FILE to accomplish this task.
39;;
40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41
42(in-package :maxima)
43
44(macsyma-module cgb-maxima)
45
46
47(eval-when
48 #+gcl (load eval)
49 #-gcl (:load-toplevel :execute)
50 (format t "~&Loading maxima-grobner ~a ~a~%"
51 "$Revision: 2.0 $" "$Date: 2015/06/02 0:34:17 $"))
52
53;;FUNCTS is loaded because it contains the definition of LCM
54($load "functs")
55#+sbcl(progn (require 'asdf) (load "ngrobner.asd")(asdf:load-system :ngrobner))
56
57(use-package :ngrobner)
58
59
60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61;;
62;; Maxima expression ring
63;;
64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65;;
66;; This is how we perform operations on coefficients
67;; using Maxima functions.
68;;
69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
70
71(defparameter +maxima-ring+
72 (make-ring
73 ;;(defun coeff-zerop (expr) (meval1 `(($is) (($equal) ,expr 0))))
74 :parse #'(lambda (expr)
75 (when modulus (setf expr ($rat expr)))
76 expr)
77 :unit #'(lambda () (if modulus ($rat 1) 1))
78 :zerop #'(lambda (expr)
79 ;;When is exactly a maxima expression equal to 0?
80 (cond ((numberp expr)
81 (= expr 0))
82 ((atom expr) nil)
83 (t
84 (case (caar expr)
85 (mrat (eql ($ratdisrep expr) 0))
86 (otherwise (eql ($totaldisrep expr) 0))))))
87 :add #'(lambda (x y) (m+ x y))
88 :sub #'(lambda (x y) (m- x y))
89 :uminus #'(lambda (x) (m- x))
90 :mul #'(lambda (x y) (m* x y))
91 ;;(defun coeff-div (x y) (cadr ($divide x y)))
92 :div #'(lambda (x y) (m// x y))
93 :lcm #'(lambda (x y) (meval1 `((|$LCM|) ,x ,y)))
94 :ezgcd #'(lambda (x y) (apply #'values (cdr ($ezgcd ($totaldisrep x) ($totaldisrep y)))))
95 ;; :gcd #'(lambda (x y) (second ($ezgcd x y)))))
96 :gcd #'(lambda (x y) ($gcd x y))))
97
98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99;;
100;; Maxima expression parsing
101;;
102;;
103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104;;
105;; Functions and macros dealing with internal representation
106;; structure.
107;;
108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109
110(defun equal-test-p (expr1 expr2)
111 (alike1 expr1 expr2))
112
113(defun coerce-maxima-list (expr)
114 "Convert a Maxima list to Lisp list."
115 (cond
116 ((and (consp (car expr)) (eql (caar expr) 'mlist)) (cdr expr))
117 (t expr)))
118
119(defun free-of-vars (expr vars) (apply #'$freeof `(,@vars ,expr)))
120
121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
122;;
123;; Order utilities
124;;
125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126
127(defun find-ring-by-name (ring)
128 "This function returns the ring structure bases on input symbol."
129 (cond
130 ((null ring) nil)
131 ((symbolp ring)
132 (case ring
133 ((maxima-ring :maxima-ring #:maxima-ring $expression_ring #:expression_ring)
134 +maxima-ring+)
135 ((ring-of-integers :ring-of-integers #:ring-of-integers $ring_of_integers) +ring-of-integers+)
136 (otherwise
137 (mtell "~%Warning: Ring ~M not found. Using default.~%" ring))))
138 (t
139 (mtell "~%Ring specification ~M is not recognized. Using default.~%" ring)
140 nil)))
141
142(defun find-order-by-name (order)
143 "This function returns the order function bases on its name."
144 (cond
145 ((null order) nil)
146 ((symbolp order)
147 (case order
148 ((lex :lex $lex #:lex)
149 #'lex>)
150 ((grlex :grlex $grlex #:grlex)
151 #'grlex>)
152 ((grevlex :grevlex $grevlex #:grevlex)
153 #'grevlex>)
154 ((invlex :invlex $invlex #:invlex)
155 #'invlex>)
156 (otherwise
157 (mtell "~%Warning: Order ~M not found. Using default.~%" order))))
158 (t
159 (mtell "~%Order specification ~M is not recognized. Using default.~%" order)
160 nil)))
161
162(defun find-ring-and-order-by-name (&optional
163 (ring (find-ring-by-name $poly_coefficient_ring))
164 (order (find-order-by-name $poly_monomial_order))
165 (elimination-order (find-order-by-name $poly_elimination_order))
166 (primary-elimination-order (find-order-by-name $poly_primary_elimination_order))
167 (secondary-elimination-order (find-order-by-name $poly_secondary_elimination_order))
168 &aux
169 (ring-and-order (make-ring-and-order
170 :ring ring
171 :order order
172 :elimination-order elimination-order
173 :primary-elimination-order primary-elimination-order
174 :secondary-elimination-order secondary-elimination-order)))
175 "Build RING-AND-ORDER structure. The defaults are determined by various Maxima-level switches,
176which are names of ring and orders."
177 ring-and-order)
178
179(defun maxima->poly (expr vars
180 &optional
181 (ring-and-order (find-ring-and-order-by-name))
182 &aux
183 (vars (coerce-maxima-list vars))
184 (ring (ro-ring ring-and-order)))
185 "Convert a maxima polynomial expression EXPR in variables VARS to
186internal form. This works by first converting the expression to Lisp,
187and then evaluating the expression using polynomial arithmetic
188implemented by the POLYNOMIAL package."
189 (labels ((parse (arg) (maxima->poly arg vars ring-and-order))
190 (parse-list (args) (mapcar #'parse args)))
191 (cond
192 ((eql expr 0) (make-poly-zero))
193 ((member expr vars :test #'equal-test-p)
194 (let ((pos (position expr vars :test #'equal-test-p)))
195 (make-poly-variable ring (length vars) pos)))
196 ((free-of-vars expr vars)
197 ;;This means that variable-free CRE and Poisson forms will be converted
198 ;;to coefficients intact
199 (coerce-coeff ring expr vars))
200 (t
201 (case (caar expr)
202 (mplus (reduce #'(lambda (x y) (poly-add ring-and-order x y)) (parse-list (cdr expr))))
203 (mminus (poly-uminus ring (parse (cadr expr))))
204 (mtimes
205 (if (endp (cddr expr)) ;unary
206 (parse (cdr expr))
207 (reduce #'(lambda (p q) (poly-mul ring-and-order p q)) (parse-list (cdr expr)))))
208 (mexpt
209 (cond
210 ((member (cadr expr) vars :test #'equal-test-p)
211 ;;Special handling of (expt var pow)
212 (let ((pos (position (cadr expr) vars :test #'equal-test-p)))
213 (make-poly-variable ring (length vars) pos (caddr expr))))
214 ((not (and (integerp (caddr expr)) (plusp (caddr expr))))
215 ;; Negative power means division in coefficient ring
216 ;; Non-integer power means non-polynomial coefficient
217 (mtell "~%Warning: Expression ~%~M~%contains power which is not a positive integer. Parsing as coefficient.~%"
218 expr)
219 (coerce-coeff ring expr vars))
220 (t (poly-expt ring (parse (cadr expr)) (caddr expr)))))
221 (mrat (parse ($ratdisrep expr)))
222 (mpois (parse ($outofpois expr)))
223 (otherwise
224 (coerce-coeff ring expr vars)))))))
225
226(defun maxima->poly-list (expr vars
227 &optional
228 (ring-and-order (find-ring-and-order-by-name)))
229 "Convert a Maxima representation of a list of polynomials to the internal form."
230 (case (caar expr)
231 (mlist (mapcar #'(lambda (p)
232 (maxima->poly p vars ring-and-order))
233 (cdr expr)))
234 (otherwise (merror "Expression ~M is not a list of polynomials in variables ~M."
235 expr vars))))
236
237(defun maxima->poly-list-of-lists (poly-list-of-lists vars
238 &optional
239 (ring-and-order (find-ring-and-order-by-name)))
240 "Parse a Maxima representation of a list of lists of polynomials."
241 (mapcar #'(lambda (g) (maxima->poly-list g vars ring-and-order))
242 (coerce-maxima-list poly-list-of-lists)))
243
244
245
246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
247;;
248;; Conversion from internal form to Maxima general form
249;;
250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
251
252(defun maxima-head ()
253 (if $poly_return_term_list
254 '(mlist)
255 '(mplus)))
256
257(defun poly->maxima (poly-type object vars)
258 (case poly-type
259 (:poly
260 `(,(maxima-head) ,@(mapcar #'(lambda (term) (poly->maxima :term term vars)) (poly-termlist object))))
261 (:poly-list
262 `((mlist) ,@(mapcar #'(lambda (p) ($ratdisrep (poly->maxima :polynomial p vars))) object)))
263 (:term
264 `((mtimes) ,($ratdisrep (term-coeff object))
265 ,@(mapcar #'(lambda (var power) `((mexpt) ,var ,power))
266 vars (monom->list (term-monom object)))))
267 ;; Assumes that Lisp and Maxima logicals coincide
268 (:logical object)
269 (otherwise
270 object)))
271
272
273;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
274;;
275;; Unary and binary operation definition facility
276;;
277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
278
279(defmacro define-unop (maxima-name fun-name
280 &optional (documentation nil documentation-supplied-p))
281 "Define a MAXIMA-level unary operator MAXIMA-NAME corresponding to unary function FUN-NAME."
282 `(defun ,maxima-name (p vars
283 &aux
284 (vars (coerce-maxima-list vars))
285 (p (parse-poly p vars)))
286 ,@(when documentation-supplied-p (list documentation))
287 (coerce-to-maxima :polynomial (,fun-name +maxima-ring+ p) vars)))
288
289(defmacro define-binop (maxima-name fun-name
290 &optional (documentation nil documentation-supplied-p))
291 "Define a MAXIMA-level binary operator MAXIMA-NAME corresponding to binary function FUN-NAME."
292 `(defmfun ,maxima-name (p q vars
293 &aux
294 (vars (coerce-maxima-list vars))
295 (p (parse-poly p vars))
296 (q (parse-poly q vars)))
297 ,@(when documentation-supplied-p (list documentation))
298 (coerce-to-maxima :polynomial (,fun-name +maxima-ring+ p q) vars)))
299
300
301(defvar *ring-and-order* nil)
302
303;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
304;;
305;; Facilities for evaluating Grobner package expressions
306;; within a prepared environment
307;;
308;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
309
310#|
311(defmacro with-monomial-order ((order) &body body)
312 "Evaluate BODY with monomial order set to ORDER."
313 `(let ((*monomial-order* (or (find-order ,order) *monomial-order*)))
314 . ,body))
315
316(defmacro with-coefficient-ring ((ring) &body body)
317 "Evaluate BODY with coefficient ring set to RING."
318 `(let ((+maxima-ring+ (or (find-ring ,ring) +maxima-ring+)))
319 . ,body))
320
321(defmacro with-ring-and-order ((ring order) &body body)
322 "Evaluate BODY with monomial order set to ORDER and coefficient ring set to RING."
323 `(let ((*monomial-order* (or (find-order ,order) *monomial-order*))
324 (+maxima-ring+ (or (find-ring ,ring) +maxima-ring+)))
325 . ,body))
326
327(defmacro with-elimination-orders ((primary secondary elimination-order)
328 &body body)
329 "Evaluate BODY with primary and secondary elimination orders set to PRIMARY and SECONDARY."
330 `(let ((*primary-elimination-order* (or (find-order ,primary) *primary-elimination-order*))
331 (*secondary-elimination-order* (or (find-order ,secondary) *secondary-elimination-order*))
332 (*elimination-order* (or (find-order ,elimination-order) *elimination-order*)))
333 . ,body))
334
335|#
336
337
338;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
339;;
340;; Maxima-level interface functions
341;;
342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343
344;; Auxillary function for removing zero polynomial
345(defun remzero (plist) (remove #'poly-zerop plist))
346
347;;Simple operators
348
349(define-binop $poly_add poly-add
350 "Adds two polynomials P and Q")
351
352(define-binop $poly_subtract poly-sub
353 "Subtracts a polynomial Q from P.")
354
355(define-binop $poly_multiply poly-mul
356 "Returns the product of polynomials P and Q.")
357
358(define-binop $poly_s_polynomial spoly
359 "Returns the syzygy polynomial (S-polynomial) of two polynomials P and Q.")
360
361(define-unop $poly_primitive_part poly-primitive-part
362 "Returns the polynomial P divided by GCD of its coefficients.")
363
364(define-unop $poly_normalize poly-normalize
365 "Returns the polynomial P divided by the leading coefficient.")
366
367;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
368;;
369;; Macro facility for writing Maxima-level wrappers for
370;; functions operating on internal representation
371;;
372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373
374(defmacro with-ring-and-order (((maxima-vars &optional (maxima-new-vars nil new-vars-supplied-p))
375 &key (polynomials nil)
376 (poly-lists nil)
377 (poly-list-lists nil)
378 (value-type nil))
379 &body body
380 &aux (vars (gensym))
381 (new-vars (gensym)))
382 `(let ((,vars (coerce-maxima-list ,maxima-vars))
383 ,@(when new-vars-supplied-p
384 (list `(,new-vars (coerce-maxima-list ,maxima-new-vars)))))
385 (coerce-to-maxima
386 ,value-type
387 (let ((*ring-and-order* ,(find-ring-and-order-by-name
388 :ring ,$poly_coefficient_ring
389 :order ,$poly_monomial_order
390 :elimination-order ,$poly_primary_elimination_order
391 :primary-elimination-order ,$poly_secondary_elimination_order
392 :secondary-elimination-order ,$poly_elimination_order)))
393 (let ,(let ((args nil))
394 (dolist (p polynomials args)
395 (setf args (cons `(,p (parse-poly ,p ,vars)) args)))
396 (dolist (p poly-lists args)
397 (setf args (cons `(,p (parse-poly-list ,p ,vars)) args)))
398 (dolist (p poly-list-lists args)
399 (setf args (cons `(,p (parse-poly-list-list ,p ,vars)) args))))
400 . ,body))))
401 ,(if new-vars-supplied-p
402 `(append ,vars ,new-vars)
403 vars))))
404
405
406;;Functions
407
408(defmfun $poly_expand (p vars)
409 "This function is equivalent to EXPAND(P) if P parses correctly to a polynomial.
410If the representation is not compatible with a polynomial in variables VARS,
411the result is an error."
412 (with-ring-and-order ((vars) :polynomials (p)
413 :value-type :polynomial)
414 p))
415
416#|
417
418(defmfun $poly_expt (p n vars)
419 (with-parsed-polynomials ((vars) :polynomials (p) :value-type :polynomial)
420 (poly-expt +maxima-ring+ p n)))
421
422(defmfun $poly_content (p vars)
423 (with-parsed-polynomials ((vars) :polynomials (p))
424 (poly-content +maxima-ring+ p)))
425
426(defmfun $poly_pseudo_divide (f fl vars
427 &aux (vars (coerce-maxima-list vars))
428 (f (parse-poly f vars))
429 (fl (parse-poly-list fl vars)))
430 (multiple-value-bind (quot rem c division-count)
431 (poly-pseudo-divide +maxima-ring+ f fl)
432 `((mlist)
433 ,(coerce-to-maxima :poly-list quot vars)
434 ,(coerce-to-maxima :polynomial rem vars)
435 ,c
436 ,division-count)))
437
438(defmfun $poly_exact_divide (f g vars)
439 (with-parsed-polynomials ((vars) :polynomials (f g) :value-type :polynomial)
440 (poly-exact-divide +maxima-ring+ f g)))
441
442(defmfun $poly_normal_form (f fl vars)
443 (with-parsed-polynomials ((vars) :polynomials (f)
444 :poly-lists (fl)
445 :value-type :polynomial)
446 (normal-form +maxima-ring+ f (remzero fl) nil)))
447
448(defmfun $poly_buchberger_criterion (g vars)
449 (with-parsed-polynomials ((vars) :poly-lists (g) :value-type :logical)
450 (buchberger-criterion +maxima-ring+ g)))
451
452(defmfun $poly_buchberger (fl vars)
453 (with-parsed-polynomials ((vars) :poly-lists (fl) :value-type :poly-list)
454 (buchberger +maxima-ring+ (remzero fl) 0 nil)))
455
456(defmfun $poly_reduction (plist vars)
457 (with-parsed-polynomials ((vars) :poly-lists (plist)
458 :value-type :poly-list)
459 (reduction +maxima-ring+ plist)))
460
461(defmfun $poly_minimization (plist vars)
462 (with-parsed-polynomials ((vars) :poly-lists (plist)
463 :value-type :poly-list)
464 (minimization plist)))
465
466(defmfun $poly_normalize_list (plist vars)
467 (with-parsed-polynomials ((vars) :poly-lists (plist)
468 :value-type :poly-list)
469 (poly-normalize-list +maxima-ring+ plist)))
470
471(defmfun $poly_grobner (f vars)
472 (with-parsed-polynomials ((vars) :poly-lists (f)
473 :value-type :poly-list)
474 (grobner +maxima-ring+ (remzero f))))
475
476(defmfun $poly_reduced_grobner (f vars)
477 (with-parsed-polynomials ((vars) :poly-lists (f)
478 :value-type :poly-list)
479 (reduced-grobner +maxima-ring+ (remzero f))))
480
481(defmfun $poly_depends_p (p var mvars
482 &aux (vars (coerce-maxima-list mvars))
483 (pos (position var vars)))
484 (if (null pos)
485 (merror "~%Variable ~M not in the list of variables ~M." var mvars)
486 (poly-depends-p (parse-poly p vars) pos)))
487
488(defmfun $poly_elimination_ideal (flist k vars)
489 (with-parsed-polynomials ((vars) :poly-lists (flist)
490 :value-type :poly-list)
491 (elimination-ideal +maxima-ring+ flist k nil 0)))
492
493(defmfun $poly_colon_ideal (f g vars)
494 (with-parsed-polynomials ((vars) :poly-lists (f g) :value-type :poly-list)
495 (colon-ideal +maxima-ring+ f g nil)))
496
497(defmfun $poly_ideal_intersection (f g vars)
498 (with-parsed-polynomials ((vars) :poly-lists (f g) :value-type :poly-list)
499 (ideal-intersection +maxima-ring+ f g nil)))
500
501(defmfun $poly_lcm (f g vars)
502 (with-parsed-polynomials ((vars) :polynomials (f g) :value-type :polynomial)
503 (poly-lcm +maxima-ring+ f g)))
504
505(defmfun $poly_gcd (f g vars)
506 ($first ($divide (m* f g) ($poly_lcm f g vars))))
507
508(defmfun $poly_grobner_equal (g1 g2 vars)
509 (with-parsed-polynomials ((vars) :poly-lists (g1 g2))
510 (grobner-equal +maxima-ring+ g1 g2)))
511
512(defmfun $poly_grobner_subsetp (g1 g2 vars)
513 (with-parsed-polynomials ((vars) :poly-lists (g1 g2))
514 (grobner-subsetp +maxima-ring+ g1 g2)))
515
516(defmfun $poly_grobner_member (p g vars)
517 (with-parsed-polynomials ((vars) :polynomials (p) :poly-lists (g))
518 (grobner-member +maxima-ring+ p g)))
519
520(defmfun $poly_ideal_saturation1 (f p vars)
521 (with-parsed-polynomials ((vars) :poly-lists (f) :polynomials (p)
522 :value-type :poly-list)
523 (ideal-saturation-1 +maxima-ring+ f p 0)))
524
525(defmfun $poly_saturation_extension (f plist vars new-vars)
526 (with-parsed-polynomials ((vars new-vars)
527 :poly-lists (f plist)
528 :value-type :poly-list)
529 (saturation-extension +maxima-ring+ f plist)))
530
531(defmfun $poly_polysaturation_extension (f plist vars new-vars)
532 (with-parsed-polynomials ((vars new-vars)
533 :poly-lists (f plist)
534 :value-type :poly-list)
535 (polysaturation-extension +maxima-ring+ f plist)))
536
537(defmfun $poly_ideal_polysaturation1 (f plist vars)
538 (with-parsed-polynomials ((vars) :poly-lists (f plist)
539 :value-type :poly-list)
540 (ideal-polysaturation-1 +maxima-ring+ f plist 0 nil)))
541
542(defmfun $poly_ideal_saturation (f g vars)
543 (with-parsed-polynomials ((vars) :poly-lists (f g)
544 :value-type :poly-list)
545 (ideal-saturation +maxima-ring+ f g 0 nil)))
546
547(defmfun $poly_ideal_polysaturation (f ideal-list vars)
548 (with-parsed-polynomials ((vars) :poly-lists (f)
549 :poly-list-lists (ideal-list)
550 :value-type :poly-list)
551 (ideal-polysaturation +maxima-ring+ f ideal-list 0 nil)))
552
553(defmfun $poly_lt (f vars)
554 (with-parsed-polynomials ((vars) :polynomials (f) :value-type :polynomial)
555 (make-poly-from-termlist (list (poly-lt f)))))
556
557(defmfun $poly_lm (f vars)
558 (with-parsed-polynomials ((vars) :polynomials (f) :value-type :polynomial)
559 (make-poly-from-termlist (list (make-term (poly-lm f) (funcall (ring-unit +maxima-ring+)))))))
560
561|#
Note: See TracBrowser for help on using the repository browser.