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@ 1939

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

* empty log message *

File size: 21.9 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;; Global switches
62;;
63;; Can be used in Maxima just fine, as they observe the
64;; Maxima naming convention, i.e. all names visible at the
65;; Maxima toplevel begin with a '$'.
66;;
67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68
69(defvar $poly_monomial_order '$lex
70 "This switch controls which monomial order is used in polynomial
71and Grobner basis calculations. If not set, LEX will be used")
72
73(defvar $poly_coefficient_ring '$expression_ring
74 "This switch indicates the coefficient ring of the polynomials
75that will be used in grobner calculations. If not set, Maxima's
76general expression ring will be used. This variable may be set
77to RING_OF_INTEGERS if desired.")
78
79(defvar $poly_primary_elimination_order nil
80 "Name of the default order for eliminated variables in elimination-based functions.
81If not set, LEX will be used.")
82
83(defvar $poly_secondary_elimination_order nil
84 "Name of the default order for kept variables in elimination-based functions.
85If not set, LEX will be used.")
86
87(defvar $poly_elimination_order nil
88 "Name of the default elimination order used in elimination calculations.
89If set, it overrides the settings in variables POLY_PRIMARY_ELIMINATION_ORDER
90and SECONDARY_ELIMINATION_ORDER. The user must ensure that this is a true
91elimination order valid for the number of eliminated variables.")
92
93(defvar $poly_return_term_list nil
94 "If set to T, all functions in this package will return each polynomial as a
95list of terms in the current monomial order rather than a Maxima general expression.")
96
97
98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99;;
100;; Maxima expression ring
101;;
102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103;;
104;; This is how we perform operations on coefficients
105;; using Maxima functions.
106;;
107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
108
109(defparameter +maxima-ring+
110 (make-ring
111 ;;(defun coeff-zerop (expr) (meval1 `(($is) (($equal) ,expr 0))))
112 :parse #'(lambda (expr)
113 (when modulus (setf expr ($rat expr)))
114 expr)
115 :unit #'(lambda () (if modulus ($rat 1) 1))
116 :zerop #'(lambda (expr)
117 ;;When is exactly a maxima expression equal to 0?
118 (cond ((numberp expr)
119 (= expr 0))
120 ((atom expr) nil)
121 (t
122 (case (caar expr)
123 (mrat (eql ($ratdisrep expr) 0))
124 (otherwise (eql ($totaldisrep expr) 0))))))
125 :add #'(lambda (x y) (m+ x y))
126 :sub #'(lambda (x y) (m- x y))
127 :uminus #'(lambda (x) (m- x))
128 :mul #'(lambda (x y) (m* x y))
129 ;;(defun coeff-div (x y) (cadr ($divide x y)))
130 :div #'(lambda (x y) (m// x y))
131 :lcm #'(lambda (x y) (meval1 `((|$LCM|) ,x ,y)))
132 :ezgcd #'(lambda (x y) (apply #'values (cdr ($ezgcd ($totaldisrep x) ($totaldisrep y)))))
133 ;; :gcd #'(lambda (x y) (second ($ezgcd x y)))))
134 :gcd #'(lambda (x y) ($gcd x y))))
135
136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
137;;
138;; Maxima expression parsing
139;;
140;;
141;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
142;;
143;; Functions and macros dealing with internal representation
144;; structure.
145;;
146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147
148(defun equal-test-p (expr1 expr2)
149 (alike1 expr1 expr2))
150
151(defun coerce-maxima-list (expr)
152 "Convert a Maxima list to Lisp list."
153 (cond
154 ((and (consp (car expr)) (eql (caar expr) 'mlist)) (cdr expr))
155 (t expr)))
156
157(defun free-of-vars (expr vars) (apply #'$freeof `(,@vars ,expr)))
158
159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160;;
161;; Order utilities
162;;
163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164
165(defun find-ring-by-name (ring)
166 "This function returns the ring structure bases on input symbol."
167 (cond
168 ((null ring) nil)
169 ((symbolp ring)
170 (case ring
171 ((maxima-ring :maxima-ring #:maxima-ring $expression_ring #:expression_ring)
172 +maxima-ring+)
173 ((ring-of-integers :ring-of-integers #:ring-of-integers $ring_of_integers) +ring-of-integers+)
174 (otherwise
175 (mtell "~%Warning: Ring ~M not found. Using default.~%" ring))))
176 (t
177 (mtell "~%Ring specification ~M is not recognized. Using default.~%" ring)
178 nil)))
179
180(defun find-order-by-name (order)
181 "This function returns the order function bases on its name."
182 (cond
183 ((null order) nil)
184 ((symbolp order)
185 (case order
186 ((lex :lex $lex #:lex)
187 #'lex>)
188 ((grlex :grlex $grlex #:grlex)
189 #'grlex>)
190 ((grevlex :grevlex $grevlex #:grevlex)
191 #'grevlex>)
192 ((invlex :invlex $invlex #:invlex)
193 #'invlex>)
194 (otherwise
195 (mtell "~%Warning: Order ~M not found. Using default.~%" order))))
196 (t
197 (mtell "~%Order specification ~M is not recognized. Using default.~%" order)
198 nil)))
199
200(defun find-ring-and-order-by-name (&optional
201 (ring (find-ring-by-name $poly_coefficient_ring))
202 (order (find-order-by-name $poly_monomial_order))
203 (primary-elimination-order (find-order-by-name $poly_primary_elimination_order))
204 (secondary-elimination-order (find-order-by-name $poly_secondary_elimination_order))
205 &aux
206 (ring-and-order (make-ring-and-order
207 :ring ring
208 :order order
209 :primary-elimination-order primary-elimination-order
210 :secondary-elimination-order secondary-elimination-order)))
211 "Build RING-AND-ORDER structure. The defaults are determined by various Maxima-level switches,
212which are names of ring and orders."
213 ring-and-order)
214
215(defun maxima->poly (expr vars
216 &optional
217 (ring-and-order (find-ring-and-order-by-name))
218 &aux
219 (vars (coerce-maxima-list vars))
220 (ring (ro-ring ring-and-order)))
221 "Convert a maxima polynomial expression EXPR in variables VARS to
222internal form. This works by first converting the expression to Lisp,
223and then evaluating the expression using polynomial arithmetic
224implemented by the POLYNOMIAL package."
225 (declare (ring-and-order ring-and-order))
226 (labels ((parse (arg) (maxima->poly arg vars ring-and-order))
227 (parse-list (args) (mapcar #'parse args)))
228 (cond
229 ((eql expr 0) (make-poly-zero))
230 ((member expr vars :test #'equal-test-p)
231 (let ((pos (position expr vars :test #'equal-test-p)))
232 (make-poly-variable ring (length vars) pos)))
233 ((free-of-vars expr vars)
234 ;;This means that variable-free CRE and Poisson forms will be converted
235 ;;to coefficients intact
236 (coerce-coeff ring expr vars))
237 (t
238 (case (caar expr)
239 (mplus (reduce #'(lambda (x y) (poly-add ring-and-order x y)) (parse-list (cdr expr))))
240 (mminus (poly-uminus ring (parse (cadr expr))))
241 (mtimes
242 (if (endp (cddr expr)) ;unary
243 (parse (cdr expr))
244 (reduce #'(lambda (p q) (poly-mul ring-and-order p q)) (parse-list (cdr expr)))))
245 (mexpt
246 (cond
247 ((member (cadr expr) vars :test #'equal-test-p)
248 ;;Special handling of (expt var pow)
249 (let ((pos (position (cadr expr) vars :test #'equal-test-p)))
250 (make-poly-variable ring (length vars) pos (caddr expr))))
251 ((not (and (integerp (caddr expr)) (plusp (caddr expr))))
252 ;; Negative power means division in coefficient ring
253 ;; Non-integer power means non-polynomial coefficient
254 (mtell "~%Warning: Expression ~%~M~%contains power which is not a positive integer. Parsing as coefficient.~%"
255 expr)
256 (coerce-coeff ring expr vars))
257 (t (poly-expt ring-and-order (parse (cadr expr)) (caddr expr)))))
258 (mrat (parse ($ratdisrep expr)))
259 (mpois (parse ($outofpois expr)))
260 (otherwise
261 (coerce-coeff ring expr vars)))))))
262
263(defun maxima->poly-list (expr vars
264 &optional
265 (ring-and-order (find-ring-and-order-by-name)))
266 "Convert a Maxima representation of a list of polynomials to the internal form."
267 (case (caar expr)
268 (mlist (mapcar #'(lambda (p)
269 (maxima->poly p vars ring-and-order))
270 (cdr expr)))
271 (otherwise (merror "Expression ~M is not a list of polynomials in variables ~M."
272 expr vars))))
273
274(defun maxima->poly-list-list (poly-list-of-lists vars
275 &optional
276 (ring-and-order (find-ring-and-order-by-name)))
277 "Parse a Maxima representation of a list of lists of polynomials."
278 (mapcar #'(lambda (g) (maxima->poly-list g vars ring-and-order))
279 (coerce-maxima-list poly-list-of-lists)))
280
281
282
283;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
284;;
285;; Conversion from internal form to Maxima general form
286;;
287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
288
289(defun maxima-head ()
290 (if $poly_return_term_list
291 '(mlist)
292 '(mplus)))
293
294(defun poly->maxima (poly-type object vars)
295 (case poly-type
296 (:custom object) ;Bypass processing
297 (:polynomial
298 `(,(maxima-head) ,@(mapcar #'(lambda (term) (poly->maxima :term term vars)) (poly-termlist object))))
299 (:poly-list
300 `((mlist) ,@(mapcar #'(lambda (p) ($ratdisrep (poly->maxima :polynomial p vars))) object)))
301 (:term
302 `((mtimes) ,($ratdisrep (term-coeff object))
303 ,@(mapcar
304 #'(lambda (var power) `((mexpt) ,var ,power))
305 vars
306 (monom->list (term-monom object)))))
307 ;; Assumes that Lisp and Maxima logicals coincide
308 (:logical object)
309 (otherwise object)))
310
311;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
312;;
313;; Macro facility for writing Maxima-level wrappers for
314;; functions operating on internal representation.
315;;
316;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
317
318(defmacro with-ring-and-order (((maxima-vars &optional (maxima-new-vars nil new-vars-supplied-p))
319 &key
320 (polynomials nil)
321 (poly-lists nil)
322 (poly-list-lists nil)
323 (value-type nil)
324 (ring-and-order-var 'ring-and-order)
325 (ring-var 'ring))
326 &body
327 body
328 &aux
329 (vars (gensym))
330 (new-vars (gensym)))
331 "Evaluate a polynomial expression BODY in an environment
332constructred from Maxima switches. The supplied arguments
333POLYNOMIALS, POLY-LISTS and POLY-LIST-LISTS should be polynomials,
334polynomial lists an lists of lists of polynomials, in Maxima general
335form. These are translated to NGROBNER package internal form and
336evaluated using operations in the NGROBNER package. The BODY should be
337defined in terms of those operations. MAXIMA-VARS is set to the list
338of variable names used at the Maxima level. The evaluation is
339performed by the NGROBNER package which ignores variable names, thus
340MAXIMA-VARS is used only to translate the polynomial expression to
341NGROBNER internal form. After evaluation, the value of BODY is
342translated back to the Maxima general form. When MAXIMA-NEW-VARS is
343present, it is appended to MAXIMA-VARS upon translation from the
344internal form back to Maxima general form, thus allowing extra
345variables which may have been created by the evaluation process. The
346value type can be either :POLYNOMIAL, :POLY-LIST or :TERM, depending
347on the form of the result returned by the top NGROBNER operation.
348During evaluation, symbols supplied by RING-AND-ORDER-VAR (defaul
349value 'RING-AND-ORDER), and RING-VAR (default value 'RING) are bound
350to RING-AND-ORDER and RING instances."
351 `(let ((,vars (coerce-maxima-list ,maxima-vars))
352 ,@(when new-vars-supplied-p
353 (list `(,new-vars (coerce-maxima-list ,maxima-new-vars)))))
354 (poly->maxima
355 ,value-type
356 (let ((,ring-and-order-var ,(find-ring-and-order-by-name)))
357 ;; Define a shorthand to RING
358 (symbol-macrolet ((,ring-var (ro-ring ring-and-order)))
359 (let ,(let ((args nil))
360 (dolist (p polynomials args)
361 (setf args (cons `(,p (maxima->poly ,p ,vars ,ring-and-order-var)) args)))
362 (dolist (p poly-lists args)
363 (setf args (cons `(,p (maxima->poly-list ,p ,vars ,ring-and-order-var)) args)))
364 (dolist (p poly-list-lists args)
365 (setf args (cons `(,p (maxima->poly-list-list ,p ,vars ,ring-and-order-var)) args))))
366 . ,body)))
367 ,(if new-vars-supplied-p
368 `(append ,vars ,new-vars)
369 vars))))
370
371
372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373;;
374;; N-ary (unary and binary) operation definition facility
375;;
376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
377
378(defmacro define-op (maxima-name ;Name of maxima level function
379 (fun-name env &rest args) ;Lisp level form to evaluate
380 &optional
381 (documentation nil documentation-supplied-p)
382 &aux
383 ;; The argument passed as first arg
384 (env-arg (ecase env
385 (:ring-and-order 'ring-and-order)
386 (:ring 'ring))))
387 "Define a MAXIMA-level unary operator MAXIMA-NAME corresponding to unary function FUN-NAME.
388The second argument should be :RING or :RING-AND-ORDER, and it signals
389the type of the first argument that should be passed to function
390FUN-NAME. ARGS is a list of formal parameters passed to the function,
391i.e. symbols used as arguments. The macro expands to a Maxima-level
392function definition with name MAXIMA-NAME, which wraps FUN-NAME."
393 `(defmfun ,maxima-name (,@args vars)
394 ,@(when documentation-supplied-p (list documentation))
395 (with-ring-and-order ((vars) :polynomials (,@args) :value-type :polynomial)
396 (,fun-name ,env-arg ,@args))))
397
398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
399;;
400;; Maxima-level interface functions
401;;
402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
403
404;; Auxillary function for removing zero polynomial
405(defun remzero (plist) (remove #'poly-zerop plist))
406
407;;Simple operators
408(define-op $poly_add (poly-add :ring-and-order p q)
409 "Adds two polynomials P and Q")
410
411(define-op $poly_subtract (poly-sub :ring-and-order p q)
412 "Subtracts a polynomial Q from P.")
413
414(define-op $poly_multiply (poly-mul :ring-and-order p q)
415 "Returns the product of polynomials P and Q.")
416
417(define-op $poly_s_polynomial (spoly :ring-and-order p q)
418 "Returns the syzygy polynomial (S-polynomial) of two polynomials P and Q.")
419
420(define-op $poly_primitive_part (poly-primitive-part :ring p)
421 "Returns the polynomial P divided by GCD of its coefficients.")
422
423(define-op $poly_normalize (poly-normalize :ring p)
424 "Returns the polynomial P divided by the leading coefficient.")
425
426
427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
428;;
429;; More complex functions
430;;
431;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
432
433(defmfun $poly_expand (p vars)
434 "This function is equivalent to EXPAND(P) if P parses correctly to a polynomial.
435If the representation is not compatible with a polynomial in variables VARS,
436the result is an error."
437 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial) p))
438
439
440(defmfun $poly_expt (p n vars)
441 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial)
442 (poly-expt ring-and-order p n)))
443
444(defmfun $poly_content (p vars)
445 (with-ring-and-order ((vars) :polynomials (p))
446 (poly-content ring p)))
447
448(defmfun $poly_pseudo_divide (f fl mvars &aux (vars (coerce-maxima-list mvars)))
449 (with-ring-and-order ((mvars)
450 :polynomials (f)
451 :poly-lists (fl)
452 :value-type :custom)
453 (multiple-value-bind (quot rem c division-count)
454 (poly-pseudo-divide ring-and-order f fl)
455 `((mlist)
456 ,(poly->maxima :poly-list quot vars)
457 ,(poly->maxima :polynomial rem vars)
458 ,c
459 ,division-count))))
460
461(defmfun $poly_exact_divide (f g vars)
462 (with-ring-and-order ((vars) :polynomials (f g) :value-type :polynomial)
463 (poly-exact-divide ring-and-order f g)))
464
465(defmfun $poly_normal_form (f fl vars)
466 (with-ring-and-order ((vars) :polynomials (f)
467 :poly-lists (fl)
468 :value-type :polynomial)
469 (normal-form ring-and-order f (remzero fl) nil)))
470
471(defmfun $poly_buchberger_criterion (g vars)
472 (with-ring-and-order ((vars) :poly-lists (g) :value-type :logical)
473 (buchberger-criterion ring-and-order g)))
474
475(defmfun $poly_buchberger (fl vars)
476 (with-ring-and-order ((vars) :poly-lists (fl) :value-type :poly-list)
477 (buchberger ring-and-order (remzero fl) 0 nil)))
478
479(defmfun $poly_reduction (plist vars)
480 (with-ring-and-order ((vars) :poly-lists (plist)
481 :value-type :poly-list)
482 (reduction ring-and-order plist)))
483
484(defmfun $poly_minimization (plist vars)
485 (with-ring-and-order ((vars) :poly-lists (plist)
486 :value-type :poly-list)
487 (minimization plist)))
488
489(defmfun $poly_normalize_list (plist vars)
490 (with-ring-and-order ((vars) :poly-lists (plist)
491 :value-type :poly-list)
492 (poly-normalize-list ring plist)))
493
494(defmfun $poly_grobner (f vars)
495 (with-ring-and-order ((vars) :poly-lists (f)
496 :value-type :poly-list)
497 (grobner ring-and-order (remzero f))))
498
499(defmfun $poly_reduced_grobner (f vars)
500 (with-ring-and-order ((vars) :poly-lists (f)
501 :value-type :poly-list)
502 (reduced-grobner ring-and-order (remzero f))))
503
504(defmfun $poly_depends_p (p var mvars
505 &aux
506 (vars (coerce-maxima-list mvars))
507 (pos (position var vars)))
508 (with-ring-and-order ((mvars) :polynomials (p) :value-type :custom)
509 (if (null pos)
510 (merror "~%Variable ~M not in the list of variables ~M." var mvars)
511 (poly-depends-p p pos))))
512
513(defmfun $poly_elimination_ideal (flist k vars)
514 (with-ring-and-order ((vars) :poly-lists (flist)
515 :value-type :poly-list)
516 (elimination-ideal ring-and-order flist k nil 0)))
517
518(defmfun $poly_colon_ideal (f g vars)
519 (with-ring-and-order ((vars) :poly-lists (f g) :value-type :poly-list)
520 (colon-ideal ring-and-order f g nil)))
521
522(defmfun $poly_ideal_intersection (f g vars)
523 (with-ring-and-order ((vars) :poly-lists (f g) :value-type :poly-list)
524 (ideal-intersection ring-and-order f g nil)))
525
526(defmfun $poly_lcm (f g vars)
527 (with-ring-and-order ((vars) :polynomials (f g) :value-type :polynomial)
528 (poly-lcm ring-and-order f g)))
529
530(defmfun $poly_gcd (f g vars)
531 ($first ($divide (m* f g) ($poly_lcm f g vars))))
532
533(defmfun $poly_grobner_equal (g1 g2 vars)
534 (with-ring-and-order ((vars) :poly-lists (g1 g2))
535 (grobner-equal ring-and-order g1 g2)))
536
537(defmfun $poly_grobner_subsetp (g1 g2 vars)
538 (with-ring-and-order ((vars) :poly-lists (g1 g2))
539 (grobner-subsetp ring-and-order g1 g2)))
540
541(defmfun $poly_grobner_member (p g vars)
542 (with-ring-and-order ((vars) :polynomials (p) :poly-lists (g))
543 (grobner-member ring-and-order p g)))
544
545(defmfun $poly_ideal_saturation1 (f p vars)
546 (with-ring-and-order ((vars) :poly-lists (f) :polynomials (p)
547 :value-type :poly-list)
548 (ideal-saturation-1 ring-and-order f p 0)))
549
550(defmfun $poly_saturation_extension (f plist vars new-vars)
551 (with-ring-and-order ((vars new-vars)
552 :poly-lists (f plist)
553 :value-type :poly-list)
554 (saturation-extension ring f plist)))
555
556(defmfun $poly_polysaturation_extension (f plist vars new-vars)
557 (with-ring-and-order ((vars new-vars)
558 :poly-lists (f plist)
559 :value-type :poly-list)
560 (polysaturation-extension ring f plist)))
561
562(defmfun $poly_ideal_polysaturation1 (f plist vars)
563 (with-ring-and-order ((vars) :poly-lists (f plist)
564 :value-type :poly-list)
565 (ideal-polysaturation-1 ring-and-order f plist 0 nil)))
566
567(defmfun $poly_ideal_saturation (f g vars)
568 (with-ring-and-order ((vars) :poly-lists (f g)
569 :value-type :poly-list)
570 (ideal-saturation ring-and-order f g 0 nil)))
571
572(defmfun $poly_ideal_polysaturation (f ideal-list vars)
573 (with-ring-and-order ((vars) :poly-lists (f)
574 :poly-list-lists (ideal-list)
575 :value-type :poly-list)
576 (ideal-polysaturation ring-and-order f ideal-list 0 nil)))
577
578(defmfun $poly_lt (f vars)
579 (with-ring-and-order ((vars) :polynomials (f) :value-type :polynomial)
580 (make-poly-from-termlist (list (poly-lt f)))))
581
582(defmfun $poly_lm (f vars)
583 (with-ring-and-order ((vars) :polynomials (f) :value-type :polynomial)
584 (make-poly-from-termlist (list (make-term :monom (poly-lm f) :coeff (funcall (ring-unit ring)))))))
Note: See TracBrowser for help on using the repository browser.