Skip to content

Commit 3c2335f

Browse files
additive closure of Bézout domain is pre-abelian
1 parent d02a022 commit 3c2335f

6 files changed

Lines changed: 101 additions & 31 deletions

File tree

AdditiveClosuresForCAP/PackageInfo.g

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ SetPackageInfo( rec(
1010

1111
PackageName := "AdditiveClosuresForCAP",
1212
Subtitle := "Additive closures for pre-abelian categories",
13-
Version := "2025.06-01",
13+
Version := "2025.07-01",
1414
Date := (function ( ) if IsBound( GAPInfo.SystemEnvironment.GAP_PKG_RELEASE_DATE ) then return GAPInfo.SystemEnvironment.GAP_PKG_RELEASE_DATE; else return Concatenation( ~.Version{[ 1 .. 4 ]}, "-", ~.Version{[ 6, 7 ]}, "-01" ); fi; end)( ),
1515
License := "GPL-2.0-or-later",
1616

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#! @Chapter Example on additive closure
2+
3+
#! @Section The category of rows over a Bézout domain is pre-abelian.
4+
5+
#! @Example
6+
LoadPackage( "AdditiveClosuresForCAP", false );
7+
#! true
8+
zz := HomalgRingOfIntegers( );
9+
#! Z
10+
Zmat := CategoryOfRows( zz );
11+
#! Rows( Z )
12+
Display( Zmat );
13+
#! A CAP category with name Rows( Z ):
14+
#!
15+
#! 83 primitive operations were used to derive 425 operations for this category \
16+
#! which algorithmically
17+
#! * IsEquippedWithHomomorphismStructure
18+
#! * IsLinearCategoryOverCommutativeRingWithFinitelyGeneratedFreeExternalHoms
19+
#! * IsPreAbelianCategory
20+
#! * IsRigidSymmetricClosedMonoidalCategory
21+
#! * IsRigidSymmetricCoclosedMonoidalCategory
22+
#! and furthermore mathematically
23+
#! * IsSkeletalCategory
24+
#! * IsStrictMonoidalCategory
25+
mat := HomalgMatrix(
26+
[ [ -36, 18, -80, -54, 28 ],
27+
[ 90, -45, 140, 45, -40 ],
28+
[ -24, 12, -32, -4, 8 ],
29+
[ -6, 3, -4, 5, 0 ] ], zz );;
30+
mor := mat / Zmat;
31+
#! <A morphism in Rows( Z )>
32+
split_epi := CoimageProjection( mor );
33+
#! <An epimorphism in Rows( Z )>
34+
IsSplitEpimorphism( split_epi );
35+
#! true
36+
split_mono := ImageEmbedding( mor );
37+
#! <A monomorphism in Rows( Z )>
38+
IsSplitMonomorphism( split_mono );
39+
#! true
40+
epimono := MorphismFromCoimageToImage( mor );
41+
#! <A morphism in Rows( Z )>
42+
IsEpimorphism( epimono );
43+
#! true
44+
IsMonomorphism( epimono );
45+
#! true
46+
LiftAlongMonomorphism( split_mono, AstrictionToCoimage( mor ) ) = epimono;
47+
#! true
48+
ColiftAlongEpimorphism( split_epi, CoastrictionToImage( mor ) ) = epimono;
49+
#! true
50+
PreCompose( [ split_epi, epimono, split_mono ] ) = mor;
51+
#! true
52+
#! @EndExample

AdditiveClosuresForCAP/gap/CategoryOfRows.gi

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,14 @@ end );
311311
InstallGlobalFunction( INSTALL_FUNCTIONS_FOR_CATEGORY_OF_ROWS,
312312

313313
function( category )
314-
local ring, is_defined_over_field;
314+
local ring, is_defined_over_bezout_domain, is_defined_over_field;
315315

316316
ring := UnderlyingRing( category );
317317

318+
is_defined_over_bezout_domain :=
319+
HasIsBezoutRing( ring ) and IsBezoutRing( ring ) and
320+
HasIsIntegralDomain( ring ) and IsIntegralDomain( ring );
321+
318322
is_defined_over_field := HasIsFieldForHomalg( ring ) and IsFieldForHomalg( ring );
319323

320324
## Well-defined for objects and morphisms
@@ -735,29 +739,9 @@ InstallGlobalFunction( INSTALL_FUNCTIONS_FOR_CATEGORY_OF_ROWS,
735739

736740
end );
737741

738-
## Abelian case
742+
## Pre-Abelian case
739743

740-
if is_defined_over_field then
741-
742-
## enough projectives & injectives
743-
744-
##
745-
AddSomeProjectiveObject( category, { cat, obj } -> obj );
746-
747-
##
748-
AddEpimorphismFromSomeProjectiveObject( category, { cat, obj } -> IdentityMorphism( cat, obj ) );
749-
750-
##
751-
AddIsProjective( category, { cat, obj } -> true, 1 );
752-
753-
##
754-
AddSomeInjectiveObject( category, { cat, obj } -> obj );
755-
756-
##
757-
AddMonomorphismIntoSomeInjectiveObject( category, { cat, obj } -> IdentityMorphism( cat, obj ) );
758-
759-
##
760-
AddIsInjective( category, { cat, obj } -> true, 1 );
744+
if is_defined_over_bezout_domain then
761745

762746
##
763747
AddKernelObject( category,
@@ -772,7 +756,7 @@ InstallGlobalFunction( INSTALL_FUNCTIONS_FOR_CATEGORY_OF_ROWS,
772756
function( cat, morphism )
773757
local kernel_emb, kernel_object;
774758

775-
kernel_emb := SyzygiesOfRows( UnderlyingMatrix( morphism ) );
759+
kernel_emb := BasisOfRows( SyzygiesOfRows( UnderlyingMatrix( morphism ) ) );
776760

777761
kernel_object := CategoryOfRowsObject( cat, NrRows( kernel_emb ) ); # taking NrRows could be avoided by using a WithGiven version
778762

@@ -793,14 +777,20 @@ InstallGlobalFunction( INSTALL_FUNCTIONS_FOR_CATEGORY_OF_ROWS,
793777
function( cat, morphism )
794778
local cokernel_proj, cokernel_obj;
795779

796-
cokernel_proj := SyzygiesOfColumns( UnderlyingMatrix( morphism ) );
780+
cokernel_proj := BasisOfColumns( SyzygiesOfColumns( UnderlyingMatrix( morphism ) ) );
797781

798782
cokernel_obj := CategoryOfRowsObject( cat, NrColumns( cokernel_proj ) ); # taking NrColumns could be avoided by using a WithGiven version
799783

800784
return CategoryOfRowsMorphism( cat, Range( morphism ), cokernel_proj, cokernel_obj );
801785

802786
end );
803787

788+
fi;
789+
790+
## Abelian case
791+
792+
if is_defined_over_field then
793+
804794
##
805795
AddImageObject( category,
806796
function( cat, morphism )
@@ -839,6 +829,26 @@ InstallGlobalFunction( INSTALL_FUNCTIONS_FOR_CATEGORY_OF_ROWS,
839829

840830
end );
841831

832+
## enough projectives & injectives
833+
834+
##
835+
AddSomeProjectiveObject( category, { cat, obj } -> obj );
836+
837+
##
838+
AddEpimorphismFromSomeProjectiveObject( category, { cat, obj } -> IdentityMorphism( cat, obj ) );
839+
840+
##
841+
AddIsProjective( category, { cat, obj } -> true, 1 );
842+
843+
##
844+
AddSomeInjectiveObject( category, { cat, obj } -> obj );
845+
846+
##
847+
AddMonomorphismIntoSomeInjectiveObject( category, { cat, obj } -> IdentityMorphism( cat, obj ) );
848+
849+
##
850+
AddIsInjective( category, { cat, obj } -> true, 1 );
851+
842852
##
843853
AddSomeReductionBySplitEpiSummand( category,
844854
function( cat, alpha )

AdditiveClosuresForCAP/gap/CategoryOfRows_as_AdditiveClosure_RingAsCategory.gi

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ InstallMethod( CategoryOfRows_as_AdditiveClosure_RingAsCategory,
1919
[ "FinalizeCategory", true ],
2020
],
2121
function( CAP_NAMED_ARGUMENTS, homalg_ring )
22-
local ring_as_category, add, is_defined_over_field, object_constructor, modeling_tower_object_constructor, object_datum, modeling_tower_object_datum, morphism_constructor, modeling_tower_morphism_constructor, morphism_datum, modeling_tower_morphism_datum, wrapper;
22+
local ring_as_category, add, is_defined_over_bezout_domain, is_defined_over_field, object_constructor, modeling_tower_object_constructor, object_datum, modeling_tower_object_datum, morphism_constructor, modeling_tower_morphism_constructor, morphism_datum, modeling_tower_morphism_datum, wrapper;
2323

2424
ring_as_category := RING_AS_CATEGORY( homalg_ring );
2525

@@ -37,6 +37,10 @@ InstallMethod( CategoryOfRows_as_AdditiveClosure_RingAsCategory,
3737

3838
fi;
3939

40+
is_defined_over_bezout_domain :=
41+
HasIsBezoutRing( homalg_ring ) and IsBezoutRing( homalg_ring ) and
42+
HasIsIntegralDomain( homalg_ring ) and IsIntegralDomain( homalg_ring );
43+
4044
is_defined_over_field := HasIsFieldForHomalg( homalg_ring ) and IsFieldForHomalg( homalg_ring );
4145

4246
if is_defined_over_field then
@@ -47,6 +51,10 @@ InstallMethod( CategoryOfRows_as_AdditiveClosure_RingAsCategory,
4751

4852
SetIsAbelianCategoryWithEnoughInjectives( add, true );
4953

54+
elif is_defined_over_bezout_domain then
55+
56+
SetIsPreAbelianCategory( add, true );
57+
5058
fi;
5159

5260
Finalize( add );

CAP/gap/DerivedMethods.autogen.gi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ AddDerivationToCAP( CoimageProjection,
147147

148148
function ( cat_1, alpha_1 )
149149
return PostCompose( cat_1, IsomorphismFromCokernelOfKernelToCoimage( cat_1, alpha_1 ), CokernelProjection( cat_1, KernelEmbedding( cat_1, alpha_1 ) ) );
150-
end : CategoryFilter := IsAbelianCategory,
150+
end : CategoryFilter := IsPreAbelianCategory,
151151
Weight := 1,
152152
is_autogenerated_by_CompilerForCAP := true );
153153

CAP/gap/DerivedMethods.gi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ AddDerivationToCAP( ImageEmbedding,
500500
return PreCompose( cat, IsomorphismFromImageObjectToKernelOfCokernel( cat, mor ),
501501
image_embedding );
502502

503-
end : CategoryFilter := IsAbelianCategory ); ##FIXME: PreAbelian?
503+
end : CategoryFilter := IsPreAbelianCategory );
504504

505505
##
506506
AddDerivationToCAP( CoastrictionToImage,
@@ -2935,7 +2935,7 @@ AddFinalDerivationBundle( "IsomorphismFromImageObjectToKernelOfCokernel as the i
29352935
return IdentityMorphism( cat, kernel_of_cokernel );
29362936

29372937
end,
2938-
] : CategoryFilter := IsAbelianCategory );
2938+
] : CategoryFilter := IsPreAbelianCategory );
29392939

29402940
##
29412941
AddDerivationToCAP( MorphismFromCoimageToImageWithGivenObjects,
@@ -3012,7 +3012,7 @@ AddFinalDerivationBundle( "IsomorphismFromCoimageToCokernelOfKernel as the ident
30123012
return IdentityMorphism( cat, cokernel_of_kernel );
30133013

30143014
end,
3015-
] : CategoryFilter := IsAbelianCategory );
3015+
] : CategoryFilter := IsPreAbelianCategory );
30163016

30173017
## Final methods for initial object
30183018

0 commit comments

Comments
 (0)