# ApCoCoA-1:NC.RedGB

## NC.RedGB

Enumerate reduced (partial) Groebner bases of finitely generated two-sided ideals in a non-commutative polynomial ring.

Given a word ordering and a two-sided ideal `I`, a set of non-zero polynomials `Gb` is called a *Groebner basis* of `I` if the leading word set `LT{Gb}` generates the leading word ideal `LT(I)`. A Groebner basis `Gb` of `I` is *reduced* if `Gb` is interreduced (see NC.Interreduction) and all polynomials in `Gb` are monic. Note that each ideal has a unique (not necessarily finite) reduced Groebner basis.

### Syntax

NC.RedGB(G:LIST[, Optimize:INT, OFlag:INT, DB:INT, LB:INT]):LIST

### Description

*Please note:* The function(s) explained on this page is/are using the *ApCoCoAServer*. You will have to start the ApCoCoAServer in order to use it/them.

Please set non-commutative polynomial ring (via the command Use) and word ordering (via the function NC.SetOrdering) before calling this function. The default word ordering is the length-lexicographic ordering ("LLEX"). For more information, please check the relevant commands and functions.

@param

*G*: a LIST of non-zero non-commutative polynomials that generate a two-sided ideal. Each polynomial is represented as a LIST of LISTs, and each element in every inner LIST involves only one indeterminate or none (a constant). For example, the polynomial`f=2x[2]y[1]x[2]^2-9y[2]x[1]^2x[2]^3+5`is represented as F:=[[2x[1],y[1],x[2]^2], [-9y[2],x[1]^2,x[2]^3], [5]]. The zero polynomial`0`is represented as the empty LIST [].@return: a LIST of interreduced non-zero non-commutative polynomials, which is a reduced Groebner basis of the two-sided ideal generated by G if (1) there exists a finite Groebner basis and (2) the enumerating procedure was not interrupted by the degree bound DB or the loop bound LB, and is a reduced partial Groebner basis otherwise.

About 4 optional parameters:

@param

*Optimize:*an INT between 0 and 31. The value of Optimize indicates which criteria are used in the Buchberger procedure. For the time being, the function supports 5 criteria as follows.The multiply criterion: Optimize=1; The leading word criterion: Optimize=2; The tail reduction criterion: Optimize=4; The backward criterion: Optimize=8; Discarding redundant generators: Optimize=16; (Reference: M. Kreuzer and X. Xiu, Non-Commutative Gebauer-Moeller Criteria, 2013.)

One can choose none, one, or more than one criterion in the function. For instance, Optimize=0 means no criterion is used, Optimize=1 means applying the multiply criterion, Optimize=3 (1+2) means applying the multiply and the leading word criteria, etc. By default, Optimize=31, i.e. the function applies all criteria.

@param

*OFlag:*an INT that indicates which information will be output by the ApCoCoAServer during the Buchberger enumerating procedure. If OFlag=1, the ApCoCoAServer outputs basic information, such as the number of enumerating steps that has been proceeded, the number of elements in partial Groebner basis, the degree of current selected obstruction, the number of unselected obstructions, the total number of obstructions, the number of selected obstructions, and the number of unnecessary obstructions. If Flag=2, besides the information as FLAG=1, the ApCoCoAServer also displays explicitly the elements in paritial Groebner basis and the current selected S-polynonial. Otherwise, the ApCoCoAServer outputs nothing during the procedure.@param

*DB:*a positive INT, which gives a degree bound of S-polynomials (or obstructions) during the Buchberger enumerating procedure. When the degree bound is reached, the enumerating procedure will be interrupted and return a partial Groebner basis.@param

*LB:*a positive INT, which gives a loop bound of enumerating steps. When the loop bound is reached,the enumerating procedure will be interrupted and return a partial Groebner basis.

#### Example

NC.SetX(<quotes>xyzt</quotes>); F1 := [[1,<quotes>xx</quotes>], [-1,<quotes>yx</quotes>]]; F2 := [[1,<quotes>xy</quotes>], [-1,<quotes>ty</quotes>]]; F3 := [[1,<quotes>xt</quotes>], [-1, <quotes>tx</quotes>]]; F4 := [[1,<quotes>yt</quotes>], [-1, <quotes>ty</quotes>]]; G := [F1, F2,F3,F4]; NC.ReducedGB(G); -- over Q (default field), LLEX ordering (default ordering) [[[1, <quotes>yt</quotes>], [-1, <quotes>ty</quotes>]], [[1, <quotes>xt</quotes>], [-1, <quotes>tx</quotes>]], [[1, <quotes>xy</quotes>], [-1, <quotes>ty</quotes>]], [[1, <quotes>xx</quotes>], [-1, <quotes>yx</quotes>]], [[1, <quotes>tyy</quotes>], [-1, <quotes>tty</quotes>]], [[1, <quotes>yyx</quotes>], [-1, <quotes>tyx</quotes>]]] ------------------------------- NC.SetFp(); -- set default Fp=F2 NC.ReducedGB(G); -- over F2, LLEX ordering [[[1, <quotes>yt</quotes>], [1, <quotes>ty</quotes>]], [[1, <quotes>xt</quotes>], [1, <quotes>tx</quotes>]], [[1, <quotes>xy</quotes>], [1, <quotes>ty</quotes>]], [[1, <quotes>xx</quotes>], [1, <quotes>yx</quotes>]], [[1, <quotes>tyy</quotes>], [1, <quotes>tty</quotes>]], [[1, <quotes>yyx</quotes>], [1, <quotes>tyx</quotes>]]] ------------------------------- NC.SetFp(3); NC.ReducedGB(G); -- over F3, LLEX ordering [[[1, <quotes>yt</quotes>], [2, <quotes>ty</quotes>]], [[1, <quotes>xt</quotes>], [2, <quotes>tx</quotes>]], [[1, <quotes>xy</quotes>], [2, <quotes>ty</quotes>]], [[1, <quotes>xx</quotes>], [2, <quotes>yx</quotes>]], [[1, <quotes>tyy</quotes>], [2, <quotes>tty</quotes>]], [[1, <quotes>yyx</quotes>], [2, <quotes>tyx</quotes>]]] ------------------------------- NC.SetX(<quotes>xyzt</quotes>); F1 := [[1,<quotes>xx</quotes>], [-1,<quotes>yx</quotes>]]; F2 := [[1,<quotes>xy</quotes>], [-1,<quotes>ty</quotes>]]; F3 := [[1,<quotes>xt</quotes>], [-1, <quotes>tx</quotes>]]; F4 := [[1,<quotes>yt</quotes>], [-1, <quotes>ty</quotes>]]; F:= [F1, F2,F3,F4]; G1:=NC.ReducedGB(F); G1; NC.IsGB(G1); -- G1 is a reduced Groebner basis Fa:=[[1,<quotes>ytx</quotes>],[-1,<quotes></quotes>]]; Append(G1,Fa); -- add one element to G1 G1; NC.IsGB(G1); -- G1 is not a Groebner basis any longer G2:=NC.ReducedGB(G1); -- compute reduced Groebner basis G2 generated by G1 G2; G3:=NC.IsGB(G2); G3:=NC.ReducedGB(G2); -- compute reduced Groebner basis G3 generated by G2 G3; NC.IsGB(G3); G2=G3; -- of course [[[1, <quotes>yt</quotes>], [-1, <quotes>ty</quotes>]], [[1, <quotes>xt</quotes>], [-1, <quotes>tx</quotes>]], [[1, <quotes>xy</quotes>], [-1, <quotes>ty</quotes>]], [[1, <quotes>xx</quotes>], [-1, <quotes>yx</quotes>]], [[1, <quotes>tyy</quotes>], [-1, <quotes>tty</quotes>]], [[1, <quotes>yyx</quotes>], [-1, <quotes>tyx</quotes>]]] ------------------------------- True ------------------------------- [[[1, <quotes>yt</quotes>], [-1, <quotes>ty</quotes>]], [[1, <quotes>xt</quotes>], [-1, <quotes>tx</quotes>]], [[1, <quotes>xy</quotes>], [-1, <quotes>ty</quotes>]], [[1, <quotes>xx</quotes>], [-1, <quotes>yx</quotes>]], [[1, <quotes>tyy</quotes>], [-1, <quotes>tty</quotes>]], [[1, <quotes>yyx</quotes>], [-1, <quotes>tyx</quotes>]], [[1, <quotes>ytx</quotes>], [-1, <quotes></quotes>]]] ------------------------------- False ------------------------------- [[[1, <quotes>y</quotes>], [-1, <quotes>t</quotes>]], [[1, <quotes>x</quotes>], [-1, <quotes>t</quotes>]], [[1, <quotes>ttt</quotes>], [-1, <quotes></quotes>]]] ------------------------------- [[[1, <quotes>y</quotes>], [-1, <quotes>t</quotes>]], [[1, <quotes>x</quotes>], [-1, <quotes>t</quotes>]], [[1, <quotes>ttt</quotes>], [-1, <quotes></quotes>]]] ------------------------------- True ------------------------------- True -------------------------------

### See also