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

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

* empty log message *

File size: 21.3 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 (primary-elimination-order (find-order-by-name $poly_primary_elimination_order))
166 (secondary-elimination-order (find-order-by-name $poly_secondary_elimination_order))
167 &aux
168 (ring-and-order (make-ring-and-order
169 :ring ring
170 :order order
171 :primary-elimination-order primary-elimination-order
172 :secondary-elimination-order secondary-elimination-order)))
173 "Build RING-AND-ORDER structure. The defaults are determined by various Maxima-level switches,
174which are names of ring and orders."
175 ring-and-order)
176
177(defun maxima->poly (expr vars
178 &optional
179 (ring-and-order (find-ring-and-order-by-name))
180 &aux
181 (vars (coerce-maxima-list vars))
182 (ring (ro-ring ring-and-order)))
183 "Convert a maxima polynomial expression EXPR in variables VARS to
184internal form. This works by first converting the expression to Lisp,
185and then evaluating the expression using polynomial arithmetic
186implemented by the POLYNOMIAL package."
187 (labels ((parse (arg) (maxima->poly arg vars ring-and-order))
188 (parse-list (args) (mapcar #'parse args)))
189 (cond
190 ((eql expr 0) (make-poly-zero))
191 ((member expr vars :test #'equal-test-p)
192 (let ((pos (position expr vars :test #'equal-test-p)))
193 (make-poly-variable ring (length vars) pos)))
194 ((free-of-vars expr vars)
195 ;;This means that variable-free CRE and Poisson forms will be converted
196 ;;to coefficients intact
197 (coerce-coeff ring expr vars))
198 (t
199 (case (caar expr)
200 (mplus (reduce #'(lambda (x y) (poly-add ring-and-order x y)) (parse-list (cdr expr))))
201 (mminus (poly-uminus ring (parse (cadr expr))))
202 (mtimes
203 (if (endp (cddr expr)) ;unary
204 (parse (cdr expr))
205 (reduce #'(lambda (p q) (poly-mul ring-and-order p q)) (parse-list (cdr expr)))))
206 (mexpt
207 (cond
208 ((member (cadr expr) vars :test #'equal-test-p)
209 ;;Special handling of (expt var pow)
210 (let ((pos (position (cadr expr) vars :test #'equal-test-p)))
211 (make-poly-variable ring (length vars) pos (caddr expr))))
212 ((not (and (integerp (caddr expr)) (plusp (caddr expr))))
213 ;; Negative power means division in coefficient ring
214 ;; Non-integer power means non-polynomial coefficient
215 (mtell "~%Warning: Expression ~%~M~%contains power which is not a positive integer. Parsing as coefficient.~%"
216 expr)
217 (coerce-coeff ring expr vars))
218 (t (poly-expt ring-and-order (parse (cadr expr)) (caddr expr)))))
219 (mrat (parse ($ratdisrep expr)))
220 (mpois (parse ($outofpois expr)))
221 (otherwise
222 (coerce-coeff ring expr vars)))))))
223
224(defun maxima->poly-list (expr vars
225 &optional
226 (ring-and-order (find-ring-and-order-by-name)))
227 "Convert a Maxima representation of a list of polynomials to the internal form."
228 (case (caar expr)
229 (mlist (mapcar #'(lambda (p)
230 (maxima->poly p vars ring-and-order))
231 (cdr expr)))
232 (otherwise (merror "Expression ~M is not a list of polynomials in variables ~M."
233 expr vars))))
234
235(defun maxima->poly-list-list (poly-list-of-lists vars
236 &optional
237 (ring-and-order (find-ring-and-order-by-name)))
238 "Parse a Maxima representation of a list of lists of polynomials."
239 (mapcar #'(lambda (g) (maxima->poly-list g vars ring-and-order))
240 (coerce-maxima-list poly-list-of-lists)))
241
242
243
244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
245;;
246;; Conversion from internal form to Maxima general form
247;;
248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
249
250(defun maxima-head ()
251 (if $poly_return_term_list
252 '(mlist)
253 '(mplus)))
254
255(defun poly->maxima (poly-type object vars)
256 (case poly-type
257 (:custom object) ;Bypass processing
258 (:polynomial
259 `(,(maxima-head) ,@(mapcar #'(lambda (term) (poly->maxima :term term vars)) (poly-termlist object))))
260 (:poly-list
261 `((mlist) ,@(mapcar #'(lambda (p) ($ratdisrep (poly->maxima :polynomial p vars))) object)))
262 (:term
263 `((mtimes) ,($ratdisrep (term-coeff object))
264 ,@(mapcar #'(lambda (var power) `((mexpt) ,var ,power))
265 vars (monom->list (term-monom object)))))
266 ;; Assumes that Lisp and Maxima logicals coincide
267 (:logical object)
268 (otherwise
269 object)))
270
271
272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
273;;
274;; Facilities for evaluating Grobner package expressions
275;; within a prepared environment
276;;
277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
278
279#|
280(defmacro with-monomial-order ((order) &body body)
281 "Evaluate BODY with monomial order set to ORDER."
282 `(let ((*monomial-order* (or (find-order ,order) *monomial-order*)))
283 . ,body))
284
285(defmacro with-coefficient-ring ((ring) &body body)
286 "Evaluate BODY with coefficient ring set to RING."
287 `(let ((+maxima-ring+ (or (find-ring ,ring) +maxima-ring+)))
288 . ,body))
289
290(defmacro with-ring-and-order ((ring order) &body body)
291 "Evaluate BODY with monomial order set to ORDER and coefficient ring set to RING."
292 `(let ((*monomial-order* (or (find-order ,order) *monomial-order*))
293 (+maxima-ring+ (or (find-ring ,ring) +maxima-ring+)))
294 . ,body))
295
296(defmacro with-elimination-orders ((primary secondary elimination-order)
297 &body body)
298 "Evaluate BODY with primary and secondary elimination orders set to PRIMARY and SECONDARY."
299 `(let ((*primary-elimination-order* (or (find-order ,primary) *primary-elimination-order*))
300 (*secondary-elimination-order* (or (find-order ,secondary) *secondary-elimination-order*))
301 (*elimination-order* (or (find-order ,elimination-order) *elimination-order*)))
302 . ,body))
303
304|#
305
306
307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
308;;
309;; Macro facility for writing Maxima-level wrappers for
310;; functions operating on internal representation
311;;
312;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
313
314(defmacro with-ring-and-order (((maxima-vars &optional (maxima-new-vars nil new-vars-supplied-p))
315 &key
316 (polynomials nil)
317 (poly-lists nil)
318 (poly-list-lists nil)
319 (value-type nil)
320 (ring-and-order-var 'ring-and-order)
321 (ring-var 'ring))
322 &body
323 body
324 &aux
325 (vars (gensym))
326 (new-vars (gensym)))
327 "Evaluate a polynomial expression BODY in an environment
328constructred from Maxima switches. The supplied arguments
329POLYNOMIALS, POLY-LISTS and POLY-LIST-LISTS should be polynomials,
330polynomial lists an lists of lists of polynomials, in Maxima general
331form. These are translated to NGROBNER package internal form and
332evaluated using operations in the NGROBNER package. The BODY should be
333defined in terms of those operations. MAXIMA-VARS is set to the list
334of variable names used at the Maxima level. The evaluation is
335performed by the NGROBNER package which ignores variable names, thus
336MAXIMA-VARS is used only to translate the polynomial expression to
337NGROBNER internal form. After evaluation, the value of BODY is
338translated back to the Maxima general form. When MAXIMA-NEW-VARS is
339present, it is appended to MAXIMA-VARS upon translation from the
340internal form back to Maxima general form, thus allowing extra
341variables which may have been created by the evaluation process. The
342value type can be either :POLYNOMIAL, :POLY-LIST or :TERM, depending
343on the form of the result returned by the top NGROBNER operation.
344During evaluation, symbols supplied by RING-AND-ORDER-VAR (defaul
345value 'RING-AND-ORDER), and RING-VAR (default value 'RING) are bound
346to RING-AND-ORDER and RING instances."
347 `(let ((,vars (coerce-maxima-list ,maxima-vars))
348 ,@(when new-vars-supplied-p
349 (list `(,new-vars (coerce-maxima-list ,maxima-new-vars)))))
350 (poly->maxima
351 ,value-type
352 (let ((,ring-and-order-var ,(find-ring-and-order-by-name)))
353 ;; Define a shorthand to RING
354 (symbol-macrolet ((,ring-var (ro-ring ring-and-order)))
355 (let ,(let ((args nil))
356 (dolist (p polynomials args)
357 (setf args (cons `(,p (maxima->poly ,p ,vars ,ring-and-order-var)) args)))
358 (dolist (p poly-lists args)
359 (setf args (cons `(,p (maxima->poly-list ,p ,vars ,ring-and-order-var)) args)))
360 (dolist (p poly-list-lists args)
361 (setf args (cons `(,p (maxima->poly-list-list ,p ,vars ,ring-and-order-var)) args))))
362 . ,body)))
363 ,(if new-vars-supplied-p
364 `(append ,vars ,new-vars)
365 vars))))
366
367
368;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
369;;
370;; Unary and binary operation definition facility
371;;
372;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
373
374(defmacro define-unop (maxima-name fun-name
375 &optional (documentation nil documentation-supplied-p))
376 "Define a MAXIMA-level unary operator MAXIMA-NAME corresponding to unary function FUN-NAME."
377 `(defun ,maxima-name (p vars)
378 ,@(when documentation-supplied-p (list documentation))
379 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial)
380 (,fun-name ring p) vars)))
381
382(defmacro define-binop (maxima-name fun-name
383 &optional (documentation nil documentation-supplied-p))
384 "Define a MAXIMA-level binary operator MAXIMA-NAME corresponding to binary function FUN-NAME."
385 `(defun ,maxima-name (p q vars)
386 ,@(when documentation-supplied-p (list documentation))
387 (with-ring-and-order ((vars) :polynomials (p q) :value-type :polynomial)
388 (,fun-name ring p q) vars)))
389
390
391;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
392;;
393;; Maxima-level interface functions
394;;
395;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
396
397;; Auxillary function for removing zero polynomial
398(defun remzero (plist) (remove #'poly-zerop plist))
399
400;;Simple operators
401(define-binop $poly_add poly-add
402 "Adds two polynomials P and Q")
403
404(define-binop $poly_subtract poly-sub
405 "Subtracts a polynomial Q from P.")
406
407(define-binop $poly_multiply poly-mul
408 "Returns the product of polynomials P and Q.")
409
410(define-binop $poly_s_polynomial spoly
411 "Returns the syzygy polynomial (S-polynomial) of two polynomials P and Q.")
412
413(define-unop $poly_primitive_part poly-primitive-part
414 "Returns the polynomial P divided by GCD of its coefficients.")
415
416(define-unop $poly_normalize poly-normalize
417 "Returns the polynomial P divided by the leading coefficient.")
418
419
420
421;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
422;;
423;; More complex functions
424;;
425;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426
427(defmfun $poly_expand (p vars)
428 "This function is equivalent to EXPAND(P) if P parses correctly to a polynomial.
429If the representation is not compatible with a polynomial in variables VARS,
430the result is an error."
431 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial) p))
432
433
434(defmfun $poly_expt (p n vars)
435 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial)
436 (poly-expt ring-and-order p n)))
437
438(defmfun $poly_content (p vars)
439 (with-ring-and-order ((vars) :polynomials (p))
440 (poly-content ring p)))
441
442#|
443(defmfun $poly_pseudo_divide (f fl vars)
444 (with-ring-and-order ((vars)
445 :polynomials (f)
446 :poly-lists (fl)
447 :value-type :custom)
448 (multiple-value-bind (quot rem c division-count)
449 (poly-pseudo-divide ring-and-order f fl)
450 `((mlist)
451 ,(poly->maxima :poly-list quot vars)
452 ,(poly->maxima :polynomial rem vars)
453 ,c
454 ,division-count))))
455|#
456
457
458(defmfun $poly_exact_divide (f g vars)
459 (with-ring-and-order ((vars) :polynomials (f g) :value-type :polynomial)
460 (poly-exact-divide ring-and-order f g)))
461
462(defmfun $poly_normal_form (f fl vars)
463 (with-ring-and-order ((vars) :polynomials (f)
464 :poly-lists (fl)
465 :value-type :polynomial)
466 (normal-form ring-and-order f (remzero fl) nil)))
467
468(defmfun $poly_buchberger_criterion (g vars)
469 (with-ring-and-order ((vars) :poly-lists (g) :value-type :logical)
470 (buchberger-criterion ring-and-order g)))
471
472(defmfun $poly_buchberger (fl vars)
473 (with-ring-and-order ((vars) :poly-lists (fl) :value-type :poly-list)
474 (buchberger ring-and-order (remzero fl) 0 nil)))
475
476(defmfun $poly_reduction (plist vars)
477 (with-ring-and-order ((vars) :poly-lists (plist)
478 :value-type :poly-list)
479 (reduction ring-and-order plist)))
480
481(defmfun $poly_minimization (plist vars)
482 (with-ring-and-order ((vars) :poly-lists (plist)
483 :value-type :poly-list)
484 (minimization plist)))
485
486(defmfun $poly_normalize_list (plist vars)
487 (with-ring-and-order ((vars) :poly-lists (plist)
488 :value-type :poly-list)
489 (poly-normalize-list ring plist)))
490
491(defmfun $poly_grobner (f vars)
492 (with-ring-and-order ((vars) :poly-lists (f)
493 :value-type :poly-list)
494 (grobner ring-and-order (remzero f))))
495
496(defmfun $poly_reduced_grobner (f vars)
497 (with-ring-and-order ((vars) :poly-lists (f)
498 :value-type :poly-list)
499 (reduced-grobner ring-and-order (remzero f))))
500
501(defmfun $poly_depends_p (p var mvars
502 &aux
503 (vars (coerce-maxima-list mvars))
504 (pos (position var vars)))
505 (with-ring-and-order ((mvars) :polynomials (p) :value-type :custom)
506 (if (null pos)
507 (merror "~%Variable ~M not in the list of variables ~M." var mvars)
508 (poly-depends-p p pos))))
509
510(defmfun $poly_elimination_ideal (flist k vars)
511 (with-ring-and-order ((vars) :poly-lists (flist)
512 :value-type :poly-list)
513 (elimination-ideal ring-and-order flist k nil 0)))
514
515(defmfun $poly_colon_ideal (f g vars)
516 (with-ring-and-order ((vars) :poly-lists (f g) :value-type :poly-list)
517 (colon-ideal ring-and-order f g nil)))
518
519(defmfun $poly_ideal_intersection (f g vars)
520 (with-ring-and-order ((vars) :poly-lists (f g) :value-type :poly-list)
521 (ideal-intersection ring-and-order f g nil)))
522
523(defmfun $poly_lcm (f g vars)
524 (with-ring-and-order ((vars) :polynomials (f g) :value-type :polynomial)
525 (poly-lcm ring-and-order f g)))
526
527(defmfun $poly_gcd (f g vars)
528 ($first ($divide (m* f g) ($poly_lcm f g vars))))
529
530(defmfun $poly_grobner_equal (g1 g2 vars)
531 (with-ring-and-order ((vars) :poly-lists (g1 g2))
532 (grobner-equal ring-and-order g1 g2)))
533
534(defmfun $poly_grobner_subsetp (g1 g2 vars)
535 (with-ring-and-order ((vars) :poly-lists (g1 g2))
536 (grobner-subsetp ring-and-order g1 g2)))
537
538(defmfun $poly_grobner_member (p g vars)
539 (with-ring-and-order ((vars) :polynomials (p) :poly-lists (g))
540 (grobner-member ring-and-order p g)))
541
542(defmfun $poly_ideal_saturation1 (f p vars)
543 (with-ring-and-order ((vars) :poly-lists (f) :polynomials (p)
544 :value-type :poly-list)
545 (ideal-saturation-1 ring-and-order f p 0)))
546
547(defmfun $poly_saturation_extension (f plist vars new-vars)
548 (with-ring-and-order ((vars new-vars)
549 :poly-lists (f plist)
550 :value-type :poly-list)
551 (saturation-extension ring f plist)))
552
553(defmfun $poly_polysaturation_extension (f plist vars new-vars)
554 (with-ring-and-order ((vars new-vars)
555 :poly-lists (f plist)
556 :value-type :poly-list)
557 (polysaturation-extension ring f plist)))
558
559(defmfun $poly_ideal_polysaturation1 (f plist vars)
560 (with-ring-and-order ((vars) :poly-lists (f plist)
561 :value-type :poly-list)
562 (ideal-polysaturation-1 ring-and-order f plist 0 nil)))
563
564(defmfun $poly_ideal_saturation (f g vars)
565 (with-ring-and-order ((vars) :poly-lists (f g)
566 :value-type :poly-list)
567 (ideal-saturation ring-and-order f g 0 nil)))
568
569(defmfun $poly_ideal_polysaturation (f ideal-list vars)
570 (with-ring-and-order ((vars) :poly-lists (f)
571 :poly-list-lists (ideal-list)
572 :value-type :poly-list)
573 (ideal-polysaturation ring-and-order f ideal-list 0 nil)))
574
575(defmfun $poly_lt (f vars)
576 (with-ring-and-order ((vars) :polynomials (f) :value-type :polynomial)
577 (make-poly-from-termlist (list (poly-lt f)))))
578
579(defmfun $poly_lm (f vars)
580 (with-ring-and-order ((vars) :polynomials (f) :value-type :polynomial)
581 (make-poly-from-termlist (list (make-term (poly-lm f) (funcall (ring-unit ring)))))))
Note: See TracBrowser for help on using the repository browser.