@c -*-texinfo-*- @c ---------------------------------------------------------------------------- @node PLURAL, Data types BR_PLURAL_BR, , Non-commutative subsystem @section PLURAL @cindex PLURAL @ifhtml @html
Singular:Plural logo

A Computer Algebra Subsystem for Non-commutative Polynomial Algebras

@end html @end ifhtml @table @strong @item @strong{What is and what does @sc{Plural}?} @sc{Plural} is a kernel extension of @sc{Singular}, providing many algorithms for computations within certain non-commutative algebras (see @ref{Mathematical background BR_PLURAL_BR} for detailed information on algebras and algorithms). It uses the same data structures, sometimes interpreting them in a different way and/or modifying them for its own purposes. In spite of such a difference, one can always transfer objects between commutative rings of @sc{Singular} and non-commutative rings. With @sc{Plural}, one can set up a non-commutative @math{G}-algebra, say @math{A}, with a Poincar@'e-Birkhoff-Witt (PBW) basis, (see @ref{G-algebras} for step-by-step building instructions and also @ref{Non-commutative libraries} for procedures for setting many important algebras easily). Functionalities of @sc{Plural} (enlisted in @ref{Functions BR_PLURAL_BR}) are accessible as soon as the basering becomes non-commutative (see @ref{nc_algebra}). One can perform various computations with polynomials and ideals in @math{A} and with vectors and submodules of a free module @tex $A^n$. @end tex @ifinfo A^n. @end ifinfo One can work also within factor algebras of @math{G}-algebras (see @ref{qring BR_PLURAL_BR} type) by two-sided ideals (see @ref{twostd}). @end table @table @strong @item @strong{What @sc{Plural} does not:} @itemize @item @sc{Plural} does not perform computations in the free algebra or in its general factor algebras (instead, these computations can be possibly done due to @ref{LETTERPLACE}). In @sc{Plural} one can only work with @math{G}-algebras and with their factor-algebras by two-sided ideals (@math{GR}-algebras). @item @sc{Plural} requires a monomial ordering but it does not work generally with local and mixed orderings. Right now, one can use only global orderings in @sc{Plural} (see @ref{General definitions for orderings}), save for SCA, where we provide the possibility of computations in a tensor product of a non-commutative algebra (with a global ordering) with a commutative algebra (with any ordering). In the future, this will be enhanced for other algebras, as well. @item @sc{Plural} does not handle non-commutative parameters. Defining parameters, one @strong{cannot} impose non-commutative relations on them. Moreover, it is impossible to introduce parameters which do not commute with variables. @end itemize @end table @table @strong @item @sc{Plural} conventions @item *-multiplication BR_PLURAL_BR @itemize in the non-commutative case, the correct multiplication of @code{y} by @code{x} must be written as @code{y*x}. @* Both expressions @code{yx} and @code{xy} are equal, since they are interpreted as commutative expressions. See example in @ref{poly expressions BR_PLURAL_BR}. @* Note, that @sc{Plural} output consists only of monomials, hence the signs @code{*} are omitted. @end itemize @item @code{ideal} BR_PLURAL_BR @itemize Unless stated otherwise, an @code{ideal} as understood by @sc{Plural}, is a list of generators of a @strong{left} ideal. For more information see @ref{ideal BR_PLURAL_BR}. @* For a @strong{two-sided ideal} @code{T}, use command @ref{twostd} in order to compute the two-sided Groebner basis of @code{T}. @c ( at the same time it is a left Groebner basis). @end itemize @item @code{module} BR_PLURAL_BR @itemize Unless stated otherwise, a @code{module} as understood by @sc{Plural}, is @strong{either} a fininitely generated @strong{left} submodule of a free module (of finite rank) @* @strong{or} a factor module of a free module (of finite rank) by its left submodule (see @ref{module BR_PLURAL_BR} for details). @end itemize @c @item ordering BR_PLURAL_BR @c @itemize @c @sc{Plural} works with @strong{global} orderings only. @c @ifset singularmanual @c See @ref{ General definitions for orderings } @c @end ifset @c @ifclear singularmanual @c See @sc{Singular} manual section General definitions for orderings. @c @end ifclear @c @end itemize @item @code{qring} BR_PLURAL_BR @itemize In @sc{Plural} it is only possible to build factor-algebras modulo @strong{two-sided} ideals (see @ref{qring BR_PLURAL_BR}). @end itemize @end table @c ---------------------------------------------------------------------------- @node Data types BR_PLURAL_BR, Functions BR_PLURAL_BR, PLURAL, Non-commutative subsystem @section Data types BR_PLURAL_BR @lowersections @cindex Data types BR_PLURAL_BR @cindex expression list This chapter explains all data types of @sc{Plural} in alphabetical order. For every type, there is a description of the declaration syntax @* as well as information about how to build expressions of certain types. The term "expression list" in @sc{Plural} refers to any comma separated list of expressions. For the general syntax of a declaration see @ref{General command syntax}. @menu * ideal BR_PLURAL_BR:: * map BR_PLURAL_BR:: * module BR_PLURAL_BR:: * poly BR_PLURAL_BR:: * qring BR_PLURAL_BR:: * resolution BR_PLURAL_BR:: * ring BR_PLURAL_BR:: @end menu @c --------------------------------------- @node ideal BR_PLURAL_BR, map BR_PLURAL_BR, Data types BR_PLURAL_BR, Data types BR_PLURAL_BR @section ideal BR_PLURAL_BR @c @cindex ideal @cindex untyped definitions For @sc{Plural} ideals are @strong{left} ideals, unless stated otherwise. @* Ideals are represented as lists of polynomials which are interpreted as left generators of the ideal. @* For the operations with two-sided ideals see @ref{twostd}. Like polynomials, ideals can only be defined or accessed with respect to a basering. @strong{Note:} @code{size} counts only the non-zero generators of an ideal whereas @code{ncols} counts all generators. @menu * ideal declarations BR_PLURAL_BR:: * ideal expressions BR_PLURAL_BR:: * ideal operations BR_PLURAL_BR:: * ideal related functions BR_PLURAL_BR:: @end menu @c --------------------------------------- @node ideal declarations BR_PLURAL_BR, ideal expressions BR_PLURAL_BR, ideal BR_PLURAL_BR, ideal BR_PLURAL_BR @subsection ideal declarations BR_PLURAL_BR @cindex ideal declarations BR_PLURAL_BR @table @strong @item Syntax: @code{ideal} name @code{=} list_of_poly_and_ideal_expressions @code{;} @*@code{ideal} name @code{=} ideal_expression @code{;} @item Purpose: defines a left ideal. @item Default: 0 @item Example: @smallexample @c example ring r=0,(x,y,z),dp; def R=nc_algebra(-1,0); // an anti-commutative algebra setring R; poly s1 = x2; poly s2 = y3; poly s3 = z; ideal i = s1, s2-s1, 0,s3*s2, s3^4; i; size(i); ncols(i); @c example @end smallexample @end table @c ------------------------------ @node ideal expressions BR_PLURAL_BR, ideal operations BR_PLURAL_BR, ideal declarations BR_PLURAL_BR, ideal BR_PLURAL_BR @subsection ideal expressions BR_PLURAL_BR @cindex ideal expressions BR_PLURAL_BR An ideal expression is: @enumerate @item an identifier of type ideal @item a function returning an ideal @item a combination of ideal expressions by the arithmetic operations @code{+} or @code{*} @item a power of an ideal expression (operator @code{^} or @code{**}) @*Note that the computation of the product @code{i*i} involves all products of generators of @code{i} while @code{i^2} involves only the different ones, and is therefore faster. @item a type cast to ideal @end enumerate @*@strong{Example:} @smallexample @c example ring r=0,(x,y,z),dp; def R=nc_algebra(-1,0); // an anticommutative algebra setring R; ideal m = maxideal(1); m; poly f = x2; poly g = y3; ideal i = x*y*z , f-g, g*(x-y) + f^4 ,0, 2x-z2y; ideal M = i + maxideal(10); i = M*M; ncols(i); i = M^2; ncols(i); i[ncols(i)]; vector v = [x,y-z,x2,y-x,x2yz2-y]; ideal j = ideal(v); j; @c example @end smallexample @c ------------------------------ @node ideal operations BR_PLURAL_BR, ideal related functions BR_PLURAL_BR, ideal expressions BR_PLURAL_BR, ideal BR_PLURAL_BR @subsection ideal operations BR_PLURAL_BR @cindex ideal operations BR_PLURAL_BR @table @asis @item @code{+} addition (concatenation of the generators and simplification) @item @code{*} multiplication (with ideal, poly, vector, module; in case of multiplication with ideal or module, the result will be simplified) @item @code{^} exponentiation (by a non-negative integer) @item ideal_expression @code{[} intvec_expression @code{]} are polynomial generators of the ideal, index 1 gives the first generator. @end table @ifset singularmanual @strong{Note:} For simplification of an ideal, see also @ref{simplify}. @end ifset @ifclear singularmanual @strong{Note:} For simplification of an ideal, see also section simplify in @sc{Singular} manual. @end ifclear @*@strong{Example:} @smallexample @c example ring r=0,(x,y,z),dp; matrix D[3][3]; D[1,2]=-z; D[1,3]=y; D[2,3]=x; def R=nc_algebra(1,D); // this algebra is U(so_3) setring R; ideal I = 0,x,0,1; I; I + 0; // simplification I*x; ideal J = I,0,x,x-z; I * J; // multiplication with simplification vector V = [x,y,z]; print(I*V); ideal m = maxideal(1); m^2; ideal II = I[2..4]; II; @c example @end smallexample @c ------------------------------ @node ideal related functions BR_PLURAL_BR, , ideal operations BR_PLURAL_BR, ideal BR_PLURAL_BR @subsection ideal related functions BR_PLURAL_BR @cindex ideal related functions BR_PLURAL_BR @table @code @item dim Gelfand-Kirillov dimension of basering modulo the ideal of leading terms (see @ref{dim BR_PLURAL_BR}) @item eliminate elimination of variables (see @ref{eliminate BR_PLURAL_BR}) @item intersect ideal intersection (see @ref{intersect BR_PLURAL_BR}) @item kbase vector space basis of basering modulo the leading ideal (see @ref{kbase BR_PLURAL_BR}) @item lead leading terms of a set of generators (see @ref{lead}) @item lift lift-matrix (see @ref{lift BR_PLURAL_BR}) @item liftstd left Groebner basis and transformation matrix computation (see @ref{liftstd BR_PLURAL_BR}) @item maxideal generators of a power of the maximal ideal at 0 (see @ref{maxideal}) @item modulo represents @tex $(h1+h2)/h1 \cong h2/(h1 \cap h2)$ @end tex @ifinfo (h1+h2)/h1=h2/(h1 intersect h2) @end ifinfo (see @ref{modulo BR_PLURAL_BR}) @item mres minimal free resolution of an ideal and a minimal set of generators of the given ideal (see @ref{mres BR_PLURAL_BR}) @item ncols number of columns (see @ref{ncols}) @item nres computes a free resolution of an ideal resp.@: module M which is minimized from the second free module on (see @ref{nres BR_PLURAL_BR}) @item oppose creates an opposite ideal of a given ideal from the given ring into a basering (see @ref{oppose}) @item preimage preimage under a ring map (see @ref{preimage BR_PLURAL_BR}) @item quotient ideal quotient (see @ref{quotient BR_PLURAL_BR}) @item reduce left normal form with respect to a left Groebner basis (see @ref{reduce BR_PLURAL_BR}) @item simplify simplify a set of polynomials (see @ref{simplify}) @item size number of non-zero generators (see @ref{size}) @item slimgb left Groebner basis computation with slim technique (see @ref{slimgb BR_PLURAL_BR}) @item std left Groebner basis computation (see @ref{std BR_PLURAL_BR}) @item subst substitute a ring variable (see @ref{subst BR_PLURAL_BR}) @item syz computation of the first syzygy module (see @ref{syz BR_PLURAL_BR}) @item twostd two-sided Groebner basis computation (see @ref{twostd}) @item vdim vector space dimension of basering modulo the leading ideal (see @ref{vdim BR_PLURAL_BR}) @end table @c --------------------------------------- @node map BR_PLURAL_BR, module BR_PLURAL_BR, ideal BR_PLURAL_BR, Data types BR_PLURAL_BR @section map BR_PLURAL_BR @cindex map BR_PLURAL_BR Maps are ring maps from a preimage ring (source) into the basering (target), defined by specifying images for source variables in the target ring. @strong{Note:} @itemize @bullet @item the target of a map is @strong{ALWAYS} the actual basering @item the preimage ring has to be stored "by its name", that means, maps can only be used in such contexts, where the name of the preimage ring can be resolved (this has to be considered in subprocedures). @c (i.e., there might be problems for rings/maps defined in subprocedures). @ifset singularmanual See also @ref{Identifier resolution}, @ref{Names in procedures}. @end ifset @end itemize Maps between rings with different coefficient fields are possible and listed below. Canonically realized are @itemize @bullet @item @tex $Q \rightarrow Q(a, \ldots)$ @end tex @ifinfo Q -> Q(a,..) @end ifinfo (@math{Q}: the rational numbers) @item @tex $Q \rightarrow R$ @end tex @ifinfo Q -> R @end ifinfo (@math{R}: the real numbers) @item @tex $Q \rightarrow C$ @end tex @ifinfo Q -> C @end ifinfo (@math{C}: the complex numbers) @item @tex $Z/p \rightarrow (Z/p)(a, \ldots)$ @end tex @ifinfo Z/p ->(Z/p)(a,...) @end ifinfo (@math{Z}: the integers) @item @tex $Z/p \rightarrow GF(p^n)$ @end tex @ifinfo Z/p -> GF(p^n) @end ifinfo (@math{GF}: the Galois field) @item @tex $Z/p \rightarrow R$ @end tex @ifinfo Z/p -> R @end ifinfo @item @tex $R \rightarrow C$ @end tex @ifinfo R -> C @end ifinfo @end itemize Possible are furthermore @itemize @bullet @item @tex % This is quite a hack, but for now it works. $Z/p \rightarrow Q, \quad [i]_p \mapsto i \in [-p/2, \, p/2] \subseteq Z$ @end tex @ifinfo Z/p -> Q : [i]_p -> i in [-p/2, p/2] in Z @end ifinfo @item @tex $Z/p \rightarrow Z/p^\prime, \quad [i]_p \mapsto i \in [-p/2, \, p/2] \subseteq Z, \; i \mapsto [i]_{p^\prime} \in Z/p^\prime$ @end tex @ifinfo Z/p -> Z/p' : [i]_p in Z/p -> i in [-p/2,p/2] in Z, i -> [i]_p' in Z/p' @end ifinfo @item @tex $C \rightarrow R, \quad$ by taking the real part @end tex @ifinfo C -> R by taking the real part. @end ifinfo @end itemize Finally, in @sc{Plural} we allow the mapping from rings with coefficient field Q to rings whose ground fields have finite characteristic: @itemize @bullet @item @tex $Q \rightarrow Z/p$ @end tex @ifinfo Q -> Z/p @end ifinfo @item @tex $Q \rightarrow (Z/p)(a, \ldots)$ @end tex @ifinfo Q -> (Z/p)(a,..) @end ifinfo @end itemize @strong{Note:} In these cases the denominator and the numerator of a number are mapped separately by the usual map from Z to Z/p, and the image of the number is built again afterwards by division. It is thus not allowed to map numbers whose denominator is divisible by the characteristic of the target ground field, or objects containing such numbers. We, therefore, strongly recommend to use such maps only to map objects with integer coefficients. @*Note that - in contrast to the commutative case - maps between non-commutative rings easily fail to be a morphism. @menu * map declarations BR_PLURAL_BR:: * map expressions BR_PLURAL_BR:: * map operations BR_PLURAL_BR :: * map related functions BR_PLURAL_BR :: @end menu @c @iftex @c See @ref{imap}; @ref{fetch}; @ref{subst}. @c @end iftex @c ------------------------------ @node map declarations BR_PLURAL_BR, map expressions BR_PLURAL_BR, map BR_PLURAL_BR, map BR_PLURAL_BR @subsection map declarations BR_PLURAL_BR @cindex map declarations BR_PLURAL_BR @table @strong @item Syntax: @code{map} name @code{=} preimage_ring_name @code{,} ideal_expression @code{;} @*@code{map} name @code{=} preimage_ring_name @code{,} list_of_poly_and_ideal_expressions @code{;} @*@code{map} name @code{=} map_expression @code{;} @item Purpose: defines a ring map from @code{preimage_ring} to basering. @* Maps the variables of the @code{preimage ring} to the generators of the ideal. @* If the ideal contains less elements than the number of variables in the @code{preimage_ring}, the remaining variables are mapped to 0. @* If the ideal contains more elements, extra elements are ignored. @* The image ring is always the current basering. For the mapping of coefficients from different fields see @ref{map BR_PLURAL_BR}. @item Default: none @item Note: There are standard mappings for maps which are close to the identity map: @code{fetch BR_PLURAL_BR} and @code{imap BR_PLURAL_BR}. The name of a map serves as the function which maps objects from the preimage_ring into the basering. These objects must be defined by names (no evaluation in the preimage ring is possible). @item Example: @smallexample @c example // an easy example ring r1 = 0,(a,b),dp; // a commutative ring poly P = a^2+ab+b^3; ring r2 = 0,(x,y),dp; def W=nc_algebra(1,-1); // a Weyl algebra setring W; map M = r1, x^2, -y^3; // note: M is a map and not a morphism M(P); // now, a more involved example LIB "ncalg.lib"; def Usl2 = makeUsl2(); // this algebra is U(sl_2), generated by e,f,h setring Usl2; poly P = 4*e*f+h^2-2*h; // the central el-t of Usl2 poly Q = e^3*f-h^4; // some polynomial ring W1 = 0,(D,X),dp; def W2=nc_algebra(1,-1); setring W2; // this algebra is the opposite Weyl algebra map F = Usl2, -X, D*D*X, 2*D*X; F(P); // 0, because P is in the kernel of F F(Q); @c example @end smallexample @end table @c ref See @ref{fetch BR_PLURAL_BR}; @ref{ideal expressions BR_PLURAL_BR}; @ref{imap BR_PLURAL_BR}; @ref{map BR_PLURAL_BR}; @ref{ring BR_PLURAL_BR}. @c ref @c ------------------------------ @node map expressions BR_PLURAL_BR, map operations BR_PLURAL_BR, map declarations BR_PLURAL_BR, map BR_PLURAL_BR @subsection map expressions BR_PLURAL_BR @cindex map expressions BR_PLURAL_BR A map expression is: @enumerate @item an identifier of type map @item a function returning map @item a composition of maps using parentheses, e.g. @code{f(g)} @end enumerate @c ------------------------------ @node map operations BR_PLURAL_BR, map related functions BR_PLURAL_BR, map expressions BR_PLURAL_BR, map BR_PLURAL_BR @subsection map BR_PLURAL_BR operations @cindex map operations BR_PLURAL_BR @table @asis @item @code{( )} composition of maps. If, for example, @code{f} and @code{g} are maps, then @code{f(g)} is a map expression giving the composition @tex $f \circ g$ @end tex @ifinfo @code{f} @bullet{} @code{g} @end ifinfo of @code{f} and @code{g}, provided the target ring of @code{g} is the basering of @code{f}. @item map_expression @code{[} int_expressions @code{]} is a map entry (the image of the corresponding variable) @end table @*@strong{Example:} @smallexample @c example LIB "ncalg.lib"; def Usl2 = makeUsl2(); // this algebra is U(sl_2) setring Usl2; map F = Usl2, f, e, -h; // involutive endomorphism of U(sl_2) F; map G = F(F); G; poly p = (f+e*h)^2 + 3*h-e; p; F(p); G(p); (G(p) == p); // G is the identity @c example @end smallexample @c ------------------------------ @node map related functions BR_PLURAL_BR, , map operations BR_PLURAL_BR, map BR_PLURAL_BR @subsection map related functions BR_PLURAL_BR @cindex map related functions BR_PLURAL_BR @table @code @item fetch BR_PLURAL_BR the identity map between rings and qrings (see @ref{fetch BR_PLURAL_BR}) @item imap BR_PLURAL_BR a convenient map procedure for inclusions and projections of rings (see @ref{imap BR_PLURAL_BR}) @item preimage BR_PLURAL_BR preimage under a ring map (see @ref{preimage BR_PLURAL_BR}) @item subst substitute a ring variable (see @ref{subst BR_PLURAL_BR}) @end table @c --------------------------------------- @node module BR_PLURAL_BR, poly BR_PLURAL_BR, map BR_PLURAL_BR, Data types BR_PLURAL_BR @section module BR_PLURAL_BR @cindex module BR_PLURAL_BR Modules are @strong{left} submodules of a free module over the basering with basis @code{gen(1)}, @code{gen(2)}, @dots{}, @code{gen(n)} for some natural number @code{n}. @* They are represented by lists of vectors, which generate the left submodule. Like vectors, they can only be defined or accessed with respect to a basering. If @math{M} is a left submodule of @ifinfo R^n, @end ifinfo @tex $R^n$ @end tex (where @math{R} is the basering) generated by vectors @ifinfo v_1, @dots{}, v_k, then @end ifinfo @tex $v_1, \ldots, v_k$, then @end tex these generators may be considered as the generators of relations of @ifinfo R^n/M @end ifinfo @tex $R^n/M$ @end tex between the canonical generators @code{gen(1)},@dots{},@code{gen(n)}. Hence, any finitely generated @math{R}-module can be represented in @sc{Plural} by its module of relations. This is the so-called Coker-representation. @* The assignments @code{module M=v1,...,vk; matrix A=M;} create the presentation matrix of size @ifinfo n x k, @end ifinfo @tex $n \times k$, @end tex with the columns of A being the vectors @ifinfo v_1, @dots{}, v_k which generate M. @end ifinfo @tex $v_1, \ldots, v_k$ which generate $M$. @end tex @menu * module declarations BR_PLURAL_BR:: * module expressions BR_PLURAL_BR:: * module operations BR_PLURAL_BR:: * module related functions BR_PLURAL_BR:: @end menu @c ------------------------------ @node module declarations BR_PLURAL_BR, module expressions BR_PLURAL_BR, module BR_PLURAL_BR, module BR_PLURAL_BR @subsection module declarations BR_PLURAL_BR @cindex module declarations BR_PLURAL_BR @table @strong @item Syntax: @code{module} name @code{=} list_of_vector_expressions (which are interpreted as left generators of the module) @code{;} @*@code{module} name @code{=} module_expression @code{;} @item Purpose: defines a left module. @item Default: [0] @item Example: @smallexample @c example ring r=0,(x,y,z),(c,dp); matrix D[3][3]; D[1,2]=-z; D[1,3]=y; D[2,3]=x; def R=nc_algebra(1,D); // this algebra is U(so_3) setring R; vector s1 = [x2,y3,z]; vector s2 = [xy,1,0]; vector s3 = [0,x2-y2,z]; poly f = -x*y; module m = s1, s2-s1,f*(s3-s1); m; // show m in matrix format (columns generate m) print(m); @c example @end smallexample @end table @c ------------------------------ @node module expressions BR_PLURAL_BR, module operations BR_PLURAL_BR, module declarations BR_PLURAL_BR, module BR_PLURAL_BR @subsection module expressions BR_PLURAL_BR @cindex module expressions BR_PLURAL_BR A module expression is: @enumerate @item an identifier of type module @item a function returning module @item module expressions combined by the arithmetic operation @code{+} @item multiplication of a module expression with an ideal or a poly expression: @code{*} @item a type cast to module @end enumerate @c ------------------------------ @node module operations BR_PLURAL_BR, module related functions BR_PLURAL_BR, module expressions BR_PLURAL_BR, module BR_PLURAL_BR @subsection module operations BR_PLURAL_BR @cindex module operations BR_PLURAL_BR @table @asis @item @code{+} addition (concatenation of the generators and simplification) Note that ''-'' implicitely converts a module into a matrix; see below example. @item @code{*} right or left multiplication with number, ideal, or poly (but not `module` * `module`!) @item module_expression @code{[} int_expression @code{,} int_expression @code{]} is a module entry, where the first index indicates the row and the second the column @item module_expressions @code{[} int_expression @code{]} is a vector, where the index indicates the column (generator) @end table @*@strong{Example:} @smallexample @c example ring A=0,(x,y,z),Dp; matrix D[3][3]; D[1,2]=-z; D[1,3]=y; D[2,3]=x; // this algebra is U(so_3) def B=nc_algebra(1,D); setring B; module M = [x,y],[0,0,x*z]; module N = matrix((x+y-z)*M) - matrix(M*(x+y-z)); // no - for type module print(N); @c example @end smallexample @c ------------------------------ @node module related functions BR_PLURAL_BR, poly declarations BR_PLURAL_BR, module operations BR_PLURAL_BR, module BR_PLURAL_BR @subsection module related functions BR_PLURAL_BR @cindex module related functions BR_PLURAL_BR @table @code @item eliminate elimination of variables (see @ref{eliminate BR_PLURAL_BR}) @item freemodule the free module of given rank (see @ref{freemodule}) @item intersect module intersection (see @ref{intersect BR_PLURAL_BR}) @item kbase vector space basis of free module over the basering modulo the module of leading terms (see @ref{kbase BR_PLURAL_BR}) @item lead initial module (see @ref{lead}) @item lift lift-matrix (see @ref{lift BR_PLURAL_BR}) @item liftstd left Groebner basis and transformation matrix computation (see @ref{liftstd BR_PLURAL_BR}) @item modulo represents @tex $(h1+h2)/h1 \cong h2/(h1 \cap h2)$ @end tex @ifinfo (h1+h2)/h1=h2/(h1 intersect h2) @end ifinfo (see @ref{modulo BR_PLURAL_BR}) @item mres minimal free resolution of a module and a minimal set of generators of the given ideal module (see @ref{mres BR_PLURAL_BR}) @item ncols number of columns (see @ref{ncols}) @item nres computes a free resolution of an ideal resp.@: module M which is minimized from the second free module on (see @ref{nres BR_PLURAL_BR}) @item nrows number of rows (see @ref{nrows}) @item oppose creates an opposite module of a given module from the given ring into a basering (see @ref{oppose}) @item print nice print format (see @ref{print}) @item prune minimize the embedding into a free module (see @ref{prune}) @item quotient module quotient (see @ref{quotient BR_PLURAL_BR}) @item reduce left normal form with respect to a left Groebner basis (see @ref{reduce BR_PLURAL_BR}) @item simplify simplify a set of vectors (see @ref{simplify}) @item size number of non-zero generators (see @ref{size}) @item std left Groebner basis computation (see @ref{std BR_PLURAL_BR}) @item subst substitute a ring variable (see @ref{subst BR_PLURAL_BR}) @item syz computation of the first syzygy module (see @ref{syz BR_PLURAL_BR}) @item vdim vector space dimension of free module over the basering modulo module of leading terms (see @ref{vdim BR_PLURAL_BR}) @end table @c --------------------------------------- @node poly BR_PLURAL_BR, qring BR_PLURAL_BR, module BR_PLURAL_BR, Data types BR_PLURAL_BR @section poly BR_PLURAL_BR @cindex poly BR_PLURAL_BR Polynomials and vectors are the basic data for all main algorithms in @sc{Plural}. Polynomials consist of finitely many terms (coefficient*monomial) which are combined by the usual polynomial operations (see @ref{poly expressions BR_PLURAL_BR}). Polynomials can only be defined or accessed with respect to a basering which determines the coefficient type, the names of the indeterminants and the monomial ordering. @*@strong{Example:} @smallexample @c example ring r=32003,(x,y,z),dp; poly f=x3+y5+z2; @c example @end smallexample @strong{Remark:} Remember the conventions on polynomial multiplication we follow (@code{*}-multiplication in @ref{PLURAL}). @menu * poly declarations BR_PLURAL_BR:: * poly expressions BR_PLURAL_BR:: * poly operations BR_PLURAL_BR:: * poly related functions BR_PLURAL_BR:: @end menu @c ------------------------------ @node poly declarations BR_PLURAL_BR, poly expressions BR_PLURAL_BR, module related functions BR_PLURAL_BR, poly BR_PLURAL_BR @subsection poly declarations BR_PLURAL_BR @cindex poly declarations BR_PLURAL_BR @table @strong @item Syntax: @code{poly} name @code{=} poly_expression @code{;} @item Purpose: defines a polynomial. @item Default: 0 @item Example: @smallexample @c example ring r = 32003,(x,y,z),dp; def R=nc_algebra(-1,1); setring R; // ring of some differential-like operators R; yx; // not correct input y*x; // correct input poly s1 = x3y2+151x5y+186xy6+169y9; poly s2 = 1*x^2*y^2*z^2+3z8; poly s3 = 5/4x4y2+4/5*x*y^5+2x2y2z3+y7+11x10; int a,b,c,t=37,5,4,1; poly f=3*x^a+x*y^(b+c)+t*x^a*y^b*z^c; f; short = 0; f; @c example @end smallexample @end table @c ---------------------------- @node poly expressions BR_PLURAL_BR, poly operations BR_PLURAL_BR, poly declarations BR_PLURAL_BR, poly BR_PLURAL_BR @subsection poly expressions BR_PLURAL_BR @cindex poly expressions BR_PLURAL_BR A polynomial expression is (optional parts in square brackets): @enumerate @item a monomial (there are NO spaces allowed inside a monomial) @smallexample [coefficient] ring_variable [exponent] [ring_variable [exponent] @dots{}] @end smallexample monomials which contain an indexed ring variable must be built from @code{ring_variable} and @code{coefficient} with the operations @code{*} and @code{^} @item an identifier of type poly @item a function returning poly @item polynomial expressions combined by the arithmetic operations @code{+}, @code{-}, @code{*}, @code{/}, or @code{^}. @item a type cast to poly @end enumerate @strong{Example:} @smallexample @c example ring r=0,(x,y),dp; def R=nc_algebra(1,1); // make it a Weyl algebra setring R; R; yx; // not correct input y*x; // correct input poly f = 10x2*y3 + 2y2*x^2 - 2*x*y + y - x + 2; lead(f); leadmonom(f); simplify(f,1); // normalize leading coefficient cleardenom(f); @c example @end smallexample @c ------------------------------ @node poly operations BR_PLURAL_BR, poly related functions BR_PLURAL_BR, poly expressions BR_PLURAL_BR, poly BR_PLURAL_BR @subsection poly operations BR_PLURAL_BR @cindex poly operations BR_PLURAL_BR @table @asis @item @code{+} addition @item @code{-} negation or subtraction @item @code{*} multiplication @item @code{/} commutative division by a monomial, non divisible terms yield 0 @item @code{^}, @code{**} power by a positive integer @item @code{<}, @code{<=}, @code{>}, @code{>=}, @code{==}, @code{<>} comparison (of leading monomials w.r.t. monomial ordering) @item poly_expression @code{[} intvec_expression @code{]} the sum of monomials at the indicated places w.r.t. the monomial ordering @end table @c ------------------------------ @node poly related functions BR_PLURAL_BR, , poly operations BR_PLURAL_BR, poly BR_PLURAL_BR @subsection poly related functions BR_PLURAL_BR @cindex poly related functions BR_PLURAL_BR @table @code @item bracket computes the Lie bracket of two polinomials (see @ref{bracket}) @item lead leading term (see @ref{lead}) @item leadcoef coefficient of the leading term (see @ref{leadcoef}) @item leadexp the exponent vector of the leading monomial (see @ref{leadexp}) @item leadmonom leading monomial (see @ref{leadmonom}) @item oppose creates an opposite polynomial of a given polynomial from the given ring into a basering (see @ref{oppose}) @item reduce left normal form with respect to a left Groebner basis (see @ref{reduce BR_PLURAL_BR}) @item simplify normalize a polynomial (see @ref{simplify}) @item size number of monomials (see @ref{size}) @item subst substitute a ring variable (see @ref{subst BR_PLURAL_BR}) @item var the indicated variable of the ring (see @ref{var}) @end table @c --------------------------------------- @node qring BR_PLURAL_BR, resolution BR_PLURAL_BR, poly BR_PLURAL_BR, Data types BR_PLURAL_BR @section qring BR_PLURAL_BR @cindex qring BR_PLURAL_BR @sc{Plural} offers the possibility to compute within factor-rings modulo two-sided ideals. The ideal has to be given as a two-sided Groebner basis (see @ref{twostd} command). @* For a detailed description of the concept of rings and quotient rings see @ifclear singularmanual in @sc{Singular} manual section Rings and orderings. @end ifclear @ifset singularmanual @ref{Rings and orderings}. @end ifset @menu * qring declaration BR_PLURAL_BR:: * qring related functions BR_PLURAL_BR:: @end menu @strong{Note:} we highly recommend to turn on @code{option(redSB); option(redTail);} while computing in qrings. Otherwise results may have a difficult interpretation. @c --------------------------------------- @node qring declaration BR_PLURAL_BR, qring related functions BR_PLURAL_BR, qring BR_PLURAL_BR, qring BR_PLURAL_BR @subsection qring declaration BR_PLURAL_BR @cindex qring declaration BR_PLURAL_BR @table @strong @item Syntax: @code{qring} name @code{=} ideal_expression @code{;} @item Default: none @item Purpose: declares a quotient ring as the basering modulo an @code{ideal_expression} and sets it as current basering. @item Note: reports error if an ideal is not a two-sided Groebner basis. @item Example: @smallexample @c example error ring r=0,(z,u,v,w),dp; def R=nc_algebra(-1,0); // an anticommutative algebra setring R; option(redSB); option(redTail); ideal i=z^2,u^2,v^2,w^2, zuv-w; qring Q = i; // incorrect call produces error kill Q; setring R; // go back to the ring R qring q=twostd(i); // now it is an exterior algebra modulo q; poly k = (v-u)*(zv+u-w); k; // the output is not yet totally reduced poly ek=reduce(k,std(0)); ek; // the reduced form @c example @end smallexample @end table @c --------------------------------------- @node qring related functions BR_PLURAL_BR, , qring declaration BR_PLURAL_BR, qring BR_PLURAL_BR @subsection qring related functions BR_PLURAL_BR @cindex qring related functions BR_PLURAL_BR @table @code @item envelope enveloping ring (see @ref{envelope}) @item nvars number of ring variables (see @ref{nvars}) @item opposite opposite ring (see @ref{opposite}) @item setring set a new basering (see @ref{setring}) @end table @c --------------------------------------- @node resolution BR_PLURAL_BR, ring BR_PLURAL_BR, qring BR_PLURAL_BR, Data types BR_PLURAL_BR @section resolution BR_PLURAL_BR @cindex resolution BR_PLURAL_BR The type resolution is intended as an intermediate representation which internally retains additional information obtained during computation of resolutions. It furthermore enables the use of partial results to compute, for example, Betti numbers or minimal resolutions. Like ideals and modules, a resolution can only be defined w.r.t.@: a basering. @strong{Note:} to access the elements of a resolution, it has to be assigned to a list. This assignment also completes computations and may therefore take time, (resp.@: an access directly with the brackets @code{[ , ]} causes implicitly a cast to a list). @menu * resolution declarations BR_PLURAL_BR:: * resolution expressions BR_PLURAL_BR:: * resolution related functions BR_PLURAL_BR:: @end menu @c --------------------------------------- @node resolution declarations BR_PLURAL_BR, resolution expressions BR_PLURAL_BR, resolution BR_PLURAL_BR, resolution BR_PLURAL_BR @subsection resolution declarations BR_PLURAL_BR @cindex resolution declarations BR_PLURAL_BR @table @strong @item Syntax: @code{resolution} name @code{=} resolution_expression @code{;} @item Purpose: defines a resolution. @item Default: none @item Example: @smallexample @c example ring r=0,(x,y,z),dp; matrix D[3][3]; D[1,2]=z; def R=nc_algebra(1,D); // it is a Heisenberg algebra setring R; ideal i=z2+z,x+y; resolution re=nres(i,0); re; list l = re; l; print(matrix(l[2])); print(module(transpose(matrix(l[2]))*transpose(matrix(l[1])))); // check that product is zero @c example @end smallexample @end table @c ------------------------------ @node resolution expressions BR_PLURAL_BR, resolution related functions BR_PLURAL_BR, resolution declarations BR_PLURAL_BR, resolution BR_PLURAL_BR @subsection resolution expressions BR_PLURAL_BR @cindex resolution expressions BR_PLURAL_BR A resolution expression is: @enumerate @item an identifier of type resolution @item a function returning a resolution @item a type cast to resolution from a list of ideals, resp.@: modules. @end enumerate @c ------------------------------ @node resolution related functions BR_PLURAL_BR, , resolution expressions BR_PLURAL_BR, resolution BR_PLURAL_BR @subsection resolution related functions BR_PLURAL_BR @cindex resolution related functions BR_PLURAL_BR @table @code @item betti Betti numbers of a resolution (see @ref{betti BR_PLURAL_BR}) @item minres minimizes a free resolution (see @ref{minres BR_PLURAL_BR}) @item mres computes a minimal free resolution of an ideal resp. module and a minimal set of generators of the given ideal resp. module (see @ref{mres BR_PLURAL_BR}) @item nres computes a free resolution of an ideal resp.@: module M which is minimized from the second module on (see @ref{nres BR_PLURAL_BR}) @c @item res @c free resolution of an ideal resp.@: module but not changing the given ideal resp.@: module(see @ref{res BR_PLURAL_BR}) @end table @c --------------------------------------- @node ring BR_PLURAL_BR, , resolution BR_PLURAL_BR, Data types BR_PLURAL_BR @section ring BR_PLURAL_BR @cindex ring BR_PLURAL_BR Rings are used to describe properties of polynomials, ideals etc. Almost all computations in @sc{Plural} require a basering. For a detailed description of the concept of rings see @ifset singularmanual @ref{Rings and orderings}. @end ifset @ifclear singularmanual @sc{Singular} manual (Chapter: General Concepts, Section: Rings and orderings). @end ifclear @*@strong{Note:} @sc{Plural} usually works with global orderings (@pxref{PLURAL}) but one can use certain local once when graded commutative rings are being used. @menu * ring declarations BR_PLURAL_BR:: * ring operations BR_PLURAL_BR:: * ring related functions BR_PLURAL_BR:: @end menu @c --------------------------------------- @node ring declarations BR_PLURAL_BR, ring operations BR_PLURAL_BR, ring BR_PLURAL_BR, ring BR_PLURAL_BR @subsection ring declarations BR_PLURAL_BR @cindex ring declarations BR_PLURAL_BR @table @strong @item Syntax: @code{ring} name @code{= (} coefficient_field @code{),} @code{(} names_of_ring_variables @code{),} @code{(} ordering @code{);} @item Default: @code{32003,(x,y,z),(dp,C);} @item Purpose: declares a ring and sets it as the actual basering. @end table The coefficient_field is given by one of the following: @enumerate @item a non-negative int_expression less or equal 2147483647. @item an expression_list of an int_expression and one or more names. @item the name @code{real}. @item an expression_list of the name @code{real} and an int_expression. @item an expression_list of the name @code{complex}, an optional int_expression and a name. @end enumerate 'names_of_ring_variables' must be a list of names or indexed names. 'ordering' is a list of block orderings where each block ordering is either @enumerate @item @code{lp}, @code{dp}, @code{Dp}, optionally followed by a size parameter in parentheses. @item @code{wp}, @code{Wp}, or @code{a} followed by a weight vector given as an intvec_expression in parentheses. @item @code{M} followed by an intmat_expression in parentheses. @item @code{c} or @code{C}. @end enumerate As long as all non-commuting variables are global, any ordering may be used. In graded commutative algebras, one may also use @code{ls, ds, Ds, ws}, and @code{Ws}. If one of coefficient_field, names_of_ring_variables, and ordering consists of only one entry, the parentheses around this entry may be omitted. @strong{In order to create a non-commutative structure over a commutative ring, use} @ref{nc_algebra}. @c --------------------------------------- @node ring operations BR_PLURAL_BR, ring related functions BR_PLURAL_BR, ring declarations BR_PLURAL_BR, ring BR_PLURAL_BR @subsection ring operations BR_PLURAL_BR @cindex ring operations BR_PLURAL_BR @table @asis @item @code{+} construct a tensor product @ifinfo C = A\otimes_k B @end ifinfo @tex $C = A\otimes_{\bf{K} } B$ @end tex of two @ifinfo R-algebras A and B @end ifinfo @tex $G$-algebras $A$ and $B$ @end tex over the ground field. Let, e.g., @ifinfo A=k1, and B=k2 @end ifinfo @tex $A= k_1 \langle x_1, \ldots ,x_n \mid$ $\{ x_j x_i=c_{ij} \cdot x_i x_j + d_{ij}\}, 1 \leq i @end ifinfo @tex $C = K \langle x_1, \ldots ,x_n, y_1, \ldots ,y_m \mid$ $\{ x_j x_i=c_{ij} \cdot x_i x_j + d_{ij}, 1 \leq i ); @end format Note, that both @strong{Control structures} and @strong{System variables} of @sc{Plural} are the same as of @sc{Singular} (see @ref{Control structures}, @ref{System variables}). @menu * betti BR_PLURAL_BR:: * bracket:: * dim BR_PLURAL_BR:: * division BR_PLURAL_BR:: * eliminate BR_PLURAL_BR:: * envelope:: * fetch BR_PLURAL_BR:: * imap BR_PLURAL_BR:: * intersect BR_PLURAL_BR:: * kbase BR_PLURAL_BR:: * lift BR_PLURAL_BR:: * liftstd BR_PLURAL_BR:: * minres BR_PLURAL_BR:: * modulo BR_PLURAL_BR:: * mres BR_PLURAL_BR:: * nc_algebra:: * ncalgebra:: * nres BR_PLURAL_BR:: * oppose:: * opposite:: * preimage BR_PLURAL_BR:: * quotient BR_PLURAL_BR:: * reduce BR_PLURAL_BR:: * ringlist BR_PLURAL_BR:: * slimgb BR_PLURAL_BR:: * std BR_PLURAL_BR:: * subst BR_PLURAL_BR:: * syz BR_PLURAL_BR:: * twostd:: * vdim BR_PLURAL_BR:: @end menu @c ----------------------------- @node betti BR_PLURAL_BR, bracket, Functions BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection betti BR_PLURAL_BR @cindex betti BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{betti (} list_expression @code{)} @*@code{betti (} resolution_expression @code{)} @*@code{betti (} list_expression @code{,} int_expression @code{)} @*@code{betti (} resolution_expression @code{,} int_expression @code{)} @item @strong{Type:} intmat @item @strong{Note:} in the non-commutative case, computing Betti numbers makes sense only if the basering @math{R} has homogeneous relations. The output of the command can be pretty-printed using @code{print( , ''betti'')}, i.e., with ''betti'' as second argument; see below example. @item @strong{Purpose:} with 1 argument: computes the graded Betti numbers of a minimal resolution of @tex $R^n/M$, if $R$ denotes the basering and $M$ a homogeneous submodule of $R^n$ and the argument represents a resolution of $R^n/M$. @end tex @iftex @* @end iftex @tex The entry d of the intmat at place (i, j) is the minimal number of generators in degree i+j of the j-th syzygy module (= module of relations) of $R^n/M$ (the 0th (resp.\ 1st) syzygy module of $R^n/M$ is $R^n$ (resp.\ $M$)). @end tex @ifinfo R^n/M, if R denotes the basering and M a homogeneous submodule of R^n and the argument represents a resolution of R^n/M: @*The entry d of the intmat at place (i,j) is the minimal number of generators in degree i+j of the j-th syzygy module @c (= module of relations) of R^n/M (the 0th (resp.@: 1st) syzygy module of R^n/M is R^n (resp.@: M)). @end ifinfo The argument is considered to be the result of a @code{mres} or @code{nres} command. This implies that a zero is only allowed (and counted) as a generator in the first module. @*For the computation @code{betti} uses only the initial monomials. This could lead to confusing results for a non-homogeneous input. If the optional second argument is non-zero, the Betti numbers will be minimized. @c The optional second argument is a switch for the minimization of the Betti @c numbers. If it is 0 then the Betti numbers correspond exactly to the input - @c otherwise the command is identical to the one-argument form. @item @strong{Example:} @smallexample @c example int i;int N=2; ring r=0,(x(1..N),d(1..N),q(1..N)),Dp; matrix D[3*N][3*N]; for (i=1;i<=N;i++) { D[i,N+i]=q(i)^2; } def W=nc_algebra(1,D); setring W; // this algebra is a kind of homogenized Weyl algebra W; ideal I = x(1),x(2),d(1),d(2),q(1),q(2); option(redSB); option(redTail); resolution R = mres(I,0); // thus R will be the full length minimal resolution print(betti(R),"betti"); @c example @end smallexample @end table @c ----------------------------- @node bracket, dim BR_PLURAL_BR, betti BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection bracket @cindex bracket @table @code @item @strong{Syntax:} @code{bracket (} poly_expression, poly_expression @code{)} @item @strong{Type:} poly @item @strong{Purpose:} Computes the Lie bracket @code{[p,q]=pq-qp} of the first polynomial with the second. Uses special routines, based on the Leibniz rule. @item @strong{Example:} @smallexample @c example ring r=(0,Q),(x,y,z),Dp; minpoly=Q^2-Q+1; matrix C[3][3]; matrix D[3][3]; C[1,2]=Q2; C[1,3]=1/Q2; C[2,3]=Q2; D[1,2]=-Q*z; D[1,3]=1/Q*y; D[2,3]=-Q*x; def R=nc_algebra(C,D); setring R; R; // this is a quantum deformation of U(so_3), // where Q is a 6th root of unity poly p=Q^4*x2+y2+Q^4*z2+Q*(1-Q^4)*x*y*z; // p is the central element of the algebra p=p^3; // any power of a central element is central poly q=(x+Q*y+Q^2*z)^4; // take q to be some big noncentral element size(q); // check how many monomials are in big polynomial q bracket(p,q); // check p*q=q*p // a more common behaviour of the bracket follows: bracket(x+Q*y+Q^2*z,z); @c example @end smallexample @end table @c ----------------------------- @node dim BR_PLURAL_BR, division BR_PLURAL_BR, bracket, Functions BR_PLURAL_BR @subsection dim BR_PLURAL_BR @cindex dim BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{dim (} ideal_expression @code{)} @*@code{dim (} module_expression @code{)} @item @strong{Type:} int @item @strong{Purpose:} computes the Gelfand-Kirillov dimension of the ideal, resp.@: module, generated by the leading monomials of the given generators of the ideal, resp.@: module. This is also the dimension of the ideal resp. submodule, if it is represented by a left Groebner basis. @item @strong{Note:} The dimension of a submodule of a free module is defined to be the Gelfand-Kirillov dimension of the left module with the presentation via given submodule. @* The computed Gelfand-Kirillov dimension is taken relative to the ground field. In order to compute the complete Gelfand-Kirillov dimension, one has to add the transcendence degree of the ground field. @item @strong{Example:} @smallexample @c example ring r=0,(x,y,Dx,Dy),dp; matrix M[4][4]; M[1,3]=1;M[2,4]=1; def R = nc_algebra(1,M); // 2nd Weyl algebra setring R; dim(std(0)); // the GK dimension of the ring itself ideal I=x*Dy^2-2*y*Dy^2+2*Dy, Dx^3+3*Dy^2; dim(std(I)); // the GK dimension of the module R/I module T = (x*Dx -2)*gen(1), Dx^3*gen(1), (y*Dy +3)*gen(2); dim(std(T)); // the GK dimension of the module R^2/T @c example @end smallexample @end table @c ref See @ref{ideal}; @ref{module}; @ref{std}; @ref{vdim}. @c ref @c ----------------------------- @node division BR_PLURAL_BR, eliminate BR_PLURAL_BR, dim BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection division BR_PLURAL_BR @cindex division BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{division (} ideal_expression@code{,} ideal_expression @code{)} @*@code{division (} module_expression@code{,} module_expression @code{)} @*@code{division (} ideal_expression@code{,} ideal_expression@code{,} int_expression @code{)} @*@code{division (} module_expression@code{,} module_expression@code{,} int_expression @code{)} @*@code{division (} ideal_expression@code{,} ideal_expression@code{,} int_expression@code{,} intvec_expression @code{)} @*@code{division (} module_expression@code{,} module_expression@code{,} int_expression@code{,} @* intvec_expression @code{)} @item @strong{Type:} list @item @strong{Purpose:} @code{division} computes a left division with remainder. For two left ideals resp.@: modules @code{M} (first argument) and @code{N} (second argument), it returns a list @code{T,R,U} where @code{T} is a matrix, @code{R} is a left ideal resp. a module, and @code{U} is a diagonal matrix of units such that @code{transpose(U)*transpose(matrix(M))=transpose(T)*transpose(matrix(N)) + transpose(matrix(R))}. From this data one gets a left standard representation for the left normal form @code{R} of @code{M} with respect to a left Groebner basis of @code{N}. @code{division} uses different algorithms depending on whether @code{N} is represented by a Groebner basis. For a GR-algebra, the matrix @code{U} is the identity matrix. A matrix @code{T} as above is also computed by @code{lift}. @*For additional arguments @code{n} (third argument) and @code{w} (fourth argument), @code{division} returns a list @code{T,R} as above such that @code{transpose(matrix(M))=transpose(T)*transpose(matrix(N)) + transpose(matrix(R))} is a left standard representation for the left normal form @code{R} of @code{M} with respect to @code{N} up to weighted degree @code{n} with respect to the weight vector @code{w}. The weighted degree of @code{T} and @code{R} respect to @code{w} is at most @code{n}. If the weight vector @code{w} is not given, @code{division} uses the standard weight vector @code{w=1,...,1}. @item @strong{Example:} @smallexample @c example LIB "dmod.lib"; ring r = 0,(x,y),dp; poly f = x^3+xy; def S = Sannfs(f); setring S; // compute the annihilator of f^s LD; // is not a Groebner basis yet! poly f = imap(r,f); poly P = f*Dx-s*diff(f,x); division(P,LD); // so P is in the ideal via the cofactors in _[1] ideal I = LD, f; // consider a bigger ideal list L = division(s^2, I); // the normal form is -2s-1 L; // now we show that the formula above holds matrix M[1][1] = s^2; matrix N = matrix(I); matrix T = matrix(L[1]); matrix R = matrix(L[2]); matrix U = matrix(L[3]); // the formula must return zero: transpose(U)*transpose(M) - transpose(T)*transpose(N) - transpose(R); @c example @end smallexample @end table @c ref See @ref{ideal}; @ref{lift}; @ref{module}; @ref{poly}; @ref{vector}. @c ref @c --------------------------------------- @node eliminate BR_PLURAL_BR, envelope, division BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection eliminate BR_PLURAL_BR @cindex eliminate BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{eliminate (} ideal_expression@code{,} product_of_ring_variables@code{)} @*@code{eliminate (} module_expression@code{,} product_of_ring_variables@code{)} @item @strong{Type:} the same as the type of the first argument @item @strong{Purpose:} eliminates variables occurring as factors of the second argument from an ideal (resp.@: a submodule of a free module), by intersecting it (resp. each component of the submodule) with the subring not containing these variables. @item @strong{Note:} @code{eliminate} neither needs a special ordering on the basering nor a Groebner basis as input. Moreover, @code{eliminate} does not work in non-commutative quotients. @item @strong{Remark:} in a non-commutative algebra, not every subset of a set of variables generates a proper subalgebra. But if it is so, there may be cases, when no elimination is possible. In these situations error messages will be reported. @item @strong{Example:} @smallexample @c example error ring r=0,(e,f,h,a),Dp; matrix d[4][4]; d[1,2]=-h; d[1,3]=2*e; d[2,3]=-2*f; def R=nc_algebra(1,d); setring R; // this algebra is U(sl_2), tensored with K[a] over K option(redSB); option(redTail); poly p = 4*e*f+h^2-2*h - a; // p is a central element with parameter ideal I = e^3, f^3, h^3-4*h, p; // take this ideal // and intersect I with the ring K[a] ideal J = eliminate(I,e*f*h); // if we want substitute 'a' with a value, // it has to be a root of this polynomial J; // now we try to eliminate h, // that is we intersect I with the subalgebra S, // generated by e and f. // But S is not closed in itself, since f*e-e*f=-h ! // the next command will definitely produce an error eliminate(I,h); // since a commutes with e,f,h, we can eliminate it: eliminate(I,a); @c example @end smallexample @end table @c ref See @ref{ideal BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}; @ref{std BR_PLURAL_BR}. @c ref @c --------------------------------------- @node envelope, fetch BR_PLURAL_BR, eliminate BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection envelope @cindex envelope @table @code @item @strong{Syntax:} @code{envelope (} ring_name @code{)} @item @strong{Type:} ring @item @strong{Purpose:} creates an enveloping algebra of a given algebra, that is @ifinfo A_env = A tensor A_opp, where A_opp is the opposite algebra of A. @end ifinfo @tex $A^{env} = A \otimes_K A^{opp}$, where $A^{opp}$ is the opposite algebra of $A$. @end tex @item @strong{Remark:} You have to activate the ring with the @code{setring} command. For the presentation, see explanation of @code{opposite} in @ref{opposite}. @smallexample @c example LIB "ncalg.lib"; def A = makeUsl2(); setring A; A; def Aenv = envelope(A); setring Aenv; Aenv; @c example @end smallexample @end table @c ref See @ref{oppose}; @ref{opposite}. @c ref @c --------------------------------------- @node fetch BR_PLURAL_BR, imap BR_PLURAL_BR, envelope, Functions BR_PLURAL_BR @subsection fetch BR_PLURAL_BR @cindex fetch BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{fetch (} ring_name@code{,} name @code{)} @item @strong{Type:} number, poly, vector, ideal, module, matrix or list (the same type as the second argument) @item @strong{Purpose:} maps objects between rings. @code{fetch} is the identity map between rings and qrings, the i-th variable of the source ring is mapped to the i-th variable of the basering. The coefficient fields must be compatible. (See @ref{map BR_PLURAL_BR} for a description of possible mappings between different ground fields). @*@code{fetch} offers a convenient way to change variable names or orderings, or to map objects from a ring to a quotient ring of that ring or vice versa. @item @strong{Note:} Compared with @code{imap}, @code{fetch} uses the position of the ring variables, not their names. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def Usl2 = makeUsl2(); // this algebra is U(sl_2) setring Usl2; option(redSB); option(redTail); poly C = 4*e*f+h^2-2*h; // the central element of Usl2 ideal I = e^3,f^3,h^3-4*h; ideal J = twostd(I); // print a compact presentation of J: print(matrix(ideal(J[1..5]))); // first 5 generators print(matrix(ideal(J[6..size(J)]))); // last generators ideal QC = twostd(C-8); qring Q = QC; ideal QJ = fetch(Usl2,J); QJ = std(QJ); // thus QJ is the image of I in the factor-algebra QC print(matrix(QJ)); // print QJ compactly @c example @end smallexample @end table @c ref See @ref{imap BR_PLURAL_BR}; @ref{map BR_PLURAL_BR}; @ref{qring BR_PLURAL_BR}; @ref{ring BR_PLURAL_BR}. @c ref @c --------------------------------------- @node imap BR_PLURAL_BR, intersect BR_PLURAL_BR, fetch BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection imap BR_PLURAL_BR @cindex imap BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{imap (} ring_name@code{,} name @code{)} @item @strong{Type:} number, poly, vector, ideal, module, matrix or list (the same type as the second argument) @item @strong{Purpose:} identity map on common subrings. @code{imap} is the map between rings and qrings with compatible ground fields which is the identity on variables and parameters of the same name and 0 otherwise. (See @ref{map BR_PLURAL_BR} for a description of possible mappings between different ground fields). Useful for mappings from a homogenized ring to the original ring or for mappings from/to rings with/without parameters. Compared with @code{fetch}, @code{imap} uses the names of variables and parameters. @strong{Unlike @code{map} and @code{fetch}, @code{imap} can map parameters to variables.} @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; ring ABP=0,(p4,p5,a,b),dp; // a commutative ring def Usl3 = makeUsl(3); def BIG = Usl3+ABP; setring BIG; poly P4 = 3*x(1)*y(1)+3*x(2)*y(2)+3*x(3)*y(3); P4 = P4 +h(1)^2+h(1)*h(2)+h(2)^2-3*h(1)-3*h(2); // P4 is a central element of Usl3 of degree 2 poly P5 = 4*x(1)*y(1) + h(1)^2 - 2*h(1); // P5 is a central element of the subalgebra of U(sl_3), // generated by x(1),y(1),h(1) ideal J = x(1),x(2),h(1)-a,h(2)-b; // we are interested in the module U(sl_3)/J, // which depends on parameters a,b ideal I = p4-P4, p5-P5; ideal K = I, J; ideal E = eliminate(K,x(1)*x(2)*x(3)*y(1)*y(2)*y(3)*h(1)*h(2)); E; // this is the ideal of central characters in ABP // what are the characters on nonzero a,b? ring abP = (0,a,b),(p4,p5),dp; ideal abE = imap(BIG, E); option(redSB); option(redTail); abE = std(abE); // here come characters (indeed, we have only one) // that is a maximal ideal in K[p4,p5] abE; @c example @end smallexample @end table @c ref See @ref{fetch BR_PLURAL_BR}; @ref{map BR_PLURAL_BR}; @ref{qring BR_PLURAL_BR}; @ref{ring BR_PLURAL_BR}. @c ref @c ------------------------------------------------ @node intersect BR_PLURAL_BR, kbase BR_PLURAL_BR, imap BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection intersect BR_PLURAL_BR @cindex intersect BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{intersect (}expression_list of ideal_expression @code{)} @*@code{intersect (}expression_list of module_expression @code{)} @item @strong{Type:} ideal, resp. module @item @strong{Purpose:} computes the intersection of ideals, resp. modules. @item @strong{Example:} @c // 1. from [BGV], p.213, Ex.2.5. answer: [0,xy^2],[y^2,-xy] @c // 2. from [BGV], p.148, Ex.3.8 @smallexample @c example ring r=0,(x,y),dp; def R=nc_algebra(-1,0); //anti-commutative algebra setring R; module M=[x,x],[y,0]; module N=[0,y^2],[y,x]; option(redSB); module Res; Res=intersect(M,N); print(Res); kill r,R; //-------------------------------- LIB "ncalg.lib"; ring r=0,(x,d),dp; def RR=Weyl(); // make r into Weyl algebra setring RR; ideal I = x+d^2; ideal J = d-1; ideal H = intersect(I,J); H; @c example @end smallexample @end table @c ------------------------------------------------ @node kbase BR_PLURAL_BR, lift BR_PLURAL_BR, intersect BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection kbase BR_PLURAL_BR @cindex kbase BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{kbase (} ideal_expression @code{)} @*@code{kbase (} module_expression @code{)} @*@code{kbase (} ideal_expression@code{,} int_expression@code{)} @*@code{kbase (} module_expression@code{,} int_expression@code{)} @item @strong{Type:} the same as the input type of the first argument @item @strong{Purpose:} with one argument: computes the vector space basis of the factor-module that equals ring (resp. free module) modulo the ideal (resp. submodule), generated by the initial terms of the given generators. @* If the factor-module is not of finite dimension, -1 is returned. If the generators form a Groebner basis, this is the same as the vector space basis of the factor-module. when called with two arguments: computes the part of a vector space basis of the respective quotient with degree (of monomials) equal to the second argument. Here, the quotient does not need to be finite dimensional. @item @strong{Note:} in the non-commutative case, a ring modulo an ideal has a ring stucture if and only if the ideal is two-sided. @code{kbase} respects module-grading given by the @code{isHomog} attribute of input modules. @item @strong{Example:} @smallexample @c example ring r=0,(x,y,z),dp; matrix d[3][3]; d[1,2]=-z; d[1,3]=2x; d[2,3]=-2y; def R=nc_algebra(1,d); // this algebra is U(sl_2) setring R; ideal i=x2,y2,z2-1; i=std(i); print(matrix(i)); // print a compact presentation of i kbase(i); vdim(i); ideal j=x,z-1; j=std(j); kbase(j,3); @c example @end smallexample @end table @c ref See @ref{ideal BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}; @ref{vdim BR_PLURAL_BR}. @c ref @c ------------------------------------------------- @node lift BR_PLURAL_BR, liftstd BR_PLURAL_BR, kbase BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection lift BR_PLURAL_BR @cindex lift BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{lift (} ideal_expression@code{,} subideal_expression @code{)} @*@code{lift (} module_expression@code{,} submodule_expression @code{)} @item @strong{Type:} matrix @item @strong{Purpose:} computes the (left) transformation matrix which expresses the (left) generators of a submodule in terms of the (left) generators of a module. Uses different algorithms for modules which are (resp.@: are not) represented by a Groebner basis. @* More precisely, if @code{m} is the module, @code{sm} the submodule, and @code{T} the transformation matrix returned by lift, then @code{transpose(matrix(sm)) = transpose(T)*transpose(matrix(m))}. If @code{m} and @code{sm} are ideals, @code{ideal(sm) = ideal(transpose(T)*transpose(matrix(m)))}. @item @strong{Note:} Gives a warning if @code{sm} is not a submodule. @item @strong{Example:} @smallexample @c example ring r = (0,a),(e,f,h),(c,dp); matrix D[3][3]; D[1,2]=-h; D[1,3]=2*e; D[2,3]=-2*f; def R=nc_algebra(1,D); // this algebra is a parametric U(sl_2) setring R; ideal i = e,h-a; // consider this parametric ideal i = std(i); print(matrix(i)); // print a compact presentation of i poly Z = 4*e*f+h^2-2*h; // a central element Z = Z - NF(Z,i); // a central character ideal j = std(Z); j; matrix T = lift(i,j); print(T); ideal tj = ideal(transpose(T)*transpose(matrix(i))); size(ideal(matrix(j)-matrix(tj))); // test for 0 @c example @end smallexample @end table @c ref See @ref{liftstd BR_PLURAL_BR}; @ref{ideal BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}. @c ref @c ----------------------------------------- @node liftstd BR_PLURAL_BR, minres BR_PLURAL_BR, lift BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection liftstd BR_PLURAL_BR @cindex liftstd BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{liftstd (} ideal_expression@code{,} matrix_name @code{)} @*@code{liftstd (} module_expression@code{,} matrix_name @code{)} @*@code{liftstd (} ideal_expression@code{,} matrix_name@code{,} module_name @code{)} @*@code{liftstd (} module_expression@code{,} matrix_name@code{,} module_name @code{)} @item @strong{Type:} ideal or module @item @strong{Purpose:} returns a left Groebner basis of an ideal or module and a left transformation matrix from the given ideal, resp.@: module, to the Groebner basis. @*That is, if @code{m} is the ideal or module, @code{sm} is the left Groebner basis of @code{m}, returned by @code{liftstd}, and @code{T} is a left transformation matrix, then @code{sm=module(transpose(transpose(T)*transpose(matrix(m))))}. @* If @code{m} is an ideal, @code{sm=ideal(transpose(T)*transpose(matrix(m)))}. @* In an optional third argument the left syzygy module will be returned. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def A = makeUsl2(); setring A; // this algebra is U(sl_2) ideal i = e2,f; option(redSB); option(redTail); matrix T; ideal j = liftstd(i,T); // the Groebner basis in a compact form: print(matrix(j)); print(T); // the transformation matrix ideal tj = ideal(transpose(T)*transpose(matrix(i))); size(ideal(matrix(j)-matrix(tj))); // test for 0 module S; ideal k = liftstd(i,T,S); // the third argument S = std(S); print(S); // the syzygy module @c example @end smallexample @end table @c ref See @ref{ideal BR_PLURAL_BR}; @ref{ring BR_PLURAL_BR}; @ref{std BR_PLURAL_BR}. @c ref @c --------------------------------------- @node minres BR_PLURAL_BR, modulo BR_PLURAL_BR, liftstd BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection minres BR_PLURAL_BR @cindex minres BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{minres (} list_expression @code{)} @item @strong{Type:} list @item @strong{Syntax:} @code{minres (} resolution_expression @code{)} @item @strong{Type:} resolution @item @strong{Purpose:} minimizes a free resolution of an ideal or module given by the list_expression, resp.@: resolution_expression. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def A = makeUsl2(); setring A; // this algebra is U(sl_2) ideal i=e,f,h; i=std(i); resolution F=nres(i,0); F; list lF = F; lF; print(betti(lF), "betti"); resolution MF=minres(F); MF; list lMF = F; lMF; print(betti(lMF), "betti"); @c example @end smallexample @end table @c ref See @ref{mres BR_PLURAL_BR}; @ref{nres BR_PLURAL_BR}. @c ref @c --------------------------------------- @node modulo BR_PLURAL_BR, mres BR_PLURAL_BR, minres BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection modulo BR_PLURAL_BR @cindex modulo BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{modulo (} ideal_expression@code{,} ideal_expression @code{)} @*@code{modulo (} module_expression@code{,} module_expression @code{)} @item @strong{Type:} module @item @strong{Purpose:} @code{modulo(h1,h2)} @ifinfo represents h1/(h1 intersect h2) (isomorphic to (h1+h2)/h2) @end ifinfo @tex represents $h_1/(h_1 \cap h_2) \cong (h_1+h_2)/h_2$ @end tex , where @tex $h_1$ and $h_2$ @end tex @ifinfo h1 and h2 @end ifinfo are considered as submodules of the same free module @tex $R^l$ @end tex @ifinfo R^l @end ifinfo (l=1 for ideals). @*Let @tex $H_1$ (resp.\ $H_2$) @end tex @ifinfo H1 (resp. H2) be the matrix of size l x k (resp.@: l x m), having the generators of h1 (resp.@: h2) @end ifinfo @tex be the matrix of size $l \times k$ (resp.\ $l \times m$), having the generators of $h_1$ (resp.\ $h_2$) @end tex as columns. @* Then @tex $h_1/(h_1 \cap h_2) \cong R^k / ker(\overline{H_1})$ @end tex @ifinfo @format __ h1/(h1 intersect h2) is isomorphic to R^k/ker(H1) @* @end format @end ifinfo , where @tex $\overline{H_1}: R^k \rightarrow R^l/Im(H_2)=R^l/h_2$ @end tex is the induced map given by @tex $H_1$. @end tex @ifinfo H1. @end ifinfo @ifinfo @format __ H1: R^k ----> R^l/Im(H2)=R^l/h2 is the induced map. @* @end format @end ifinfo @*@code{modulo(h1,h2)} returns generators of the kernel of this induced map. @item @strong{Note:} If, for at least one of @tex $h_1$ or $h_2$, @end tex @ifinfo h1 or h2, @end ifinfo the attribute @code{isHomog} is st, then @code{modulo(h1,h2)} also sets this attribute (if the weights are compatible). @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def A = makeUsl2(); setring A; // this algebra is U(sl_2) option(redSB); option(redTail); ideal H2 = e2,f2,h2-1; H2 = twostd(H2); print(matrix(H2)); // print H2 in a compact form ideal H1 = std(e); ideal T = modulo(H1,H2); T = NF(std(H2+T),H2); T = std(T); T; @c example @end smallexample @end table @c ref See also @ref{syz BR_PLURAL_BR}. @c ref @c --------------------------------------- @node mres BR_PLURAL_BR, nc_algebra, modulo BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection mres BR_PLURAL_BR @cindex mres BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{mres (} ideal_expression@code{,} int_expression @code{)} @*@code{mres (} module_expression@code{,} int_expression @code{)} @item @strong{Type:} resolution @item @strong{Purpose:} computes a minimal free resolution of an ideal or module M with the Groebner basis method. More precisely, let A=@code{matrix}(M), then @code{mres} computes a free resolution of @ifinfo coker(A)=F0/M @format A2 A1 ... ----> F2 ----> F1 ----> F0 --> F0/M --> 0. @end format @end ifinfo @tex $coker(A)=F_0/M$ $$...\longrightarrow F_2 \buildrel{A_2}\over{\longrightarrow} F_1 \buildrel{A_1}\over{\longrightarrow} F_0\longrightarrow F_0/M \longrightarrow 0,$$ @end tex where the columns of the matrix @tex $A_1$ @end tex @ifinfo A1 @end ifinfo are a (possibly) minimal set of generators of @math{M}. If the int expression k is not zero, then the computation stops after k steps and returns a resolution consisting of modules @tex $M_i={\tt module}(A_i)$, $i= 1 \ldots k$. @end tex @ifinfo Mi=module(Ai), i=1...k. @end ifinfo @*@code{mres(M,0)} returns a resolution consisting of at most n+2 modules, where n is the number of variables of the basering. Let @code{list L=mres(M,0);} then @code{L[1]} consists of a minimal set of generators @code{M}, @code{L[2]} consists of a minimal set of generators for the first syzygy module of @code{L[1]}, etc., until @code{L[p+1]}, such that @ifinfo L[i]<>0 for i<=p, @end ifinfo @tex ${\tt L[i]}\neq 0$ for $i \le p$, @end tex but @code{L[p+1]} (the first syzygy module of @code{L[p]}) is 0 (if the basering is not a qring). @item @strong{Note:} Accessing single elements of a resolution may require that some partial computations have to be finished and may therefore take some time. Hence, assigning right away to a list is the recommended way to do it. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def A = makeUsl2(); setring A; // this algebra is U(sl_2) option(redSB); option(redTail); ideal i = e,f,h; i = std(i); resolution M=mres(i,0); M; list l = M; l; // see the exactness at this point size(ideal(transpose(l[2])*transpose(l[1]))); print(matrix(M[3])); // see the exactness at this point size(ideal(transpose(l[3])*transpose(l[2]))); @c example @end smallexample @end table @c ref See @ref{ideal BR_PLURAL_BR}; @ref{minres BR_PLURAL_BR}; @ref{nres BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}; @c ref @c ----------------------------- @node nc_algebra, ncalgebra, mres BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection nc_algebra @cindex nc_algebra @table @code @item @strong{Syntax:} @*@code{nc_algebra(} matrix_expression C, matrix_expression D @code{)} @*@code{nc_algebra(} number_expression n, matrix_expression D @code{)} @*@code{nc_algebra(} matrix_expression C, poly_expression p @code{)} @*@code{nc_algebra(} number_expression n, poly_expression p @code{)} @item @strong{Type:} ring @item @strong{Purpose:} Executed in the basering @code{r}, say, in k variables @tex $ x_1, \ldots, x_k ,\;$ @end tex @ifinfo x_1,... ,x_k, @end ifinfo @code{nc_algebra} creates and returns the non-commutative extension of @code{r} subject to relations @tex $ \{ x_j x_i=c_{ij} \cdot x_i x_j + d_{ij}, 1 \leq i @math{B}, where @math{A} is a commutative ring. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; ring R = 0,a,dp; def Usl2 = makeUsl2(); setring Usl2; poly C = 4*e*f+h^2-2*h; // C is a central element of U(sl2) ideal I = e^3, f^3, h^3-4*h; ideal Z = 0; // zero ideal J = twostd(I); // two-sided GB ideal K = std(I); // left GB map Phi = R,C; // phi maps a (in R) to C (in U(sl2)) setring R; ideal PreJ = preimage(Usl2,Phi,J); // the central character of J PreJ; factorize(PreJ[1],1); // hence, there are two simple characters for J ideal PreK = preimage(Usl2,Phi,K); // the central character of K PreK; factorize(PreK[1],1); // hence, there are three simple characters for K preimage(Usl2, Phi, Z); // kernel pf phi @c example @end smallexample @end table @c ref See @ref{map BR_PLURAL_BR}; @ref{ideal BR_PLURAL_BR}; @ref{ring BR_PLURAL_BR}. @c ref @c --------------------------------------- @node quotient BR_PLURAL_BR, reduce BR_PLURAL_BR, preimage BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection quotient BR_PLURAL_BR @cindex quotient BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{quotient (} ideal_expression@code{,} ideal_expression @code{)} @*@code{quotient (} module_expression@code{,} module_expression @code{)} @item @strong{Type:} ideal @item @strong{Syntax:} @code{quotient (} module_expression@code{,} ideal_expression @code{)} @item @strong{Type:} module @item @strong{Purpose:} computes the ideal quotient, resp.@: module quotient. Let @code{R} be the basering, @code{I,J} ideals and @code{M, N} modules in @ifinfo R^n. @end ifinfo @tex ${\tt R}^n$. @end tex Then @itemize @item @code{quotient(I,J)}= @ifinfo @{a in R | aJ in I @} @end ifinfo @tex $\{a \in R \mid aJ \subset I\}$, @end tex @item @code{quotient(M,J)}= @ifinfo @{a in R | bN in M @}. @end ifinfo @tex $\{b \in R^n \mid bJ \subset M\}$. @end tex @end itemize @item @strong{Note:} It can only be used for two-sided ideals (bimodules), otherwise the result may have no meaning. @item @strong{Example:} @c // from [BGV], Ex.3.17, p.150, modified by q @smallexample @c example //------ a very simple example ------------ ring r=(0,q),(x,y),Dp; def R=nc_algebra(q,0); // this algebra is a quantum plane setring R; option(returnSB); poly f1 = x^3+2*x*y^2+2*x^2*y; poly f2 = y; poly f3 = x^2; poly f4 = x+y; ideal i = f1,f2; ideal I = twostd(i); ideal j = f3,f4; ideal J = twostd(j); quotient(I,J); module M = x*freemodule(3), y*freemodule(2); quotient(M, ideal(x,y)); kill r,R; //------- a bit more involved example LIB "ncalg.lib"; def Usl2 = makeUsl2(); // this algebra is U(sl_2) setring Usl2; ideal i = e3,f3,h3-4*h; ideal I = std(i); poly C = 4*e*f+h^2-2*h; ideal H = twostd(C-8); option(returnSB); ideal Q = quotient(I,H); // print a compact presentation of Q: print(matrix(Q)); @c example @end smallexample @end table @c ref See @ref{ideal BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}. @c ref @c --------------------------------------- @node reduce BR_PLURAL_BR, ringlist BR_PLURAL_BR, quotient BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection reduce BR_PLURAL_BR @cindex reduce BR_PLURAL_BR @cindex NF @table @code @item @strong{Syntax:} @code{reduce (} poly_expression@code{,} ideal_expression @code{)} @*@code{reduce (} poly_expression@code{,} ideal_expression@code{,} int_expression @code{)} @*@code{reduce (} vector_expression@code{,} ideal_expression @code{)} @*@code{reduce (} vector_expression@code{,} ideal_expression@code{,} int_expression @code{)} @*@code{reduce (} vector_expression@code{,} module_expression @code{)} @*@code{reduce (} vector_expression@code{,} module_expression@code{,} int_expression @code{)} @*@code{reduce (} ideal_expression@code{,} ideal_expression @code{)} @*@code{reduce (} ideal_expression@code{,} ideal_expression@code{,} int_expression @code{)} @*@code{reduce (} module_expression@code{,} ideal_expression @code{)} @*@code{reduce (} module_expression@code{,} ideal_expression@code{,} int_expression @code{)} @*@code{reduce (} module_expression@code{,} module_expression @code{)} @*@code{reduce (} module_expression@code{,} module_expression@code{,} int_expression @code{)} @item @strong{Type:} the type of the first argument @item @strong{Purpose:} reduces a polynomial, vector, ideal or module to its @strong{left} normal form with respect to an ideal or module represented by a left Groebner basis, if the second argument is a left Groebner basis. @*returns 0 if and only if the polynomial (resp.@: vector, ideal, module) is an element (resp.@: subideal, submodule) of the ideal (resp.@: module). @*Otherwise, the result may have no meaning. @*The third (optional) argument 1 of type int forces a reduction which considers only the leading term and does no tail reduction. @item @strong{Note:} The commands @code{reduce} and @code{NF} are synonymous. @item @strong{Example:} @smallexample @c example ring r=(0,a),(e,f,h),Dp; matrix d[3][3]; d[1,2]=-h; d[1,3]=2e; d[2,3]=-2f; def R=nc_algebra(1,d); setring R; // this algebra is U(sl_2) over Q(a) ideal I = e2, f2, h2-1; I = std(I); // print a compact presentation of I print(matrix(I)); ideal J = e, h-a; J = std(J); // print a compact presentation of J print(matrix(J)); poly z=4*e*f+h^2-2*h; // z is the central element of U(sl_2) reduce(z,I); // the central character of I: reduce(z,J); // the central character of J: poly nz = z - NF(z,J); // nz will belong to J reduce(nz,J); reduce(I,J); @c example @end smallexample @end table @c ref See also @ref{ideal BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}; @ref{std BR_PLURAL_BR}. @c ref @c --------------------------------------- @node ringlist BR_PLURAL_BR, slimgb BR_PLURAL_BR, reduce BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection ringlist BR_PLURAL_BR @cindex ringlist BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{ringlist (} ring_expression @code{)} @*@code{ringlist (} qring_expression @code{)} @item @strong{Type:} list @item @strong{Purpose:} decomposes a ring/qring into a list of 6 (or 4 in the commutative case) components. @* The first 4 components are common both for the commutative and for the non-commutative cases, the 5th and the 6th appear only in the non-commutative case. @enumerate 5 @item upper triangle square matrix with nonzero upper triangle, containing structural coefficients of a G-algebra (this corresponds to the matrix C from the definition of @ref{G-algebras}) @item square matrix, containing structural polynomials of a G-algebra (this corresponds to the matrix D from the definition of @ref{G-algebras}) @end enumerate @item @strong{Note:} After modifying a list aquired with @code{ringlist}, one can construct a corresponding ring with @code{ring(list)}. @item @strong{Example:} @smallexample @c example // consider the quantized Weyl algebra ring r = (0,q),(x,d),Dp; def RS=nc_algebra(q,1); setring RS; RS; list l = ringlist(RS); l; // now, change the relation d*x = q*x*d +1 // into the relation d*x=(q2+1)*x*d + q*d + 1 matrix S = l[5]; // matrix of coefficients S[1,2] = q^2+1; l[5] = S; matrix T = l[6]; // matrix of polynomials T[1,2] = q*d+1; l[6] = T; def rr = ring(l); setring rr; rr; @c example @end smallexample @end table @c ref See also @ref{ring BR_PLURAL_BR}; @ref{ringlist}. @c ref @c --------------------------------------- @node slimgb BR_PLURAL_BR, std BR_PLURAL_BR, ringlist BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection slimgb BR_PLURAL_BR @cindex slimgb BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{slimgb (} ideal_expression@code{)} @*@code{slimgb (} module_expression@code{)} @item @strong{Type:} same type as argument @item @strong{Purpose:} returns a left Groebner basis of a left ideal or module with respect to the global monomial ordering of the basering. @item @strong{Note:} The commutative algorithm is described in the diploma thesis of Michael Brickenstein "Neue Varianten zur Berechnung von Groebnerbasen", written 2004 under supervision of G.-M. Greuel in Kaiserslautern. It is designed to keep polynomials or vectors slim (short with small coefficients). Currently best results are examples over function fields (parameters). The current implementation may not be optimal for weighted degree orderings. The program only supports the options @code{prot}, which will give protocol output and @code{redSB} for returning a reduced Groebner basis. The protocol messages of @code{slimgb} mean the following: @* @code{M[n,m]} means a parallel reduction of @code{n} elements with @code{m} non-zero output elements, @* @code{b} notices an exchange trick described in the thesis and @* @code{e} adds a reductor with non-minimal leading term. @code{slimgb} works for grade commutative algebras but not for general GR-algebras. Please use @code{qslimgb} instead. For a detailed commutative example see @ref{slim Groebner bases}. @item @strong{Example:} @smallexample @c example LIB "nctools.lib"; LIB "ncalg.lib"; def U = makeUsl(2); // U is the U(sl_2) algebra setring U; ideal I = e^3, f^3, h^3-4*h; option(redSB); ideal J = slimgb(I); J; // compare slimgb with std: ideal K = std(I); print(matrix(NF(K,J))); print(matrix(NF(J,K))); // hence both Groebner bases are equal ; // another example for exterior algebras ring r; def E = Exterior(); setring E; E; slimgb(xy+z); @c example @end smallexample @end table @c ref See @ref{option}; @ref{std BR_PLURAL_BR}. @c ref @c --------------------------------------- @node std BR_PLURAL_BR, subst BR_PLURAL_BR, slimgb BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection std BR_PLURAL_BR @cindex std BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{std (} ideal_expression@code{)} @*@code{std (} module_expression@code{)} @*@code{std (} ideal_expression@code{,} poly_expression @code{)} @*@code{std (} module_expression@code{,} vector_expression @code{)} @item @strong{Type:} ideal or module @item @strong{Purpose:} returns a left Groebner basis (see @ref{Groebner bases in G-algebras} for a definition) of an ideal or module with respect to the monomial ordering of the basering. @c is a set of generators such that @c the leading terms generate the leading ideal, resp.@: module. Use an optional second argument of type poly, resp.@: vector, to construct the Groebner basis from an already computed one (given as the first argument) and one additional generator (the second argument). @item @strong{Note:} To view the progress of long running computations, use @code{option(prot)}. @ifset singularmanual (@pxref{option}(prot)). @end ifset @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; option(prot); def R = makeUsl2(); // this algebra is U(sl_2) setring R; ideal I = e2, f2, h2-1; I=std(I); I; kill R; //------------------------------------------ def RQ = makeQso3(3); // this algebra is U'_q(so_3), // where Q is a 6th root of unity setring RQ; RQ; ideal J=x2, y2, z2; J=std(J); J; @c example @end smallexample @end table @c ref See also @ref{ideal BR_PLURAL_BR}; @ref{ring BR_PLURAL_BR}. @c ref @c ------------------------------------------------- @node subst BR_PLURAL_BR, syz BR_PLURAL_BR, std BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection subst BR_PLURAL_BR @cindex subst BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{subst (} poly_expression,ring_variable, poly_expression @code{)} @*@code{subst (} vector _expression,ring_variable, poly_expression @code{)} @*@code{subst (} ideal_expression,ring_variable, poly_expression @code{)} @*@code{subst (} module _expression,ring_variable, poly_expression @code{)} @item @strong{Type:} poly, vector, ideal or module (corresponding to the first argument) @item @strong{Purpose:} substitutes a ring variable by a polynomial. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def R = makeUsl2(); // this algebra is U(sl_2) setring R; poly C = e*f*h; poly C1 = subst(C,e,h^3); C1; poly C2 = subst(C,f,e+f); C2; @c example @end smallexample @end table @c ref @c ref @c ------------------------------------------------- @node syz BR_PLURAL_BR, twostd, subst BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection syz BR_PLURAL_BR @cindex syz BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{syz (} ideal_expression @code{)} @*@code{syz (} module_expression @code{)} @item @strong{Type:} module @item @strong{Purpose:} computes the first syzygy (i.e., the module of relations of the given generators) of the ideal, resp.@: module. @item @strong{Note:} if @code{S} is a matrix of a left syzygy module of left submodule given by matrix @code{M}, then @code{transpose(S)*transpose(M) = 0}. @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def R = makeQso3(3); setring R; option(redSB); // we wish to have completely reduced bases: option(redTail); ideal tst; ideal J = x3+x,x*y*z; print(syz(J)); ideal K = x+y+z,y+z,z; module S = syz(K); print(S); tst = ideal(transpose(S)*transpose(K)); // check the property of a syzygy module (tst==0): size(tst); // now compute the Groebner basis of K ... K = std(K); // ... print a matrix presentation of K ... print(matrix(K)); S = syz(K); // ... and its syzygy module print(S); tst = ideal(transpose(S)*transpose(K)); // check the property of a syzygy module (tst==0): size(tst); // but the "commutative" syzygy property does not hold size(ideal(matrix(K)*matrix(S))); @c example @end smallexample @end table @c ref See also @ref{ideal BR_PLURAL_BR}; @ref{module BR_PLURAL_BR}; @ref{mres BR_PLURAL_BR}; @ref{nres BR_PLURAL_BR}; @ref{minres BR_PLURAL_BR}; @c ref @c ------------------------------ @node twostd, vdim BR_PLURAL_BR, syz BR_PLURAL_BR, Functions BR_PLURAL_BR @subsection twostd @cindex twostd @table @code @item @strong{Syntax:} @code{twostd(} ideal_expression@code{)}; @item @strong{Type:} ideal @item @strong{Purpose:} returns a left Groebner basis of the two-sided ideal, generated by the input, treated as a set of two-sided generators. @ifset singularmanual see @ref{std} @end ifset @item @strong{Remark:} There are algebras with no two-sided ideals except 0 and the whole algebra (like Weyl algebras). @item @strong{Example:} @smallexample @c example LIB "ncalg.lib"; def U = makeUsl2(); // this algebra is U(sl_2) setring U; ideal i= e^3, f^3, h^3 - 4*h; option(redSB); option(redTail); ideal I = std(i); print(matrix(I)); // print a compact presentation of I ideal J = twostd(i); // print a compact presentation of J: print(matrix(ideal(J[1..6]))); // first 6 gen's print(matrix(ideal(J[7..size(J)]))); // the rest of gen's // compute the set of elements present in J but not in I ideal K = NF(J,I); K = K+0; // simplify K print(matrix(K)); @c example @end smallexample @end table @c ------------------------------------------------------------------------- @node vdim BR_PLURAL_BR,, twostd, Functions BR_PLURAL_BR @subsection vdim BR_PLURAL_BR @cindex vdim BR_PLURAL_BR @table @code @item @strong{Syntax:} @code{vdim (} ideal_expression @code{)} @*@code{vdim (} module_expression @code{)} @item @strong{Type:} int @item @strong{Purpose:} computes the vector space dimension of the factor-module that equals ring (resp. free module) modulo the ideal (resp. submodule), generated by the leading terms of the given generators. @* If the factor-module is not of finite dimension, -1 is returned. If the generators form a Groebner basis, this is the same as the vector space dimension of the factor-module. @item @strong{Note:} In the non-commutative case, a ring modulo an ideal has a ring stucture if and only if the ideal is two-sided. @item @strong{Example:} @smallexample @c example ring R=0,(x,y,z),dp; matrix d[3][3]; d[1,2]=-z; d[1,3]=2x; d[2,3]=-2y; def RS=nc_algebra(1,d); //U(sl_2) setring RS; option(redSB); option(redTail); ideal I=x3,y3,z3-z; I=std(I); I; vdim(I); @c example @end smallexample @end table @c ref See also @ref{ideal BR_PLURAL_BR}; @ref{std BR_PLURAL_BR}; @ref{kbase BR_PLURAL_BR}. @c ref @c ------------------------------------------------------------------------- @node Mathematical background BR_PLURAL_BR, Graded commutative algebras (SCA), Functions BR_PLURAL_BR, Non-commutative subsystem @section Mathematical background BR_PLURAL_BR @cindex Mathematical background BR_PLURAL_BR This section introduces some of the mathematical notions and definitions used throughout the @sc{Plural} manual. For details, please, refer to appropriate articles or text books (see @ref{References BR_PLURAL_BR}). A detailed discussion of the subjects in this section can be found in the doctoral thesis [LV] of V. Levandovskyy (see @ref{References BR_PLURAL_BR}). All algebras are assumed to be associative @math{K}-algebras for some field @math{K}. @menu * G-algebras:: * Groebner bases in G-algebras:: * Syzygies and resolutions BR_PLURAL_BR:: * References BR_PLURAL_BR:: @end menu @c --------------------------------------------------------------------------- @node G-algebras, Groebner bases in G-algebras, , Mathematical background BR_PLURAL_BR @subsection G-algebras @cindex G-algebra @subheading Definition (PBW basis) @cindex PBW basis @tex Let $K$ be a field, and let a $K$-algebra $A$ be generated by variables $x_1, \ldots ,x_n$ subject to some relations. We call $A$ an algebra with {\bf PBW basis} (Poincar\'e-Birkhoff-Witt basis), if a $K$--basis of $A$ is Mon$(x_1,\dots,x_n)=\{x^{a_1}_1 x^{a_2}_2 \dots x^{a_n}_n \mid a_i \in N \cup \{0\} \}$, where a power-product $x^{a_1}_1 x^{a_2}_2 \dots x^{a_n}_n$ (in this particular order) is called {\bf a monomial}. For example, $x_1 x_2$ is a monomial, while $x_2 x_1$ is, in general, not a monomial. @end tex @ifinfo Let K be a field, and let a K-algebra A be generated by variables x_1, ... ,x_n subject to some relations. @* We call A an algebra with PBW basis (Poincare-Birkhoff-Witt basis), if a K--basis of A is Mon(x_1,...,x_n) =@{x^a1_1 x^a2_2 ... x^an_n a_i in N union @{0@} @}, where a power-product x^a1_1 x^a2_2 ... x^an_n (in this particular order) is called @strong{a monomial}. For example, x_1 x_2 is a monomial, while x_2 x_1 is, in general, not a monomial. @end ifinfo @subheading Definition (G-algebra) @cindex G-algebra @tex Let $K$ be a field, and let a $K$-algebra $A$ be given in terms of generators subject to the following relations: $A= K \langle x_1, \ldots ,x_n \mid \{ x_j x_i=c_{ij} \cdot x_i x_j + d_{ij}\}, 1 \leq i , where c_@{ij@} in K^*, d_@{ij@} in K[x_1, ..., x_n]. A is called a G--algebra, if the following conditions hold: @end ifinfo @c table @asis @itemize @bullet @item @tex there is a monomial well-ordering $<$ on $K[x_1,x_2,\ldots,x_n]$ such that $\forall i=j will be ignored). @end ifinfo @item @tex $D=\{d_{ij}, i=j will be ignored). @end ifinfo @end enumerate @c @end table @item Call the initialization function @code{nc_algebra(C,D)} (see @ref{nc_algebra}) with the data @tex $C$ and $D$. @end tex @ifinfo C and D. @end ifinfo @end itemize At present, @sc{Plural} does not check automatically whether the non-degeneracy conditions hold but it provides a procedure @ref{ndcond} from the library @ref{nctools_lib} to check this. @c --------------------------------------------------------------------------- @node Groebner bases in G-algebras, Syzygies and resolutions BR_PLURAL_BR, G-algebras, Mathematical background BR_PLURAL_BR @subsection Groebner bases in G-algebras @cindex Groebner bases in G-algebras We follow the notations, used in the @sc{Singular} Manual (e.g. in @ref{Standard bases}). @tex For a $G$--algebra $A$, we denote by ${}_{A} \langle g_1, \dots, g_s \rangle$ the left submodule of a free module $A^r$, generated by elements $\{g_1, \dots, g_s\}\subset A^r$. @end tex @tex Let $<$ be a fixed monomial well-ordering on the $G$--algebra $A$ with the Poincar@'e-Birkhoff-Witt (PBW) basis $\{x^{\alpha} = x^{a_1}_1 x^{a_2}_2 \dots x^{a_n}_n\}$. For a given free module $A^r$ with the basis $\{e_1,\ldots, e_r\}$, $<$ denotes also a fixed module ordering on the set of monomials $\{x^{\alpha} e_i \mid \alpha\in {\bf N}^n, 1\leq i\leq r \}$. @end tex @ifinfo Let < be a fixed monomial well-ordering on the G-algebra A with the Poincar@'e-Birkhoff-Witt (PBW) basis @{x^a1_1 x^a2_2 ... x^an_n @}. For a given free module A^r with the basis @{e_1,...,e_r@}, < denotes also a fixed module ordering on the set of monomials @{x^a e_i | a in N^n, 1<= i <= r @}. @end ifinfo @c For a set $S \subset A^r$, define @c $\ell(S) \subseteq N^n$ to be the monoid, generated by the leading exponents @c of elements of $S$, that is @c $\ell(S)=\langle \alpha \mid \exists s \in S, \hbox{lm(s)}=x^{\alpha} \rangle @c \subseteq N^n$. We call $\ell(S)$ the \textbf{monoid of leading exponents}. @c There exist $\alpha_1, \ldots, \alpha_m \in N^n$, @c such that $\ell(S) :=\langle \alpha_1, \ldots, \alpha_m \rangle$. @c We define a \textbf{set of leading monomials of $S$} be @c $L(S) := \{ x^{\alpha} \mid \alpha \in \ell(S) \}\subset{A}$. @subheading Definition @tex For a set $S \subset A^r$, define $L(S)$ to be the $K$--vector space, spanned on the leading monomials of elements of $S$, $L(S) = \oplus \{K x^{\alpha} e_i \mid \exists s \in S, \hbox{LM(s)}=x^{\alpha}e_i\}$. We call $L(S)$ the \textbf{span of leading monomials} of $S$. @end tex @ifinfo For a set S a subset of A^r, define L(S) to be the K-vector space, spanned on the leading monomials of elements of S, L(S) = + @{ K x^a e_i | exists s in S, LM(s)=x^a e_i@}. We call L(S) the @strong{span of leading monomials} of S. @end ifinfo @c For a set S a subset A^r, define @c l(S) to be the monoid, generated by the leading exponents @c of elements of S, that is @c l(S)= @c is subset N^n. We call l(S) the monoid of leading exponents. @c There exist a_1, ..., a_m in N^n, @c such that l(S) :=< a_1,..., a_m>. @c We define a @strong{set of leading monomials of S} be @c L(S) := @{ x^a| a in l(S) @} subset A. @c Let $ I\subset A^r $ be a submodule of $A^r$. @c Denote by $L(I)$ the submodule of $A^r$ generated by the leading terms @c of elements of $I$, i.e. by $\left\{\hbox{lm(f)} \mid f \in I\right\}$. @tex Let $I \subset A^r$ be a left $A$--submodule. A finite set $G\subset I$ is called {\bf a left Groebner basis} of $I$ if and only if $L(G)=L(I)$, that is for any $f \in I\setminus \{ 0 \}$ there exists a $g\in G$ satisfying $ \hbox{LM}(g) \mid \hbox{LM}(f)$, i.e., if $\hbox{LM}(f) = x^{\alpha}e_i$, then $\hbox{LM}(f) = x^{\beta}e_i$ with $\beta_j \leq \alpha_j, \; 1\leq j \leq n$. @end tex @ifinfo Let I a subset of A^r be a left A-submodule. A finite set G subset I is called @strong{ a left Groebner basis} of I if and only if L(G)=L(I), that is for any f in I\ @{ 0 @} there exists a g in G satisfying LM(g)|LM(f), i.e. if LM(f) = x^a e_i, then LM(f) = x^b e_i with b_j <= a_j, 1<= j <= n. @end ifinfo @*@strong{Remark:} In general non-commutative algorithms are working with well-orderings only (see @ref{PLURAL}, @ref{Monomial orderings} and @ref{Term orderings}), unless we deal with grade commutative algebras. @tex A Groebner basis $G\subset A^r$ is called {\bf minimal} (or {\bf reduced}) if $0\notin G$ and if $\hbox{LM}(g)\notin L(G\setminus \{ g \})$ for all $g\in G$. Note, that any Groebner basis can be made minimal by deleting successively those $g$ with $\hbox{LM}(h)\mid \hbox{LM}(g)$ for some $h\in G\setminus\{g \}$. For $f\in A^r $ and $ G\subset A^r $ we say that $f$ is {\bf completely reduced with respect to $G$} if no monomial of $f$ is contained in $L(G)$. @end tex @ifinfo A Groebner basis G a subset of A^r is called @strong{minimal} (or @strong{reduced}) if 0 not in G and if LM(g) not in L(G\@{ g @}) for all g in G. Note, that any Groebner basis can be made minimal by deleting successively those g with LM(h)| LM(g) for some h in G\@{g@}. For f in A^r and G subset A^r we say that f is @strong{completely reduced with respect to G} if no monomial of f is contained in L(G). @end ifinfo @subheading Left Normal Form @cindex Left normal form @table @asis @tex A map $\hbox{NF} : A^r \times \{G \mid G\ \hbox{ a (left) Groebner basis}\} \to A^r, (f|G) \mapsto \hbox{NF}(f|G)$, is called a {\bf (left) normal form} on $A^r$ if for any $f \in A^r$ and any left Groebner basis $G$ the following holds: (i) $\hbox{NF}(0|G) = 0$, (ii) if $\hbox{NF}(f|G) \not= 0$ then $\hbox{LM}(g)$ does not divide $\hbox{LM}(\hbox{NF}(f|G))$ for all $g \in G$, (iii) $f - \hbox{NF}(f|G)\in {}_{A}\langle G \rangle$. \noindent $\hbox{NF}(f|G)$ is called a {\bf left normal form of} $f$ {\bf with respect to} $G$ (note that such a map is not unique). @end tex @ifinfo A map NF : A^r x G| G\ @{ a (left) Groebner basis@} --> A^r, (f|G) --> NF(f|G), is called a @strong{left normal form} on A^r if for any f in A^r and any left Groebner basis G the following holds: (i) NF(f|G)<> 0 then lm(g) does not divide LM(NF(f|G)) for all g \in G. (ii) f - NF(f|G) is in .$ NF(f|G) is called a @strong{left normal form of} f @strong{with respect to} G (note that such a map is not unique). @end ifinfo @end table @*@strong{ Remark:} As we have already mentioned in the definitions @code{ideal} and @code{module} (see @ref{PLURAL}), @sc{Plural} works with left normal form only. @subheading Left ideal membership @cindex Left ideal membership @table @asis @tex For a left Groebner basis $G$ of $I$ the following holds: $f \in I$ if and only if the left normal form $\hbox{NF}(f|G) = 0$. @end tex @ifinfo For a leftGroebner basis G of I the following holds: f is in I if and only if left the normal form NF(f|G) = 0. @end ifinfo @end table @c --------------------------------------------------------------------------- @node Syzygies and resolutions BR_PLURAL_BR, References BR_PLURAL_BR, Groebner bases in G-algebras, Mathematical background BR_PLURAL_BR @subsection Syzygies and resolutions BR_PLURAL_BR @cindex Syzygies and resolutions BR_PLURAL_BR @subheading Syzygies @tex Let $A$ be a GR-algebra. A {\bf left} (resp. {\bf right}) {\bf syzygy} between $k$ elements $\{f_1,\dots,f_k\} \subset A^r $ is a $k$-tuple $(g_1,\dots ,g_k)\in A^k$ satisfying $$\sum_{i=1}^{k} g_i f_i = 0 \;\;\; {\rm resp. } \;\;\; \sum_{i=1}^{k} f_i g_i = 0. $$ The set of all left (resp. right) syzygies between $\{f_1,...,f_k\}$ is a left (resp. right) submodule $S$ of $A^k$. @end tex @ifinfo Let A be a GR-algebra. A @strong{left} resp. @strong{right syzygy} between k elements f_1,...,f_k in A^r is k-tuple (g_1,... ,g_k) in A^k satisfying sum_@{i=1@}^@{k@}g_i f_i =0 resp. sum_@{i=1@}^@{k@} f_i g_i =0 Clearly, the set of all left (resp. right) syzygies between f_1,...,f_k is left (resp. right) A-submodule S of A^k. @end ifinfo @*@strong{Remark:} With respect to the definitions of @code{ideal} and @code{module} (see @ref{PLURAL}), @sc{Plural} works with left syzygies only (by @code{syz} we understand a left syzygy). If @code{S} is a matrix of a left syzygy module of left submodule given by matrix @code{M}, then @code{transpose(S)*transpose(M) = 0} (but, in general, @tex $M \cdot S \not=0$). @end tex @ifinfo M S <> 0 @end ifinfo Note, that the syzygy modules of @math{I} depend on a choice of generators @tex $\{g_1, \dots , g_s\}$, @end tex @ifinfo @{g_1,\dots , g_s@}, @end ifinfo but one can show that they depend on @math{I} uniquely up to direct summands. @subheading Free resolutions @tex Let $I={}_{A}\langle g_1,\dots ,g_s\rangle \subseteq A^r$ and $M= A^r/I$. A {\bf free resolution of $M$} is a long exact sequence $$\dots \longrightarrow F_2 \buildrel{B_2}\over{\longrightarrow} F_1 \buildrel{B_1}\over{\longrightarrow} F_0\longrightarrow M\longrightarrow 0,$$ @end tex @ifinfo Let I= in A^r and M=A^r/I. A free resolution of M is a long exact sequence @display ...--> F2 --A2-> F1 --A1-> F0-->M-->0, @end display @end ifinfo @* with @tex ${\tt transpose}(B_{i+1}) \cdot {\tt transpose}(B_i) =0$ @end tex @ifinfo @code{transpose}(B[i+1]) * @code{transpose}(B[i]) =0 @end ifinfo @c @tex @c {\tt transpose} (B_{i+1}) \cdot {\tt transpose} (B_{i}) = 0$ @c @end tex and where the columns of the matrix @tex $B_1$ @end tex @ifinfo B_1 @end ifinfo generate @math{I}. Note, that resolutions over factor-algebras need not to be of finite length. @subheading Generalized Hilbert Syzygy Theorem @cindex Generalized Hilbert Syzygy Theorem @tex For a $G$--algebra $A$, generated by $n$ @end tex @ifinfo For a @math{G}-algebra @math{A}, generated by @math{n} @end ifinfo variables, there exists a free resolution of length smaller or equal than @math{n}. @table @code @item @strong{Example:} @smallexample @c example ring R=0,(x,y,z),dp; matrix d[3][3]; d[1,2]=-z; d[1,3]=2x; d[2,3]=-2y; def U=nc_algebra(1,d); // this algebra is U(sl_2) setring U; option(redSB); option(redTail); ideal I=x3,y3,z3-z; I=std(I); I; resolution resI = mres(I,0); resI; list l = resI; // The matrix A_1 is given by print(matrix(l[1])); // We see that the columns of A_1 generate I. // The matrix A_2 is given by print(matrix(l[2])); ideal tst; // now let us show that the resolution is exact matrix TST; TST = transpose(l[3])*transpose(l[2]); // 2nd term size(ideal(TST)); TST = transpose(l[2])*transpose(l[1]); // 1st term size(ideal(TST)); @c example @end smallexample @end table @c --------------------------------------------------------------------------- @node References BR_PLURAL_BR, , Syzygies and resolutions BR_PLURAL_BR, Mathematical background BR_PLURAL_BR @subsection References BR_PLURAL_BR @cindex References BR_PLURAL_BR The Centre for Computer Algebra Kaiserslautern publishes a series of preprints which are electronically available at @code{http://www.mathematik.uni-kl.de/~zca/Reports_on_ca}. Other sources to check are the following books and articles: @subheading Text books @itemize @bullet @item @c DK book [DK] Y. Drozd and V. Kirichenko. Finite dimensional algebras. With an appendix by Vlastimil Dlab. Springer, 1994 @item @c GPS book [GPS] Greuel, G.-M. and Pfister, G. with contributions by Bachmann, O. ; Lossen, C. and Sch@"onemann, H. A SINGULAR Introduction to Commutative Algebra. Springer, 2002 @item @c BGV [BGV] Bueso, J.; Gomez Torrecillas, J.; Verschoren, A. Algorithmic methods in non-commutative algebra. Applications to quantum groups. Kluwer Academic Publishers, 2003 @item @c Kr Book [Kr] Kredel, H. Solvable polynomial rings. Shaker, 1993 @item @c HLi Book [Li] Huishi Li. Non-commutative Gr@"obner bases and filtered-graded transfer. Springer, 2002 @item @c MR book [MR] McConnell, J.C. and Robson, J.C. Non-commutative Noetherian rings. With the cooperation of L. W. Small. Graduate Studies in Mathematics. 30. Providence, RI: American Mathematical Society (AMS)., 2001 @end itemize @subheading Descriptions of algorithms and problems @itemize @bullet @item @c{HKP} art Havlicek, M. and Klimyk, A. and Posta, S. Central elements of the algebras @tex $U'_q({\rm so}_m)$ and $U'_q({\rm iso}_m)$. {arXiv. math. QA/9911130}, (1999) @end tex @item @c{AP} art J. Apel. Gr@"obnerbasen in nichtkommutativen algebren und ihre anwendung. Dissertation, Universit@"at Leipzig, 1988. @item @c{AP2} art Apel, J. Computational ideal theory in finitely generated extension rings. Theor. Comput. Sci.(2000), 244(1-2):1-33 @item @c{BachS:98} InCollection O. Bachmann and H. Sch@"onemann. Monomial operations for computations of Gr@"obner bases. In Reports On Computer Algebra 18. Centre for Computer Algebra, University of Kaiserslautern (1998) @item @c DE} InProceedings D. Decker and D. Eisenbud. Sheaf algorithms using the exterior algebra. In Eisenbud, D.; Grayson, D.; Stillman, M.; Sturmfels, B., editor, Computations in algebraic geometry with Macaulay 2, (2001) @item @c art Jose L. Bueso, J. Gomez Torrecillas and F. J. Lobillo. Computing the Gelfand-Kirillov dimension II. In A. Granja, J. A. Hermida and A. Verschoren eds. Ring Theory and Algebraic Geometry, Lect. Not. in Pure and Appl. Maths., Marcel Dekker, 2001. @item @c art Jose L. Bueso, J. Gomez Torrecillas and F. J. Lobillo. Re-filtering and exactness of the Gelfand-Kirillov dimension. Bulletin des Sciences Mathematiques 125(8), 689-715 (2001). @item @c GL art J. Gomez Torrecillas and F.J. Lobillo. Global homological dimension of multifiltered rings and quantized enveloping algebras. J. Algebra, 225(2):522-533, 2000. @item @c I1 InProc N. Iorgov. @tex On the Center of $q$-Deformed Algebra $U'_q( \rm so _3)$ Related to Quantum Gravity at $q$ a Root of $1$. @end tex In Proceedings of IV Int. Conf. "Symmetry in Nonlinear Mathematical Physics",(2001) Kyiv, Ukraine @item @c KW art A. Kandri-Rody and V. Weispfenning. Non-commutative Gr@"obner bases in algebras of solvable type. J. Symbolic Computation, 9(1):1-26, 1990. @item @c LV2 Inproc Levandovskyy, V. On Gr@"obner bases for non-commutative G-algebras. In Kredel, H. and Seiler, W.K., editor, Proceedings of the 8th Rhine Workshop on Computer Algebra, 2002. @item @c NDC InProc [L1] Levandovskyy, V. PBW Bases, Non-degeneracy Conditions and Applications. In Buchweitz, R.-O. and Lenzing, H., editor, Proceedings of the ICRA X conference, Toronto, 2003. @item @c LS InProc [LS] Levandovskyy V.; Sch@"onemann, H. Plural - a computer algebra system for non-commutative polynomial algebras. In Proc. of the International Symposium on Symbolic and Algebraic Computation (ISSAC'03). ACM Press, 2003. @item @c LVdiss art [LV] Levandovskyy, V. Non-commutative Computer Algebra for polynomial algebras: Gr@"obner bases, applications and implementation. Doctoral Thesis, Universit@"at Kaiserslautern, 2005. Available online at @code{http://kluedo.ub.uni-kl.de/volltexte/2005/1883/}. @item @c LV3 article [L2] Levandovskyy, V. On preimages of ideals in certain non-commutative algebras. In Pfister G., Cojocaru S. and Ufnarovski, V. (editors), Computational Commutative and Non-Commutative Algebraic Geometry, IOS Press, 2005. @item @c MoraNC article Mora, T. Gr@"obner bases for non-commutative polynomial rings. Proc. AAECC 3 Lect. N. Comp. Sci, 229: 353-362, 1986. @item @c Mora article Mora, T. An introduction to commutative and non-commutative Groebner bases. Theor. Comp. Sci., 134: 131-173, 1994. @item @c NS art T. N@"u@ss{}ler and H. Sch@"onemann. Gr@"obner bases in algebras with zero-divisors. Preprint 244, Universit@"at Kaiserslautern, 1993. Available online at @code{http://www.mathematik.uni-kl.de/~zca/Reports_on_ca/index.html}. @item @c S:03 InColl Sch@"onemann, H. @sc{Singular} in a Framework for Polynomial Computations. In Joswig, M. and Takayama, N., editor, Algebra, Geometry and Software Systems, pages 163-176. Springer, 2003. @item @c Yan:98 art T. Yan. The geobucket data structure for polynomials. J. Symbolic Computation, 25(3):285-294, March 1998. @end itemize @c @subheading Descriptions of algorithms