The algorithms below can be used to reduce the number of generators of a module over a polynomial ring. In particular, it can be used to find a free basis of a free finitely presented module. The used references are [BLH11], [CLO05], [Fab08], [FQ07], [hpa13], [LW00].
‣ SuslinLemma ( f, g, j ) | ( operation ) |
Returns: a homalg ring element
Returns a linear combination of f and g with leading coefficient being the j-th coefficient of g. f has to be monic.
gap> Q := HomalgFieldOfRationalsInSingular( );; gap> R := ( Q * "x" ) * "y"; Q[x][y] gap> AssignGeneratorVariables( R ); #I Assigned the global variables [ x, y ] gap> f := x^2*y^4+23*x*y^5+y^6+7*x-y^2;; gap> g := (4*x*y^2+x^2+x^2*y-x*y^3);; gap> h := y^2 * g;; gap> G := (4*x*y^2+x^2+2*y-x*y^3);; gap> SuslinLemma( f, g, 3 ); [ -x^3*y^3-23*x^2*y^4-x*y^5+x^4*y+27*x^3*y^2+93*x^2*y^3+4*x*y^4+x^4+23*x^3*y+ x^2*y^2, 0, x^2+23*x*y+y^2 ] gap> SuslinLemma( f, g, 2 ); [ x^4*y^2+27*x^3*y^3+93*x^2*y^4+4*x*y^5+x^4*y+23*x^3*y^2+x^2*y^3-x*y^2+7*x^2, x, x^2*y+23*x*y^2+y^3 ] gap> SuslinLemma( f, g, 1 ); [ x^4*y^3+23*x^3*y^4+x^2*y^5+x^4*y^2+23*x^3*y^3+x^2*y^4+6*x^2*y-29*x^2, x*y-4*x, x^2*y^2+23*x*y^3+y^4-1 ] gap> SuslinLemma( f, g, 0 ); [ x^4*y^3+23*x^3*y^4+x^2*y^5+7*x^2*y^2-7*x^3-29*x^2*y, x*y^2-x^2-4*x*y, x^2*y^3+23*x*y^4+y^5-y ] gap> SuslinLemma( f, h, 5 ); [ -x*y^5+x^2*y^3+4*x*y^4+x^2*y^2, 0, 1] gap> SuslinLemma( f, h, 4 ); [ x^3*y^4+23*x^3*y^3+93*x^2*y^4+4*x*y^5+23*x^3*y^2+x^2*y^3-x*y^2+7*x^2, x, 23*x+y ] gap> SuslinLemma( f, h, 3 ); [ x^4*y^3+23*x^3*y^4+x^2*y^5+x^4*y^2+23*x^3*y^3+x^2*y^4-x*y^3+7*x^2*y+ 4*x*y^2-28*x^2, x*y-4*x, x^2+23*x*y+y^2 ] gap> SuslinLemma( f, h, 2 ); [ x^4*y^3+23*x^3*y^4+x^2*y^5-x*y^4+8*x^2*y^2+4*x*y^3-7*x^3-28*x^2*y, x*y^2-x^2-4*x*y, x^2*y+23*x*y^2+y^3 ] gap> SuslinLemma( f, h, 1 ); [ 0, 0, 0 ] gap> SuslinLemma( f, h, 0 ); [ 0, 0, 0 ] gap> SuslinLemma( f, G, 1 ); [ x^4*y^2+23*x^3*y^3+x^2*y^4+2*x^2*y^3+46*x*y^4+2*y^5+7*x^2*y-29*x^2-2*y, x*y-4*x, x^2*y^2+23*x*y^3+y^4-1 ]
‣ SuslinLemma ( row, pos_f, pos_g, j ) | ( operation ) |
Returns: a list
Returns a list of 5 objects: [ row * T
, T
, TI
, pos_h
, bj
].
T
is a square transformation matrix which transforms pos_h
-th entry of the row to the linear combination of the monic entry f and g (at pos_f and pos_g-th positions, respectively) with leading coefficient being the j-th coefficient bj
of g and TI
is the inverse matrix of T
.
f has to be monic and bj
is a unit.
The corresponding method should make use of the three argument SuslinLemma
(1.1-1).
InstallMethod( SuslinLemma, "for a homalg matrix and three integers", [ IsHomalgMatrix, IsInt, IsInt, IsInt ], <P/> function( row, pos_f, pos_g, j ) local c, bool_inv, f, g, bj, pos_h, h, deg_h, e, af, ag, lc, a, R, T, TI; <P/> Info( InfoQuillenSuslin, 4, "Entering SuslinLemma for row" ); <P/> if not NrRows( row ) = 1 then Error( "Number of rows should be 1\n" ); fi; <P/> c := NrColumns( row ); <P/> if c < 3 then Error( "the row has less than three columns\n" ); fi; <P/> if HasIsRightInvertibleMatrix( row ) then bool_inv := IsRightInvertibleMatrix( row ); fi; <P/> f := row[ 1, pos_f ]; g := row[ 1, pos_g ]; <P/> bj := CoefficientOfUnivariatePolynomial( g, j ); <P/> Assert( 4, IsUnit( bj ) ); ## in the local base ring <P/> pos_h := First( [ 1 .. c ], i -> not i in [ pos_f, pos_g ] ); h := row[ 1, pos_h ]; <P/> deg_h := Degree( h ); <P/> Assert( 0, deg_h < Degree( f ) and not IsMonic( h ) ); <P/> e := SuslinLemma( f, g, j ); <P/> af := e[2]; ag := e[3]; e := e[1]; <P/> Assert( 4, LeadingCoefficient( e ) = bj ); <P/> if deg_h < Degree( f ) - 1 then a := bj^-1; else lc := LeadingCoefficient( h ); a := ( 1 - lc ) * bj^-1; fi; <P/> R := HomalgRing( row ); T := HomalgInitialIdentityMatrix( c, R ); TI := HomalgInitialIdentityMatrix( c, R ); <P/> T[ pos_f, pos_h ] := a * af; T[ pos_g, pos_h ] := a * ag; <P/> TI[ pos_f, pos_h ] := -a * af; TI[ pos_g, pos_h ] := -a * ag; <P/> MakeImmutable( T ); MakeImmutable( TI ); <P/> Assert( 4, IsOne( T * TI ) ); <P/> row := row * T; <P/> if IsBound( bool_inv ) then ## We cannot algorithmically verify the line below. ## TODO: should become obsolete with ToDo-lists in MatricesForHomalg. SetIsRightInvertibleMatrix( row, bool_inv ); fi; <P/> Info( InfoQuillenSuslin, 4, "Leaving SuslinLemma for row" ); <P/> return [ row, T, TI, pos_h, bj ]; <P/> end );
Continuing of the previous example:
gap> row := HomalgMatrix( [ h, G, f, g + h ], 1, 4, R );; gap> sus := SuslinLemma( row, 3, 2, 1 ); [ <An unevaluated 1 x 4 matrix over an external ring>, <A 4 x 4 matrix over an external ring>, <A 4 x 4 matrix over an external ring>, 1, 2 ] gap> EntriesOfHomalgMatrix( sus[1] ); [ 1/2*x^5*y^2+23/2*x^4*y^3+1/2*x^3*y^4+1/2*x^4*y^2+25/2*x^3*y^3+47/2*x^2*y^4+ 2*x^2*y^3+27*x*y^4+y^5+7/2*x^3*y+x^2*y^2-29/2*x^3+7/2*x^2*y-29/2*x^2-x*y-y, -x*y^3+4*x*y^2+x^2+2*y, x^2*y^4+23*x*y^5+y^6-y^2+7*x, -x*y^5+x^2*y^3+4*x*y^4+ x^2*y^2-x*y^3+x^2*y+4*x*y^2+x^2 ] gap> EntriesOfHomalgMatrix( sus[2] ); [ 1, 0, 0, 0, 1/2*x^3*y^2+23/2*x^2*y^3+1/2*x*y^4+1/2*x^2*y^2+23/2*x*y^3+ 1/2*y^4-1/2*x-1/2, 1, 0, 0, 1/2*x^2*y-2*x^2+1/2*x*y-2*x, 0, 1, 0, 0, 0, 0, 1 ] gap> EntriesOfHomalgMatrix( sus[3] ); [ 1, 0, 0, 0, -1/2*x^3*y^2-23/2*x^2*y^3-1/2*x*y^4-1/2*x^2*y^2-23/2*x*y^3-1/2*y^4+ 1/2*x+1/2, 1, 0, 0, -1/2*x^2*y+2*x^2-1/2*x*y+2*x, 0, 1, 0, 0, 0, 0, 1 ]
‣ Horrocks ( row, o ) | ( operation ) |
Returns: a list
Returns a list of two matrices: [ T
, TI
].
T
is a square transformation matrix which transforms row to unit row. TI
is the inverse matrix of T
.
row is a unimodular matrix with at least 3 entries in which the o-th entry is monic.
gap> Q := HomalgFieldOfRationalsInSingular( );; gap> R := ( Q * "x" ) * "y"; Q[x][y] gap> row := HomalgMatrix( "[ x^2, y+1/2, x^5*y^2+y ]", 1, 3, R ); <A 1 x 3 matrix over an external ring> gap> IsRightInvertibleMatrix( row ); true gap> m1 := AMaximalIdealContaining( ZeroLeftSubmodule( BaseRing( R ) ) );; gap> m1 := EntriesOfHomalgMatrix( MatrixOfSubobjectGenerators( m1 ) );; gap> S1 := LocalizeBaseRingAtPrime( R, m1 ); ( Q[x]_< x > )[y] gap> row1 := S1 * row; <A 1 x 3 matrix over a (fake) local ring> gap> IsRightInvertibleMatrix( row1 ); true gap> H1 := Horrocks( row1, 2 ); [ <An unevaluated 3 x 3 matrix over a (fake) local ring>, <An unevaluated 3 x 3 matrix over a (fake) local ring> ] gap> EntriesOfHomalgMatrix( H1[1] ); [ 1, -y-1/2, (-x^5+2)/4, (4*x^7-4*x^5)/(x^5-2)*y+(-2*x^2+2), (-4*x^7+4*x^5)/(x^5-2)*y^2+(-4*x^2+4)/(x^5-2)*y+(x^2), (-x^7)*y+(x^7-2*x^2)/2, (-4*x^2+4)/(x^5-2), (4*x^2-4)/(x^5-2)*y+(2*x^2-2)/(x^5-2), (x^2) ] gap> EntriesOfHomalgMatrix( H1[2] ); [ (x^2), y+1/2, (x^5)*y^2+y, 0, 1, (x^5)*y+(-x^5+2)/2, (4*x^2-4)/(x^5-2), 0, 1 ] gap> Delta1 := Denominator( H1[1] ) / BaseRing( R ); x^5-2 gap> m2 := AMaximalIdealContaining( LeftSubmodule( [ Delta1 ] ) );; gap> m2 := EntriesOfHomalgMatrix( MatrixOfSubobjectGenerators( m2 ) );; gap> S2 := LocalizeBaseRingAtPrime( R, m2 ); ( Q[x]_< x^5-2 > )[y] gap> row2 := S2 * row;; gap> IsRightInvertibleMatrix( row2 ); true gap> H2 := Horrocks( row2, 2 ); [ <An unevaluated 3 x 3 matrix over a (fake) local ring>, <An unevaluated 3 x 3 matrix over a (fake) local ring> ] gap> EntriesOfHomalgMatrix( H2[1] ); [ (x^5-2)/4, (x^5-6)/(4*x^2)*y+(x^5-6)/(8*x^2), (-x^5+6)/(4*x^2), (x^7)*y+(-x^7+2*x^2)/2, (x^5)*y^2+y+(-x^5+6)/4, (-x^5)*y+(x^5-2)/2, (-x^2), -y-1/2, 1 ] gap> EntriesOfHomalgMatrix( H2[2] ); [ 1, 0, (x^5-6)/(4*x^2), 0, 1, (x^5)*y+(-x^5+2)/2, (x^2), y+1/2, (x^5)*y^2+y ] gap> Delta2 := Denominator( H2[1] ) / BaseRing( R ); 4*x^2 gap> I := LeftSubmodule( [ Delta1, Delta2 ] );; gap> IsOne( I ); true
‣ Patch ( row, Vs, VIs ) | ( operation ) |
Returns: a homalg matrix
Returns a square matrix V over a univariate polynomial ring R=B[y] over a (polynomial) base ring B, such that row*V
is equal to row with y set to 0.
The arguments Vs and VIs are lists of matrices obtained from Horrocks
over a localization of R defined by various maximal ideals of B.
VIs[j] is the inverse of Vs[j]. The denominators of Vs[j] must generate the unit ideal of B.
gap> V := Patch( row, [ H1[1], H2[1] ], [ H1[2], H2[2] ] ); <A 3 x 3 matrix over an external ring> gap> EntriesOfHomalgMatrix( V ); [ 1, 1/8*x^8*y+1/2*x^5*y-3/4*x^3*y-y, -1/16*x^13*y-1/4*x^10*y+1/2*x^8*y+x^5*y-3/4*x^3*y-y, 0, 1/2*x^10*y^2-1/4*x^10*y+2*x^7*y^2-x^7*y-2*x^5*y^2+3/2*x^5*y+2*x^2*y-\ 2*y+1, -1/4*x^15*y^2+1/8*x^15*y-x^12*y^2+1/2*x^12*y+3/2*x^10*y^2-x^10*y+2*x\ ^7*y^2-2*x^7*y-2*x^5*y^2+3/2*x^5*y+2*x^2*y-2*y, 0, -1/2*x^5*y-2*x^2*y+2*y, 1/4*x^10*y+x^7*y-3/2*x^5*y-2*x^2*y+2*y+1 ] gap> EntriesOfHomalgMatrix( row * V ); [ x^2, 1/2, 0 ] gap> y := RelativeIndeterminatesOfPolynomialRing( R )[1];; gap> row * V = Value( row, y, Zero( y ) ); true
‣ QuillenSuslinUnipotent ( mat ) | ( operation ) |
Returns: a list of two homalg matrices
Compute for the r × c-matrix mat a square matrix V such that mat * V is a lower unipotent matrix.
‣ QuillenSuslin ( mat ) | ( operation ) |
Returns: a homalg matrix
For the given r × c-matrix mat, compute a square matrix V such that mat * V is equal to the first r rows of the c × c identity matrix.
generated by GAPDoc2HTML