# SPDX-License-Identifier: GPL-2.0-or-later # GradedModules: A homalg based package for the Abelian category of finitely presented graded modules over computable graded rings # # Implementations #
## Implementations of procedures for the pair of adjoint Tate functors.
## ## Removes the morphism of lowest degree in the complex T and instead adds another (minimal) morphism there having the same image.
InstallMethod( MinimizeLowestDegreeMorphism, "for homalg modules",
[ IsCocomplexOfFinitelyPresentedObjectsRep ],
function( T )
local phi, N, TT;
phi:= ImageObjectEmb( LowestDegreeMorphism( T ) );
N := Source( phi );
ByASmallerPresentation( N );
phi := PreCompose( CokernelEpi( PresentationMorphism( N ) ), phi ); if Length( ObjectDegreesOfComplex( T ) ) = 2then
TT := HomalgCocomplex( phi, LowestDegree( T ) ); else
TT := Subcomplex( T, LowestDegree( T ) + 1, HighestDegree( T ) );
Add( phi, TT ); fi;
return TT;
end );
#################################### # # methods for operations: # ####################################
## <#GAPDoc Label="TateResolution"> ## <ManSection> ## <Oper Arg="M, degree_lowest, degree_highest" Name="TateResolution"/> ## <Returns>a &homalg; cocomplex</Returns> ## <Description> ## Compute the Tate resolution of the sheaf <A>M</A>. ## <#Include Label="TateResolution:example1"> ## In the following we construct the different exterior powers of the cotangent bundle ## shifted by <M>1</M>. Observe how a single <M>1</M> travels along the diagnoal ## in the window <M>[ -3 .. 0 ] x [ 0 .. 3 ]</M>. <Br/><Br/> ## First we start with the structure sheaf with its Tate resolution: ## <#Include Label="TateResolution:example2"> ## The Castelnuovo-Mumford regularity of the <E>underlying module</E> is distinguished ## among the list of twists by the character <C>'V'</C> pointing to it. It is <E>not</E> ## an invariant of the sheaf (see the next diagram). <Br/><Br/> ## The residue class field (i.e. S modulo the maximal homogeneous ideal): ## <#Include Label="TateResolution:example3"> ## Another way of constructing the structure sheaf: ## <#Include Label="TateResolution:example4"> ## The cotangent bundle: ## <#Include Label="TateResolution:example5"> ## the cotangent bundle shifted by <M>1</M> with its Tate resolution: ## <#Include Label="TateResolution:example6"> ## The second power <M>U^2</M> of the shifted cotangent bundle <M>U=U^1</M> and its Tate resolution: ## <#Include Label="TateResolution:example7"> ## The third power <M>U^3</M> of the shifted cotangent bundle <M>U=U^1</M> and its Tate resolution: ## <#Include Label="TateResolution:example8"> ## Another way to construct <M>U^2=U^(3-1)</M>: ## <#Include Label="TateResolution:example9"> ## </Description> ## </ManSection> ## <#/GAPDoc> ## gap> Display(S); ## Q[x0,x1,x2,x3] ## gap> Display(A); ## Q{e0,e1,e2,e3} ## gap> Display(cotangent); ## x1,-x2,x3,0, 0, 0, ## x0,0, 0, -x2,x3, 0, ## 0, x0, 0, -x1,0, x3, ## 0, 0, x0,0, -x1,x2 ## ## (graded, generators degrees: [ 2, 2, 2, 2, 2, 2 ]) ## ## Cokernel of the map ## ## R^(1x4) --> R^(1x6), ( for R := Q[x0,x1,x2,x3] ) ## ## currently represented by the above matrix ##
InstallGlobalFunction( _Functor_TateResolution_OnGradedModules, ### defines: TateResolution (object part)
function( l, _M )
local A, degree_lowest, degree_highest, M, CM, p, d_low, d_high, T, positions,
old_degrees, old_T, tate, i, K, Kres, degrees, CM_sheaf, result;
if not Length( l ) = 3then
Error( "wrong number of elements in zeroth parameter, expected an exterior algebra and two integers" ); else
A := l[1];
degree_lowest := l[2];
degree_highest := l[3]; if not ( IsHomalgRing( A ) and IsExteriorRing( A ) and IsInt( degree_lowest ) and IsInt( degree_highest ) ) then
Error( "wrong number of elements in zeroth parameter, expected an exterior algebra and two integers" ); fi; fi;
if IsHomalgRing( _M ) then
M := FreeRightModuleWithDegrees( 1, _M ); else
M := _M; fi;
CM := ValueOption( "CM" );
if not IsInt( CM ) then
CM := CastelnuovoMumfordRegularity( M );
CM := HomalgElementToInteger( CM );
fi;
if not IsBound( M!.TateResolution ) then
M!.TateResolution := rec( ); fi;
p := PositionOfTheDefaultPresentation( M );
if IsGradedModuleRep( M ) and IsBound( M!.TateResolution!.(p) ) then
# restore the original presentations # (Perform needs a return value)
Perform( old_T, function( a ) SetPositionOfTheDefaultPresentation( a, 1 ); return true; end);
else
d_high := Maximum( CM, degree_lowest );
d_low := d_high;
tate := RepresentationMapOfKoszulId( d_high, M, A );
T := HomalgCocomplex( tate, d_high );
old_T := ShallowCopy( ObjectsOfComplex( T ) );
positions := List( ObjectsOfComplex( T ), PositionOfTheDefaultPresentation );
fi;
## above the Castelnuovo-Mumford regularity for i in [ d_high + 1 .. degree_highest - 1 ] do
## the Koszul map has linear entries by construction
tate := RepresentationMapOfKoszulId( i, M, A );
Add( T, tate );
od;
## below the Castelnuovo-Mumford regularity if degree_lowest < d_low then
# The morphism of lowest degree is not part of a minimal complex. # However, its image is the kernel of the following map. # Thus, we find a minimal map having the same image.
T := MinimizeLowestDegreeMorphism( T );
tate := LowestDegreeMorphism( T );
K := Kernel( tate );
## get rid of the units in the presentation of the kernel K
ByASmallerPresentation( K );
Kres := Resolution( d_low - degree_lowest, K );
tate := PreCompose( CoveringEpi( K ), KernelEmb( tate ) );
Add( tate, T );
for i in [ 1 .. d_low - degree_lowest - 1 ] do
tate := CertainMorphism( Kres, i );
Add( tate, T );
od;
if not HasCastelnuovoMumfordRegularityOfSheafification( M ) then
for i in Reversed( [ degree_lowest .. d_low - 1 ] ) do
degrees := DegreesOfGenerators( CertainObject( T, i ) );
if Minimum( degrees ) < Minimum( old_degrees ) - 1then
SetCastelnuovoMumfordRegularityOfSheafification( M, i + 1 );
break;
fi;
old_degrees := degrees;
od;
fi;
fi;
fi;
## check assertion
Assert( 3, IsAcyclic( T ) );
SetIsAcyclic( T, true );
## pass some options to the operation BettiTable (applied on complexes):
T!.display_twist := true;
T!.EulerCharacteristic := HilbertPolynomial( M );
## starting from the Castelnuovo-Mumford regularity ## (and going right) all higher cohomologies vanish if HasCastelnuovoMumfordRegularityOfSheafification( M ) then
CM_sheaf := CastelnuovoMumfordRegularityOfSheafification( M );
T!.higher_vanish := CM_sheaf;
T!.markers := [ [ CM_sheaf, "S" ], [ CM, "M" ] ]; else
T!.higher_vanish := CM;
T!.markers := [ [ CM, "M" ] ]; fi;
if IsGradedModuleRep( M ) then
M!.TateResolution!.(p) := T; fi;
result := Subcomplex( T, degree_lowest, degree_highest );
## check assertion
Assert( 3, IsAcyclic( result ) );
SetIsAcyclic( result, true );
## pass some options to the operation BettiTable (applied on complexes):
result!.display_twist := true;
result!.EulerCharacteristic := HilbertPolynomial( M );
## starting from the Castelnuovo-Mumford regularity ## (and going right) all higher cohomologies vanish if HasCastelnuovoMumfordRegularityOfSheafification( M ) then
CM_sheaf := CastelnuovoMumfordRegularityOfSheafification( M );
result!.higher_vanish := CM_sheaf;
result!.markers := [ [ CM_sheaf, "S" ], [ CM, "M" ] ]; else
result!.higher_vanish := CM;
result!.markers := [ [ CM, "M" ] ]; fi;
# restore the presentation from the beginning of the procedure for i in [ 1 .. Length( old_T ) ] do
SetPositionOfTheDefaultPresentation( old_T[i], positions[i] );
od;
function( F_source, F_target, arg_before_pos, phi, arg_behind_pos )
local l, A, degree_lowest, degree_highest, degree_highest2, CM, T_source, T_range, T, T2, ii, i;
l := arg_before_pos[1];
if not Length( l ) = 3then
Error( "wrong number of elements in zeroth parameter, expected an exterior algebra and two integers" ); else
A := l[1];
degree_lowest := l[2];
degree_highest := l[3]; if not ( IsHomalgRing( A ) and IsExteriorRing( A ) and IsInt( degree_lowest ) and IsInt( degree_highest ) ) then
Error( "wrong number of elements in 0th parameter, expected an exterior algebra and two integers" ); fi; fi;
CM := ValueOption( "CM" );
if not IsInt( CM ) then
CM := CastelnuovoMumfordRegularity( phi );
CM := HomalgElementToInteger( CM );
fi;
degree_highest2 := Maximum( degree_highest, CM + 1 );
# we need to compute the module down from the CastelnuovoMumfordRegularity
T_source := TateResolution( Source( phi ), A, degree_lowest, degree_highest2 );
T_range := TateResolution( Range( phi ), A, degree_lowest, degree_highest2 );
i := degree_highest2;
T2 := HomalgChainMorphism( A * HomogeneousPartOverCoefficientsRing( i, phi ), T_source, T_range, i ); if degree_highest2 = degree_highest then
T := HomalgChainMorphism( LowestDegreeMorphism( T2 ), F_source, F_target, i ); fi;
for ii in [ degree_lowest .. degree_highest2 - 1 ] do
Add( CompleteImageSquare( CertainMorphism( T_source, i ), LowestDegreeMorphism( T2 ), CertainMorphism( T_range, i ) ), T2 );
if i <= degree_highest and not IsBound( T ) then
T := HomalgChainMorphism( LowestDegreeMorphism( T2 ), F_source, F_target, i ); elif i < degree_highest then
Add( LowestDegreeMorphism( T2 ), T ); fi;
## written for Sepp's talk, it has to become functorial in the future
InstallMethod( TateResolution, "for homalg modules",
[ IsHomalgModule, IsInt, IsInt ],
function( L, degree_lowest, degree_highest )
local A, mu0, tate, inj, mu;
A := HomalgRing( L );
if not ( HasIsExteriorRing( A ) and IsExteriorRing( A ) ) then
TryNextMethod( ); fi;
function( l, _M )
local A, degree_lowest, degree_highest, n, M, CM, p, d_low, d_high, tate, T, i, know_regularity, ii, K, deg, certain_deg, phi, regularity, result;
if not Length( l ) = 3then
Error( "wrong number of elements in zeroth parameter, expected an exterior algebra and two integers" ); else
A := l[1];
degree_lowest := l[2];
degree_highest := l[3]; if not ( IsHomalgRing( A ) and IsExteriorRing( A ) and IsInt( degree_lowest ) and IsInt( degree_highest ) )then
Error( "wrong number of elements in zeroth parameter, expected an exterior algebra and two integers." ); fi; fi;
n := Length( IndeterminateAntiCommutingVariablesOfExteriorRing( A ) );
if IsHomalgRing( _M ) then
M := FreeRightModuleWithDegrees( 1, _M ); else
M := _M; fi;
CM := ValueOption( "CM" );
if not IsInt( CM ) then
CM := CastelnuovoMumfordRegularity( M );
CM := HomalgElementToInteger( CM );
fi;
p := PositionOfTheDefaultPresentation( M );
if not IsBound( M!.LinearStrandOfTateResolution ) then
M!.LinearStrandOfTateResolution := rec( ); fi;
if IsGradedModuleRep( M ) and IsBound( M!.LinearStrandOfTateResolution!.(p) ) then
regularity := M!.LinearStrandOfTateResolution!.(p)[1]; if IsInt( regularity ) then
know_regularity := true; else
know_regularity := false; fi;
else
d_high := Maximum( CM, degree_lowest );
d_low := d_high;
tate := RepresentationMapOfKoszulId( d_high, M, A );
T := HomalgCocomplex( tate, d_high );
know_regularity := false;
fi;
## above the Castelnuovo-Mumford regularity for i in [ d_high + 1 .. degree_highest - 1 ] do
## the Koszul map has linear entries by construction
tate := RepresentationMapOfKoszulId( i, M, A );
Add( T, tate );
od;
## below the Castelnuovo-Mumford regularity if degree_lowest < d_low then
# The morphism of lowest degree is not part of a minimal complex. # However, its image is the kernel of the following map. # Thus, we find a minimal map having the same image. if LowestDegree( T ) = CM then
T := MinimizeLowestDegreeMorphism( T ); fi;
if know_regularity then
ResolveLinearly( d_low - degree_lowest, T, n ); else
regularity := ResolveLinearly( d_low - degree_lowest, T, n ); fi;
if regularity = fail then
know_regularity := false; else
know_regularity := true; fi; fi;
## pass some options to the operation BettiTable (applied on complexes):
T!.display_twist := true;
## starting from the Castelnuovo-Mumford regularity ## (and going right) all higher cohomologies vanish
T!.higher_vanish := CM;
if IsGradedModuleRep( M ) then
M!.LinearStrandOfTateResolution!.(p) := [ fail, T ]; fi;
result := Subcomplex( T, degree_lowest, degree_highest );
## pass some options to the operation BettiTable (applied on complexes):
result!.display_twist := true;
## starting from the Castelnuovo-Mumford regularity ## (and going right) all higher cohomologies vanish
result!.higher_vanish := CM;
if know_regularity then
result!.regularity := Maximum( HOMALG_GRADED_MODULES!.LowerTruncationBound, regularity );
M!.LinearStrandOfTateResolution!.(p)[1] := result!.regularity; else
result!.regularity := degree_lowest; fi;
Assert( 3, IsComplex( result ) );
SetIsComplex( result, true );
function( F_source, F_target, arg_before_pos, phi, arg_behind_pos )
local l, A, degree_lowest, degree_highest, n, degree_highest2, CM, T_source, T_range, T, T2, ii, i;
l := arg_before_pos[1];
if not Length( l ) = 3then
Error( "wrong number of elements in zeroth parameter, expected an exterior algebra and two integers" ); else
A := l[1];
degree_lowest := l[2];
degree_highest := l[3]; if not ( IsHomalgRing( A ) and IsExteriorRing( A ) and IsInt( degree_lowest ) and IsInt( degree_highest ) ) then
Error( "wrong number of elements in 0th parameter, expected an exterior algebra and two integers" ); fi; fi;
n := Length( IndeterminateAntiCommutingVariablesOfExteriorRing( A ) );
CM := ValueOption( "CM" );
if not IsInt( CM ) then
CM := CastelnuovoMumfordRegularity( phi );
CM := HomalgElementToInteger( CM );
fi;
degree_highest2 := Maximum( degree_highest, CM + 1 );
# We need to compute the module down from the CastelnuovoMumfordRegularity # So the Ts are just longer versions of the Fs
T_source := LinearStrandOfTateResolution( Source( phi ), A, degree_lowest, degree_highest2 );
T_range := LinearStrandOfTateResolution( Range( phi ), A, degree_lowest, degree_highest2 );
i := degree_highest2;
T2 := HomogeneousPartOverCoefficientsRing( i, phi );
T2 := A^(-n) * ( A * T2 );
T2 := HomalgChainMorphism( T2, T_source, T_range, i ); if degree_highest2 = degree_highest then
T := HomalgChainMorphism( LowestDegreeMorphism( T2 ), F_source, F_target, i ); fi;
for ii in [ degree_lowest .. degree_highest2 - 1 ] do
Add( CompleteImageSquare( CertainMorphism( T_source, i ), LowestDegreeMorphism( T2 ), CertainMorphism( T_range, i ) ), T2 );
if i <= degree_highest and not IsBound( T ) then
T := HomalgChainMorphism( LowestDegreeMorphism( T2 ), F_source, F_target, i ); elif i < degree_highest then
Add( LowestDegreeMorphism( T2 ), T ); fi;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.