Goto Chapter: Top 1 2 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

1 Quillen-Suslin
 1.1 Tool procedures
 1.2 Main procedures

1 Quillen-Suslin

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].

1.1 Tool procedures

1.1-1 SuslinLemma
‣ 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 ]

1.1-2 SuslinLemma
‣ 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 ]

1.1-3 Horrocks
‣ 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

1.1-4 Patch
‣ 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

1.2 Main procedures

1.2-1 QuillenSuslinUnipotent
‣ QuillenSuslinUnipotent( mat )( operation )

Returns: a list of two homalg matrices

Compute for the \(r \times c\)-matrix mat a square matrix \(V\) such that mat \(* V\) is a lower unipotent matrix.

1.2-2 QuillenSuslin
‣ QuillenSuslin( mat )( operation )

Returns: a homalg matrix

For the given \(r \times c\)-matrix mat, compute a square matrix \(V\) such that mat \(* V\) is equal to the first \(r\) rows of the \(c \times c\) identity matrix.

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 Bib Ind

generated by GAPDoc2HTML