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

Last change on this file since 1869 was 1865, checked in by Marek Rychlik, 10 years ago

* empty log message *

File size: 20.3 KB
RevLine 
[1201]1;;; -*- Mode: Lisp -*-
[98]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
[133]22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23;;
[268]24;; Load this file into Maxima to bootstrap the Grobner package.
[390]25;; NOTE: This file does use symbols defined by Maxima, so it
26;; will not work when loaded in Common Lisp.
[133]27;;
[268]28;; DETAILS: This file implements an interface between the Grobner
[374]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.
[268]34;;
[270]35;; Also, since the NGROBNER package consists of many Lisp files, it is
[375]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.
[270]39;;
[133]40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41
[98]42(in-package :maxima)
43
[568]44(macsyma-module cgb-maxima)
[98]45
[568]46
[98]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
[995]54($load "functs")
[568]55#+sbcl(progn (require 'asdf) (load "ngrobner.asd")(asdf:load-system :ngrobner))
[152]56
[571]57(use-package :ngrobner)
[274]58
[571]59
[98]60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61;;
62;; Maxima expression ring
63;;
64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[521]65;;
66;; This is how we perform operations on coefficients
67;; using Maxima functions.
68;;
69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
70
[1669]71(defparameter +maxima-ring+
[230]72 (make-ring
[98]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
[619]98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99;;
100;; Maxima expression parsing
101;;
102;;
103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104;;
105;; Functions and macros dealing with internal representation
106;; structure.
107;;
108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[114]109
[619]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
[1642]121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
122;;
123;; Order utilities
124;;
125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126
[1674]127(defun find-ring-by-name (ring)
[1644]128 "This function returns the ring structure bases on input symbol."
129 (cond
130 ((null ring) nil)
131 ((symbolp ring)
132 (case ring
[1650]133 ((maxima-ring :maxima-ring #:maxima-ring $expression_ring #:expression_ring)
[1669]134 +maxima-ring+)
135 ((ring-of-integers :ring-of-integers #:ring-of-integers $ring_of_integers) +ring-of-integers+)
[1644]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
[1674]142(defun find-order-by-name (order)
[1642]143 "This function returns the order function bases on its name."
144 (cond
145 ((null order) nil)
146 ((symbolp order)
147 (case order
[1650]148 ((lex :lex $lex #:lex)
[1649]149 #'lex>)
[1650]150 ((grlex :grlex $grlex #:grlex)
[1649]151 #'grlex>)
152 ((grevlex :grevlex $grevlex #:grevlex)
153 #'grevlex>)
[1650]154 ((invlex :invlex $invlex #:invlex)
[1649]155 #'invlex>)
[1642]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
[1703]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)))
[1721]173 "Build RING-AND-ORDER structure. The defaults are determined by various Maxima-level switches,
174which are names of ring and orders."
[1703]175 ring-and-order)
176
[1644]177(defun maxima->poly (expr vars
[1703]178 &optional
179 (ring-and-order (find-ring-and-order-by-name))
180 &aux
[1709]181 (vars (coerce-maxima-list vars))
[1673]182 (ring (ro-ring ring-and-order)))
[1683]183 "Convert a maxima polynomial expression EXPR in variables VARS to
184internal form. This works by first converting the expression to Lisp,
[1685]185and then evaluating the expression using polynomial arithmetic
186implemented by the POLYNOMIAL package."
[1708]187 (labels ((parse (arg) (maxima->poly arg vars ring-and-order))
[619]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)))
[1710]193 (make-poly-variable ring (length vars) pos)))
[619]194 ((free-of-vars expr vars)
195 ;;This means that variable-free CRE and Poisson forms will be converted
196 ;;to coefficients intact
[1710]197 (coerce-coeff ring expr vars))
[619]198 (t
199 (case (caar expr)
[1654]200 (mplus (reduce #'(lambda (x y) (poly-add ring-and-order x y)) (parse-list (cdr expr))))
[1710]201 (mminus (poly-uminus ring (parse (cadr expr))))
[619]202 (mtimes
203 (if (endp (cddr expr)) ;unary
204 (parse (cdr expr))
[1655]205 (reduce #'(lambda (p q) (poly-mul ring-and-order p q)) (parse-list (cdr expr)))))
[619]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)))
[1710]211 (make-poly-variable ring (length vars) pos (caddr expr))))
[619]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)
[1710]217 (coerce-coeff ring expr vars))
[1779]218 (t (poly-expt ring-and-order (parse (cadr expr)) (caddr expr)))))
[619]219 (mrat (parse ($ratdisrep expr)))
220 (mpois (parse ($outofpois expr)))
221 (otherwise
[1710]222 (coerce-coeff ring expr vars)))))))
[619]223
[1696]224(defun maxima->poly-list (expr vars
[1711]225 &optional
226 (ring-and-order (find-ring-and-order-by-name)))
[1693]227 "Convert a Maxima representation of a list of polynomials to the internal form."
[619]228 (case (caar expr)
[1688]229 (mlist (mapcar #'(lambda (p)
[1706]230 (maxima->poly p vars ring-and-order))
[1688]231 (cdr expr)))
[1691]232 (otherwise (merror "Expression ~M is not a list of polynomials in variables ~M."
233 expr vars))))
[619]234
[1776]235(defun maxima->poly-list-list (poly-list-of-lists vars
[1705]236 &optional
[1707]237 (ring-and-order (find-ring-and-order-by-name)))
[619]238 "Parse a Maxima representation of a list of lists of polynomials."
[1707]239 (mapcar #'(lambda (g) (maxima->poly-list g vars ring-and-order))
[1700]240 (coerce-maxima-list poly-list-of-lists)))
[619]241
242
[1688]243
[111]244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
245;;
[241]246;; Conversion from internal form to Maxima general form
247;;
248;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
249
250(defun maxima-head ()
251 (if $poly_return_term_list
[1761]252 '(mlist)
253 '(mplus)))
[241]254
[1714]255(defun poly->maxima (poly-type object vars)
[1865]256 (case poly-type
[1757]257 (:custom object) ;Bypass processing
[1740]258 (:polynomial
[1719]259 `(,(maxima-head) ,@(mapcar #'(lambda (term) (poly->maxima :term term vars)) (poly-termlist object))))
[241]260 (:poly-list
[1761]261 `((mlist) ,@(mapcar #'(lambda (p) ($ratdisrep (poly->maxima :polynomial p vars))) object)))
[241]262 (:term
[1717]263 `((mtimes) ,($ratdisrep (term-coeff object))
[1826]264 ,@(mapcar
265 #'(lambda (var power) `((mexpt) ,var ,power))
266 vars
267 (monom->list (term-monom object)))))
[241]268 ;; Assumes that Lisp and Maxima logicals coincide
[1865]269 (:logical object)
270 (otherwise object)))
[241]271
[98]272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
273;;
[222]274;; Macro facility for writing Maxima-level wrappers for
[1824]275;; functions operating on internal representation.
[222]276;;
277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
278
[1748]279(defmacro with-ring-and-order (((maxima-vars &optional (maxima-new-vars nil new-vars-supplied-p))
[1749]280 &key
281 (polynomials nil)
[1725]282 (poly-lists nil)
283 (poly-list-lists nil)
[1749]284 (value-type nil)
[1783]285 (ring-and-order-var 'ring-and-order)
286 (ring-var 'ring))
[1734]287 &body
288 body
289 &aux
290 (vars (gensym))
[1742]291 (new-vars (gensym)))
[1751]292 "Evaluate a polynomial expression BODY in an environment
293constructred from Maxima switches. The supplied arguments
294POLYNOMIALS, POLY-LISTS and POLY-LIST-LISTS should be polynomials,
295polynomial lists an lists of lists of polynomials, in Maxima general
296form. These are translated to NGROBNER package internal form and
297evaluated using operations in the NGROBNER package. The BODY should be
298defined in terms of those operations. MAXIMA-VARS is set to the list
299of variable names used at the Maxima level. The evaluation is
300performed by the NGROBNER package which ignores variable names, thus
301MAXIMA-VARS is used only to translate the polynomial expression to
302NGROBNER internal form. After evaluation, the value of BODY is
303translated back to the Maxima general form. When MAXIMA-NEW-VARS is
304present, it is appended to MAXIMA-VARS upon translation from the
305internal form back to Maxima general form, thus allowing extra
306variables which may have been created by the evaluation process. The
307value type can be either :POLYNOMIAL, :POLY-LIST or :TERM, depending
[1784]308on the form of the result returned by the top NGROBNER operation.
[1785]309During evaluation, symbols supplied by RING-AND-ORDER-VAR (defaul
310value 'RING-AND-ORDER), and RING-VAR (default value 'RING) are bound
311to RING-AND-ORDER and RING instances."
[222]312 `(let ((,vars (coerce-maxima-list ,maxima-vars))
313 ,@(when new-vars-supplied-p
[1288]314 (list `(,new-vars (coerce-maxima-list ,maxima-new-vars)))))
[1732]315 (poly->maxima
[222]316 ,value-type
[1789]317 (let ((,ring-and-order-var ,(find-ring-and-order-by-name)))
318 ;; Define a shorthand to RING
[1790]319 (symbol-macrolet ((,ring-var (ro-ring ring-and-order)))
[1789]320 (let ,(let ((args nil))
321 (dolist (p polynomials args)
322 (setf args (cons `(,p (maxima->poly ,p ,vars ,ring-and-order-var)) args)))
323 (dolist (p poly-lists args)
324 (setf args (cons `(,p (maxima->poly-list ,p ,vars ,ring-and-order-var)) args)))
325 (dolist (p poly-list-lists args)
326 (setf args (cons `(,p (maxima->poly-list-list ,p ,vars ,ring-and-order-var)) args))))
327 . ,body)))
[1736]328 ,(if new-vars-supplied-p
329 `(append ,vars ,new-vars)
330 vars))))
[222]331
332
[1797]333;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334;;
[1811]335;; N-ary (unary and binary) operation definition facility
[1797]336;;
337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
338
[1814]339(defmacro define-op (maxima-name ;Name of maxima level function
[1813]340 (fun-name env &rest args) ;Lisp level form to evaluate
[1811]341 &optional
342 (documentation nil documentation-supplied-p)
343 &aux
344 ;; The argument passed as first arg
345 (env-arg (ecase env
346 (:ring-and-order 'ring-and-order)
347 (:ring 'ring))))
[1819]348 "Define a MAXIMA-level unary operator MAXIMA-NAME corresponding to unary function FUN-NAME.
[1820]349The second argument should be :RING or :RING-AND-ORDER, and it signals
350the type of the first argument that should be passed to function
351FUN-NAME. ARGS is a list of formal parameters passed to the function,
352i.e. symbols used as arguments. The macro expands to a Maxima-level
353function definition with name MAXIMA-NAME, which wraps FUN-NAME."
[1809]354 `(defmfun ,maxima-name (,@args vars)
[1797]355 ,@(when documentation-supplied-p (list documentation))
[1809]356 (with-ring-and-order ((vars) :polynomials (,@args) :value-type :polynomial)
[1816]357 (,fun-name ,env-arg ,@args))))
[1797]358
[1799]359;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
360;;
361;; Maxima-level interface functions
362;;
363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[1797]364
[1799]365;; Auxillary function for removing zero polynomial
366(defun remzero (plist) (remove #'poly-zerop plist))
[98]367
[1799]368;;Simple operators
[1815]369(define-op $poly_add (poly-add :ring-and-order p q)
[1799]370 "Adds two polynomials P and Q")
371
[1821]372(define-op $poly_subtract (poly-sub :ring-and-order p q)
[1799]373 "Subtracts a polynomial Q from P.")
374
[1817]375(define-op $poly_multiply (poly-mul :ring-and-order p q)
[1799]376 "Returns the product of polynomials P and Q.")
377
[1818]378(define-op $poly_s_polynomial (spoly :ring-and-order p q)
[1799]379 "Returns the syzygy polynomial (S-polynomial) of two polynomials P and Q.")
380
[1818]381(define-op $poly_primitive_part (poly-primitive-part :ring p)
[1799]382 "Returns the polynomial P divided by GCD of its coefficients.")
383
[1818]384(define-op $poly_normalize (poly-normalize :ring p)
[1799]385 "Returns the polynomial P divided by the leading coefficient.")
386
387
388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
389;;
390;; More complex functions
391;;
392;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
393
[98]394(defmfun $poly_expand (p vars)
395 "This function is equivalent to EXPAND(P) if P parses correctly to a polynomial.
396If the representation is not compatible with a polynomial in variables VARS,
397the result is an error."
[1735]398 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial) p))
[98]399
[1724]400
[98]401(defmfun $poly_expt (p n vars)
[1741]402 (with-ring-and-order ((vars) :polynomials (p) :value-type :polynomial)
[1750]403 (poly-expt ring-and-order p n)))
[98]404
405(defmfun $poly_content (p vars)
[1752]406 (with-ring-and-order ((vars) :polynomials (p))
[1786]407 (poly-content ring p)))
[98]408
[1861]409(defmfun $poly_pseudo_divide (f fl mvars &aux (vars (coerce-maxima-list mvars)))
410 (with-ring-and-order ((mvars)
[1758]411 :polynomials (f)
412 :poly-lists (fl)
413 :value-type :custom)
[1753]414 (multiple-value-bind (quot rem c division-count)
[1765]415 (poly-pseudo-divide ring-and-order f fl)
[1766]416 `((mlist)
417 ,(poly->maxima :poly-list quot vars)
418 ,(poly->maxima :polynomial rem vars)
419 ,c
420 ,division-count))))
[98]421
422(defmfun $poly_exact_divide (f g vars)
[1768]423 (with-ring-and-order ((vars) :polynomials (f g) :value-type :polynomial)
424 (poly-exact-divide ring-and-order f g)))
[98]425
426(defmfun $poly_normal_form (f fl vars)
[1769]427 (with-ring-and-order ((vars) :polynomials (f)
[98]428 :poly-lists (fl)
429 :value-type :polynomial)
[1769]430 (normal-form ring-and-order f (remzero fl) nil)))
[98]431
432(defmfun $poly_buchberger_criterion (g vars)
[1769]433 (with-ring-and-order ((vars) :poly-lists (g) :value-type :logical)
434 (buchberger-criterion ring-and-order g)))
[98]435
436(defmfun $poly_buchberger (fl vars)
[1769]437 (with-ring-and-order ((vars) :poly-lists (fl) :value-type :poly-list)
438 (buchberger ring-and-order (remzero fl) 0 nil)))
[98]439
440(defmfun $poly_reduction (plist vars)
[1769]441 (with-ring-and-order ((vars) :poly-lists (plist)
[98]442 :value-type :poly-list)
[1769]443 (reduction ring-and-order plist)))
[98]444
445(defmfun $poly_minimization (plist vars)
[1769]446 (with-ring-and-order ((vars) :poly-lists (plist)
[98]447 :value-type :poly-list)
448 (minimization plist)))
449
450(defmfun $poly_normalize_list (plist vars)
[1769]451 (with-ring-and-order ((vars) :poly-lists (plist)
[98]452 :value-type :poly-list)
[1786]453 (poly-normalize-list ring plist)))
[98]454
455(defmfun $poly_grobner (f vars)
[1769]456 (with-ring-and-order ((vars) :poly-lists (f)
[98]457 :value-type :poly-list)
[1769]458 (grobner ring-and-order (remzero f))))
[98]459
460(defmfun $poly_reduced_grobner (f vars)
[1769]461 (with-ring-and-order ((vars) :poly-lists (f)
[98]462 :value-type :poly-list)
[1769]463 (reduced-grobner ring-and-order (remzero f))))
[98]464
465(defmfun $poly_depends_p (p var mvars
[1771]466 &aux
[1773]467 (vars (coerce-maxima-list mvars))
[1770]468 (pos (position var vars)))
469 (with-ring-and-order ((mvars) :polynomials (p) :value-type :custom)
470 (if (null pos)
471 (merror "~%Variable ~M not in the list of variables ~M." var mvars)
[1774]472 (poly-depends-p p pos))))
[98]473
474(defmfun $poly_elimination_ideal (flist k vars)
[1769]475 (with-ring-and-order ((vars) :poly-lists (flist)
[98]476 :value-type :poly-list)
[1769]477 (elimination-ideal ring-and-order flist k nil 0)))
[98]478
479(defmfun $poly_colon_ideal (f g vars)
[1769]480 (with-ring-and-order ((vars) :poly-lists (f g) :value-type :poly-list)
481 (colon-ideal ring-and-order f g nil)))
[98]482
483(defmfun $poly_ideal_intersection (f g vars)
[1769]484 (with-ring-and-order ((vars) :poly-lists (f g) :value-type :poly-list)
485 (ideal-intersection ring-and-order f g nil)))
[98]486
487(defmfun $poly_lcm (f g vars)
[1769]488 (with-ring-and-order ((vars) :polynomials (f g) :value-type :polynomial)
489 (poly-lcm ring-and-order f g)))
[98]490
491(defmfun $poly_gcd (f g vars)
492 ($first ($divide (m* f g) ($poly_lcm f g vars))))
493
494(defmfun $poly_grobner_equal (g1 g2 vars)
[1769]495 (with-ring-and-order ((vars) :poly-lists (g1 g2))
496 (grobner-equal ring-and-order g1 g2)))
[98]497
498(defmfun $poly_grobner_subsetp (g1 g2 vars)
[1769]499 (with-ring-and-order ((vars) :poly-lists (g1 g2))
500 (grobner-subsetp ring-and-order g1 g2)))
[98]501
502(defmfun $poly_grobner_member (p g vars)
[1769]503 (with-ring-and-order ((vars) :polynomials (p) :poly-lists (g))
504 (grobner-member ring-and-order p g)))
[98]505
506(defmfun $poly_ideal_saturation1 (f p vars)
[1769]507 (with-ring-and-order ((vars) :poly-lists (f) :polynomials (p)
[98]508 :value-type :poly-list)
[1793]509 (ideal-saturation-1 ring-and-order f p 0)))
[98]510
511(defmfun $poly_saturation_extension (f plist vars new-vars)
[1769]512 (with-ring-and-order ((vars new-vars)
[98]513 :poly-lists (f plist)
514 :value-type :poly-list)
[1792]515 (saturation-extension ring f plist)))
[98]516
517(defmfun $poly_polysaturation_extension (f plist vars new-vars)
[1769]518 (with-ring-and-order ((vars new-vars)
[98]519 :poly-lists (f plist)
520 :value-type :poly-list)
[1790]521 (polysaturation-extension ring f plist)))
[98]522
523(defmfun $poly_ideal_polysaturation1 (f plist vars)
[1769]524 (with-ring-and-order ((vars) :poly-lists (f plist)
[98]525 :value-type :poly-list)
[1794]526 (ideal-polysaturation-1 ring-and-order f plist 0 nil)))
[98]527
528(defmfun $poly_ideal_saturation (f g vars)
[1769]529 (with-ring-and-order ((vars) :poly-lists (f g)
[98]530 :value-type :poly-list)
[1795]531 (ideal-saturation ring-and-order f g 0 nil)))
[98]532
533(defmfun $poly_ideal_polysaturation (f ideal-list vars)
[1769]534 (with-ring-and-order ((vars) :poly-lists (f)
[98]535 :poly-list-lists (ideal-list)
536 :value-type :poly-list)
[1769]537 (ideal-polysaturation ring-and-order f ideal-list 0 nil)))
[98]538
539(defmfun $poly_lt (f vars)
[1769]540 (with-ring-and-order ((vars) :polynomials (f) :value-type :polynomial)
[98]541 (make-poly-from-termlist (list (poly-lt f)))))
542
543(defmfun $poly_lm (f vars)
[1769]544 (with-ring-and-order ((vars) :polynomials (f) :value-type :polynomial)
[1842]545 (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.