Merge branch 'rtoy-wrap-option-args'
[maxima.git] / doc / info / grobner.texi
blobfdb1f038c17b883f17903f45a1e954f77cf3c2ce
1 @menu
2 * Introduction to grobner ::
3 * Functions and Variables for grobner ::
4 @end menu
6 @node Introduction to grobner, Functions and Variables for grobner, Top, Top
7 @section Introduction to grobner
9 @code{grobner} is a package for working with Groebner bases in Maxima.
11 @noindent
12 To use the following functions you must load the @file{grobner.lisp} package.
14 @example
15 load("grobner");
16 @end example
18 @noindent
19 A demo can be started by 
20 @example
21 demo("grobner.demo");
22 @end example
24 @noindent
26 @example
27 batch("grobner.demo")
28 @end example
30 @noindent
31 Some of the calculation in the demo will take a lot of time 
32 therefore the output @file{grobner-demo.output} of the demo can 
33 be found in the same directory as the demo file.
35 @subsection Notes on the grobner package
36 The package was written by 
38 @noindent
39 Marek Rychlik 
41 @noindent
42 @url{http://alamos.math.arizona.edu}
44 @noindent
45 and is released 2002-05-24 under the terms of the General Public License(GPL) (see file @file{grobner.lisp}).
46 This documentation was extracted from the files
47 @flushleft
48 @file{README}, @file{grobner.lisp}, @file{grobner.demo}, @file{grobner-demo.output}
49 @end flushleft
51 @noindent
52 by G@"unter Nowak. Suggestions for improvement of the documentation can 
53 be discussed at the @emph{maxima}-mailing-list @email{maxima@@math.utexas.edu}.
54 The code is a little bit out of date now. Modern implementation use the fast @emph{F4} algorithm described in 
55 @smallformat
56 A new efficient algorithm for computing Gr@"obner bases (F4) 
57 Jean-Charles Faug@`ere
58 LIP6/CNRS Universit@'e Paris VI 
59 January 20, 1999
60 @end smallformat
62 @opencatbox{Categories:}
63 @category{Groebner bases}
64 @category{Share packages}
65 @category{Package grobner}
66 @closecatbox
68 @subsection Implementations of admissible monomial orders in grobner
70 @itemize @bullet
71 @item @code{lex}
73 pure lexicographic,
74 default order for monomial comparisons
75 @item @code{grlex}
77 total degree order, ties broken by lexicographic
79 @item @code{grevlex}
81 total degree, ties broken by reverse lexicographic
83 @item @code{invlex}
85 inverse lexicographic order
87 @end itemize
89 @node Functions and Variables for grobner, , Introduction to grobner, Top
90 @section Functions and Variables for grobner 
92 @subsection Global switches for grobner
94 @defvr {Option variable} poly_monomial_order
95 Default value: @code{lex}
97 This global switch controls which monomial order is used in polynomial and Groebner Bases calculations. If not set, @code{lex} will be used.
99 @opencatbox{Categories:}
100 @category{Package grobner}
101 @closecatbox
103 @end defvr
106 @defvr {Option variable} poly_coefficient_ring
107 Default value: @code{expression_ring}
109 This switch indicates the coefficient ring of the polynomials that
110 will be used in grobner calculations. If not set, @emph{maxima's} general
111 expression ring will be used. This variable may be set to
112 @code{ring_of_integers} if desired.
114 @opencatbox{Categories:}
115 @category{Package grobner}
116 @closecatbox
118 @end defvr
120 @defvr {Option variable} poly_primary_elimination_order
121 Default value: @code{false}
123 Name of the default order for eliminated variables in
124 elimination-based functions. If not set, @code{lex} will be used.
126 @opencatbox{Categories:}
127 @category{Package grobner}
128 @closecatbox
130 @end defvr
132 @defvr {Option variable} poly_secondary_elimination_order
133 Default value: @code{false}
135 Name of the default order for kept variables in elimination-based functions. If not set, @code{lex} will be used.
137 @opencatbox{Categories:}
138 @category{Package grobner}
139 @closecatbox
141 @end defvr
143 @defvr {Option variable} poly_elimination_order
144 Default value: @code{false}
146 Name of the default elimination order used in elimination
147 calculations. If set, it overrides the settings in variables
148 @code{poly_primary_elimination_order} and @code{poly_secondary_elimination_order}.
149 The user must ensure that this is a true elimination order valid
150 for the number of eliminated variables. 
152 @opencatbox{Categories:}
153 @category{Package grobner}
154 @closecatbox
156 @end defvr
158 @defvr {Option variable} poly_return_term_list
159 Default value: @code{false}
161 If set to @code{true}, all functions in this package will return each
162 polynomial as a list of terms in the current monomial order rather
163 than a @emph{maxima} general expression.
165 @opencatbox{Categories:}
166 @category{Package grobner}
167 @closecatbox
169 @end defvr
171 @defvr {Option variable} poly_grobner_debug
172 Default value: @code{false}
174 If set to @code{true}, produce debugging and tracing output.
176 @opencatbox{Categories:}
177 @category{Package grobner}
178 @closecatbox
180 @end defvr
182 @defvr {Option variable} poly_grobner_algorithm
183 Default value: @code{buchberger}
185 Possible values: 
186 @itemize
187 @item @code{buchberger}
188 @item @code{parallel_buchberger}
189 @item @code{gebauer_moeller}
190 @end itemize
192 The name of the algorithm used to find the Groebner Bases.
194 @opencatbox{Categories:}
195 @category{Package grobner}
196 @closecatbox
198 @end defvr
200 @defvr {Option variable} poly_top_reduction_only
201 Default value: @code{false}
203 If not @code{false}, use top reduction only whenever possible. Top
204 reduction means that division algorithm stops after the first
205 reduction.
207 @opencatbox{Categories:}
208 @category{Package grobner}
209 @closecatbox
211 @end defvr
213 @subsection Simple operators in grobner
214 @code{poly_add}, @code{poly_subtract}, @code{poly_multiply} and @code{poly_expt}
215 are the arithmetical operations on polynomials.
216 These are performed using the internal representation, but the results are converted back to the
217 @emph{maxima} general form.
219 @anchor{poly_add}
220 @deffn {Function} poly_add (@var{poly1}, @var{poly2}, @var{varlist})
221 Adds two polynomials @var{poly1} and @var{poly2}.
222 @example
224 (%i1) poly_add(z+x^2*y,x-z,[x,y,z]);
225                                     2
226 (%o1)                              x  y + x
227 @end example
229 @opencatbox{Categories:}
230 @category{Package grobner}
231 @closecatbox
233 @end deffn
235 @anchor{poly_subtract}
236 @deffn {Function} poly_subtract (@var{poly1}, @var{poly2}, @var{varlist})
237 Subtracts a polynomial @var{poly2} from @var{poly1}.
238 @example
240 (%i1) poly_subtract(z+x^2*y,x-z,[x,y,z]);
241                                       2
242 (%o1)                          2 z + x  y - x
243 @end example
245 @opencatbox{Categories:}
246 @category{Package grobner}
247 @closecatbox
249 @end deffn
251 @anchor{poly_multiply}
252 @deffn {Function} poly_multiply (@var{poly1}, @var{poly2}, @var{varlist})
253 Returns the product of polynomials @var{poly1} and @var{poly2}.
254 @example
256 (%i2) poly_multiply(z+x^2*y,x-z,[x,y,z])-(z+x^2*y)*(x-z),expand;
257 (%o1)                                  0
258 @end example
260 @opencatbox{Categories:}
261 @category{Package grobner}
262 @closecatbox
264 @end deffn
266 @anchor{poly_s_polynomial}
267 @deffn {Function} poly_s_polynomial (@var{poly1}, @var{poly2}, @var{varlist})
268 Returns the @emph{syzygy polynomial} (@emph{S-polynomial}) of two polynomials @var{poly1} and @var{poly2}.
270 @opencatbox{Categories:}
271 @category{Package grobner}
272 @closecatbox
274 @end deffn
276 @anchor{poly_primitive_part}
277 @deffn {Function} poly_primitive_part (@var{poly1}, @var{varlist})
278 Returns the polynomial @var{poly} divided by the GCD of its coefficients. 
280 @example
281 (%i1) poly_primitive_part(35*y+21*x,[x,y]);
282 (%o1)                              5 y + 3 x
283 @end example
285 @opencatbox{Categories:}
286 @category{Package grobner}
287 @closecatbox
289 @end deffn
291 @anchor{poly_normalize}
292 @deffn {Function} poly_normalize (@var{poly}, @var{varlist})
293 Returns the polynomial @var{poly} divided by the leading coefficient.
294 It assumes that the division is possible, which may not always be the
295 case in rings which are not fields.
297 @opencatbox{Categories:}
298 @category{Package grobner}
299 @closecatbox
301 @end deffn
303 @subsection Other functions in grobner
305 @anchor{poly_expand}
306 @deffn {Function} poly_expand (@var{poly}, @var{varlist})
307 This function parses polynomials to internal form and back. It
308 is equivalent to @code{expand(@var{poly})} if @var{poly} parses correctly to
309 a polynomial. If the representation is not compatible with a
310 polynomial in variables @var{varlist}, the result is an error.
311 It can be used to test whether an expression correctly parses to the
312 internal representation. The following examples illustrate that
313 indexed and transcendental function variables are allowed.
314 @example
316 (%i1) poly_expand((x-y)*(y+x),[x,y]);
317                                      2    2
318 (%o1)                               x  - y
319 (%i2) poly_expand((y+x)^2,[x,y]);
320                                 2            2
321 (%o2)                          y  + 2 x y + x
322 (%i3) poly_expand((y+x)^5,[x,y]);
323                   5      4         2  3       3  2      4      5
324 (%o3)            y  + 5 x y  + 10 x  y  + 10 x  y  + 5 x  y + x
325 (%i4) poly_expand(-1-x*exp(y)+x^2/sqrt(y),[x]);
326                                           2
327                                   y      x
328 (%o4)                       - x %e  + ------- - 1
329                                        sqrt(y)
331 (%i5) poly_expand(-1-sin(x)^2+sin(x),[sin(x)]);
332                                 2
333 (%o5)                      - sin (x) + sin(x) - 1
335 @end example
337 @opencatbox{Categories:}
338 @category{Package grobner}
339 @closecatbox
341 @end deffn
343 @anchor{poly_expt}
344 @deffn {Function} poly_expt (@var{poly}, @var{number}, @var{varlist})
345 exponentitates @var{poly} by a positive integer @var{number}. If @var{number} is not a positive integer number an error will be raised.
346 @example
348 (%i1) poly_expt(x-y,3,[x,y])-(x-y)^3,expand;
349 (%o1)                                  0
350 @end example
352 @opencatbox{Categories:}
353 @category{Package grobner}
354 @closecatbox
356 @end deffn
358 @anchor{poly_content}
359 @deffn {Function} poly_content (@var{poly}. @var{varlist})
360 @code{poly_content} extracts the GCD of its coefficients
361 @example
363 (%i1) poly_content(35*y+21*x,[x,y]);
364 (%o1)                                  7
365 @end example
367 @opencatbox{Categories:}
368 @category{Package grobner}
369 @closecatbox
371 @end deffn
373 @anchor{poly_pseudo_divide}
374 @deffn {Function} poly_pseudo_divide (@var{poly}, @var{polylist}, @var{varlist})
375 Pseudo-divide a polynomial @var{poly} by the list of @math{n} polynomials @var{polylist}. Return
376 multiple values. The first value is a list of quotients @math{a}. The
377 second value is the remainder @math{r}. The third argument is a scalar
378 coefficient @math{c}, such that @math{c*poly} can be divided by @var{polylist} within the ring
379 of coefficients, which is not necessarily a field. Finally, the
380 fourth value is an integer count of the number of reductions
381 performed. The resulting objects satisfy the equation:
383 @iftex
384 @tex
385 $$c*poly=\sum_{i=1}^{n}({a}_{i}*{polylist}_{i})+r$$
386 @end tex
387 @end iftex
388 @ifnottex
389 @math{c*poly=sum(a[i]*polylist[i],i=1...n)+r}.
390 @end ifnottex
392 @opencatbox{Categories:}
393 @category{Package grobner}
394 @closecatbox
396 @end deffn
398 @anchor{poly_exact_divide}
399 @deffn {Function} poly_exact_divide (@var{poly1}, @var{poly2}, @var{varlist})
400 Divide a polynomial @var{poly1} by another polynomial @var{poly2}. Assumes that exact
401 division with no remainder is possible. Returns the quotient.
403 @opencatbox{Categories:}
404 @category{Package grobner}
405 @closecatbox
407 @end deffn
409 @anchor{poly_normal_form}
410 @deffn {Function} poly_normal_form (@var{poly}, @var{polylist}, @var{varlist})
411 @code{poly_normal_form} finds the normal form of a polynomial @var{poly} with respect
412 to a set of polynomials @var{polylist}.
414 @opencatbox{Categories:}
415 @category{Package grobner}
416 @closecatbox
418 @end deffn
420 @anchor{poly_buchberger_criterion}
421 @deffn {Function} poly_buchberger_criterion (@var{polylist}, @var{varlist})
422 Returns @code{true} if @var{polylist} is a Groebner basis with respect to the current term
423 order, by using the Buchberger
424 criterion: for every two polynomials @math{h1} and @math{h2} in @var{polylist} the
425 S-polynomial @math{S(h1,h2)} reduces to 0 @math{modulo} @var{polylist}.
427 @opencatbox{Categories:}
428 @category{Package grobner}
429 @closecatbox
431 @end deffn
433 @anchor{poly_buchberger}
434 @deffn {Function} poly_buchberger (@var{polylist_fl} @var{varlist})
435 @code{poly_buchberger} performs the Buchberger algorithm on a list of
436 polynomials and returns the resulting Groebner basis.
438 @opencatbox{Categories:}
439 @category{Package grobner}
440 @closecatbox
442 @end deffn
445 @subsection Standard postprocessing of Groebner Bases
447 @iftex
448 @tex
449 The \emph{k-th elimination ideal} $I_k$ of an ideal $I$ over 
450 $K [ x_1, ...,x_1 ]$ is $I \cap K [ x_{k + 1}, ..., x_n ]$.
452 \noindent
453 The \emph{colon ideal} $I : J$ is the ideal $\{ h|\forall w \in J : wh \in
454 I \}$.@*
456 \noindent
457 The ideal $I : p^{\infty}$ is the ideal $\{ h|\exists n \in N : p^n h \in I \}$.@*
459 \noindent
460 The ideal $I : J^{\infty}$ is the ideal $\{ h|\exists n \in N, \exists p \in J: p^n h \in I \}$.@*
462 \noindent
463 The \emph{radical ideal} $\sqrt{I}$ is the ideal $\{ h| \exists n \in N :
464 h^n \in I \}$.@*
466 @end tex
467 @end iftex
469 @ifnottex
470 The @emph{k-th elimination Ideal} @math{I_k} of an Ideal @math{I} over @math{K[ x[1],...,x[n] ]} is the ideal @math{intersect(I, K[ x[k+1],...,x[n] ])}.@*
471 @noindent
472 The @emph{colon ideal} @math{I:J} is the ideal @math{@{h|for all w in J: w*h in I@}}.@*
473 @noindent
474 The ideal @math{I:p^inf} is the ideal @math{@{h| there is a n in N: p^n*h in I@}}.@*
475 @noindent
476 The ideal @math{I:J^inf} is the ideal @math{@{h| there is a n in N and a p in J: p^n*h in I@}}.@*
477 @noindent
478 The @emph{radical ideal} @math{sqrt(I)} is the ideal 
479 @math{@{h| there is a n in N : h^n in I @}}.
480 @end ifnottex
482 @noindent
483 @anchor{poly_reduction}
484 @deffn {Function} poly_reduction (@var{polylist}, @var{varlist})
485 @code{poly_reduction} reduces a list of polynomials @var{polylist}, so that
486 each polynomial is fully reduced with respect to the other polynomials.
488 @opencatbox{Categories:}
489 @category{Package grobner}
490 @closecatbox
492 @end deffn
494 @anchor{poly_minimization}
495 @deffn {Function} poly_minimization (@var{polylist}, @var{varlist})
496 Returns a sublist of the polynomial list @var{polylist} spanning the same
497 monomial ideal as @var{polylist} but minimal, i.e. no leading monomial
498 of a polynomial in the sublist divides the leading monomial
499 of another polynomial.
501 @opencatbox{Categories:}
502 @category{Package grobner}
503 @closecatbox
505 @end deffn
508 @anchor{poly_normalize_list}
509 @deffn {Function} poly_normalize_list (@var{polylist}, @var{varlist})
510 @code{poly_normalize_list} applies @code{poly_normalize} to each polynomial in the list.
511 That means it divides every polynomial in a list @var{polylist} by its leading coefficient.
513 @opencatbox{Categories:}
514 @category{Package grobner}
515 @closecatbox
517 @end deffn
519 @anchor{poly_grobner}
520 @deffn {Function} poly_grobner (@var{polylist}, @var{varlist})
521 Returns a Groebner basis of the ideal span by the polynomials @var{polylist}. Affected by the global flags.
523 @opencatbox{Categories:}
524 @category{Package grobner}
525 @closecatbox
527 @end deffn
529 @anchor{poly_reduced_grobner}
530 @deffn {Function} poly_reduced_grobner (@var{polylist}, @var{varlist})
531 Returns a reduced Groebner basis of the ideal span by the polynomials @var{polylist}. Affected by the global flags.
533 @opencatbox{Categories:}
534 @category{Package grobner}
535 @closecatbox
537 @end deffn
540 @anchor{poly_depends_p}
541 @deffn {Function} poly_depends_p (@var{poly}, @var{var}, @var{varlist})
542 @code{poly_depends} tests whether a polynomial depends on a variable @var{var}.
544 @opencatbox{Categories:}
545 @category{Package grobner}
546 @category{Predicate functions}
547 @closecatbox
549 @end deffn
552 @anchor{poly_elimination_ideal}
553 @deffn {Function} poly_elimination_ideal (@var{polylist}, @var{number}, @var{varlist})
556 @code{poly_elimination_ideal} returns the grobner basis of the @math{number}-th elimination ideal of an
557 ideal specified as a list of generating polynomials (not necessarily Groebner basis).
559 @opencatbox{Categories:}
560 @category{Package grobner}
561 @closecatbox
563 @end deffn
565 @anchor{poly_colon_ideal}
566 @deffn {Function} poly_colon_ideal (@var{polylist1}, @var{polylist2}, @var{varlist})
568 Returns the reduced Groebner basis of the colon ideal 
570 @math{I(polylist1):I(polylist2)}
572 @noindent
573 where @math{polylist1} and @math{polylist2} are two lists of polynomials.
575 @opencatbox{Categories:}
576 @category{Package grobner}
577 @closecatbox
579 @end deffn
581 @anchor{poly_ideal_intersection}
582 @deffn {Function} poly_ideal_intersection (@var{polylist1}, @var{polylist2}, @var{varlist})
584 @code{poly_ideal_intersection} returns the intersection of two ideals.
586 @opencatbox{Categories:}
587 @category{Package grobner}
588 @closecatbox
590 @end deffn
593 @anchor{poly_lcm}
594 @deffn {Function} poly_lcm (@var{poly1}, @var{poly2}, @var{varlist})
595 Returns the lowest common multiple of @var{poly1} and @var{poly2}.
597 @opencatbox{Categories:}
598 @category{Package grobner}
599 @closecatbox
601 @end deffn
603 @c -----------------------------------------------------------------------------
604 @anchor{poly_gcd}
605 @deffn {Function} poly_gcd (@var{poly1}, @var{poly2}, @var{varlist})
607 Returns the greatest common divisor of @var{poly1} and @var{poly2}.
609 See also @mrefcomma{ezgcd} @mrefcomma{gcd} @mrefcomma{gcdex} and
610 @mrefdot{gcdivide}
612 Example:
614 @example
615 (%i1) p1:6*x^3+19*x^2+19*x+6; 
616                         3       2
617 (%o1)                6 x  + 19 x  + 19 x + 6
618 (%i2) p2:6*x^5+13*x^4+12*x^3+13*x^2+6*x;
619                   5       4       3       2
620 (%o2)          6 x  + 13 x  + 12 x  + 13 x  + 6 x
621 (%i3) poly_gcd(p1, p2, [x]);
622                             2
623 (%o3)                    6 x  + 13 x + 6
624 @end example
626 @opencatbox{Categories:}
627 @category{Package grobner}
628 @closecatbox
629 @end deffn
631 @anchor{poly_grobner_equal}
632 @deffn {Function} poly_grobner_equal (@var{polylist1}, @var{polylist2}, @var{varlist})
633 @code{poly_grobner_equal} tests whether two Groebner Bases generate the same ideal.
634 Returns @code{true} if two lists of polynomials @var{polylist1} and @var{polylist2}, assumed to be Groebner Bases,
635 generate the same ideal, and @code{false} otherwise.
636 This is equivalent to checking that every polynomial of the first basis reduces to 0
637 modulo the second basis and vice versa. Note that in the example below the
638 first list is not a Groebner basis, and thus the result is @code{false}.
640 @example
641 (%i1) poly_grobner_equal([y+x,x-y],[x,y],[x,y]);
642 (%o1)                         false
643 @end example
645 @opencatbox{Categories:}
646 @category{Package grobner}
647 @closecatbox
649 @end deffn
651 @anchor{poly_grobner_subsetp}
652 @deffn {Function} poly_grobner_subsetp (@var{polylist1}, @var{polylist2}, @var{varlist})
654 @code{poly_grobner_subsetp} tests whether an ideal generated by @var{polylist1}
655 is contained in the ideal generated by @var{polylist2}. For this test to always succeed,
656 @var{polylist2} must be a Groebner basis.
658 @opencatbox{Categories:}
659 @category{Package grobner}
660 @category{Predicate functions}
661 @closecatbox
663 @end deffn
665 @anchor{poly_grobner_member}
666 @deffn {Function} poly_grobner_member (@var{poly}, @var{polylist}, @var{varlist})
668 Returns @code{true} if a polynomial @var{poly} belongs to the ideal generated by the
669 polynomial list @var{polylist}, which is assumed to be a Groebner basis. Returns @code{false} otherwise.
671 @code{poly_grobner_member} tests whether a polynomial belongs to an ideal generated by a list of polynomials,
672 which is assumed to be a Groebner basis. Equivalent to @code{normal_form} being 0. 
674 @opencatbox{Categories:}
675 @category{Package grobner}
676 @closecatbox
678 @end deffn
680 @anchor{poly_ideal_saturation1}
681 @deffn {Function} poly_ideal_saturation1 (@var{polylist}, @var{poly}, @var{varlist})
682 Returns the reduced Groebner basis of the saturation of the ideal
683 @iftex
684 @tex
685 $$I(polylist):poly^\infty$$
686 @end tex
687 @end iftex
689 @ifnottex
690 I(polylist):poly^inf
691 @end ifnottex
693 @noindent
694 Geometrically, over an algebraically closed field, this is the set
695 of polynomials in the ideal generated by @var{polylist} which do not identically
696 vanish on the variety of @var{poly}.
698 @opencatbox{Categories:}
699 @category{Package grobner}
700 @closecatbox
702 @end deffn
704 @anchor{poly_ideal_saturation}
705 @deffn {Function} poly_ideal_saturation (@var{polylist1}, @var{polylist2}, @var{varlist})
706 Returns the reduced Groebner basis of the saturation of the ideal
707 @iftex
708 @tex
709 $$I(polylist1):I(polylist2)^\infty$$
710 @end tex
711 @end iftex
713 @ifnottex
714 I(polylist1):I(polylist2)^inf
715 @end ifnottex
717 @noindent
718 Geometrically, over an algebraically closed field, this is the set of polynomials in
719 the ideal generated by @var{polylist1} which do not identically vanish on the
720 variety of @var{polylist2}.
722 @opencatbox{Categories:}
723 @category{Package grobner}
724 @closecatbox
726 @end deffn
728 @anchor{poly_ideal_polysaturation1}
729 @deffn {Function} poly_ideal_polysaturation1 (@var{polylist1}, @var{polylist2}, @var{varlist})
730 @var{polylist2} is a list of n polynomials @code{[poly1,...,polyn]}.
731 Returns the reduced Groebner basis of the ideal
732 @iftex
733 @tex
734 $$I(polylist):poly1^\infty:...:polyn^\infty$$
735 @end tex
736 @end iftex
738 @ifnottex
739 I(polylist):poly1^inf:...:polyn^inf
740 @end ifnottex
742 @noindent
743 obtained by a
744 sequence of successive saturations in the polynomials
745 of the polynomial list @var{polylist2} of the ideal generated by the
746 polynomial list @var{polylist1}.
748 @opencatbox{Categories:}
749 @category{Package grobner}
750 @closecatbox
752 @end deffn
754 @anchor{poly_ideal_polysaturation}
755 @deffn {Function} poly_ideal_polysaturation (@var{polylist}, @var{polylistlist}, @var{varlist})
756 @var{polylistlist} is a list of n list of polynomials @code{[polylist1,...,polylistn]}.
757 Returns the reduced Groebner basis of the saturation of the ideal
758 @iftex
759 @tex
760 $$I(polylist):I(polylist_1)^\infty:...:I(polylist_n)^\infty$$
761 @end tex
762 @end iftex
764 @ifnottex
765 I(polylist):I(polylist_1)^inf:...:I(polylist_n)^inf
766 @end ifnottex
768 @opencatbox{Categories:}
769 @category{Package grobner}
770 @closecatbox
772 @end deffn
774 @anchor{poly_saturation_extension}
775 @deffn {Function} poly_saturation_extension (@var{poly}, @var{polylist}, @var{varlist1}, @var{varlist2})
777 @code{poly_saturation_extension} implements the famous Rabinowitz trick.
779 @opencatbox{Categories:}
780 @category{Package grobner}
781 @closecatbox
783 @end deffn
785 @anchor{poly_polysaturation_extension}
786 @deffn {Function} poly_polysaturation_extension (@var{poly}, @var{polylist}, @var{varlist1}, @var{varlist2})
788 @opencatbox{Categories:}
789 @category{Package grobner}
790 @closecatbox
792 @end deffn