Skip to content

Commit 031f2fe

Browse files
Merge pull request #67 from mohamed-barakat/CoequalizerOfIdentityAndAutos
AddProjectionOntoCoequalizerOfIdentityAndAutomorphisms
2 parents 5375a19 + f5e1925 commit 031f2fe

6 files changed

Lines changed: 70 additions & 30 deletions

PackageInfo.g

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ SetPackageInfo( rec(
1010

1111
PackageName := "FinGSetsForCAP",
1212
Subtitle := "The (skeletal) elementary topos of finite G-sets",
13-
Version := "2026.05-01",
13+
Version := "2026.05-03",
1414

1515
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)( ),
1616
License := "GPL-2.0-or-later",
@@ -99,7 +99,7 @@ Dependencies := rec(
9999
GAP := ">= 4.13.0",
100100
NeededOtherPackages := [
101101
[ "GAPDoc", ">= 1.5" ],
102-
[ "CAP", ">= 2025.03-02" ],
102+
[ "CAP", ">= 2026.05-02" ],
103103
[ "GroupsAsCategoriesForCAP", ">= 2026.04-02" ],
104104
[ "FinSetsForCAP", ">= 2022.05-01" ],
105105
],

examples/SkeletalCategoryOfTransitiveLeftGSets.g

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ Display( TS3 );
1414
#! A CAP category with name SkeletalCategoryOfTransitiveLeftGSets( S3 ) \
1515
#! with 4 objects:
1616
#!
17-
#! 24 primitive operations were used to derive 71 operations for this category \
17+
#! 25 primitive operations were used to derive 80 operations for this category \
1818
#! which algorithmically
1919
#! * IsCategoryWithDecidableColifts
2020
#! * IsCategoryWithDecidableLifts
2121
#! * IsCategoryWithTerminalObject
2222
#! * IsFiniteCategory
23-
#! * IsCategoryWithCoequalizers
2423
#! * IsEquippedWithHomomorphismStructure
24+
#! * IsCategoryWithCoequalizers
2525
#! and not yet algorithmically
2626
#! * IsFinitelyPresentedCategory
2727
#! and furthermore mathematically
@@ -104,8 +104,8 @@ Print( DotVertexLabelledDigraph( digraph ) );
104104
#! 2 -> 4
105105
#! 3 -> 4
106106
#! }
107-
ForAll( objs, o -> o = Coequalizer( Omega1,
108-
List( CoequalizerMorphisms( o ), g -> g / TS3 ) ) );
107+
ForAll( objs, o -> o = CoequalizerOfIdentityAndAutomorphisms( Omega1,
108+
List( CoequalizerAutomorphisms( o ), g -> g / TS3 ) ) );
109109
#! true
110110

111111
#! @EndExample

examples/notebooks/TS4.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,13 @@
112112
"text": [
113113
"A CAP category with name SkeletalCategoryOfTransitiveLeftGSets( S4 ) with 11 objects:\n",
114114
"\n",
115-
"24 primitive operations were used to derive 71 operations for this category which algorithmically\n",
115+
"25 primitive operations were used to derive 80 operations for this category which algorithmically\n",
116116
"* IsCategoryWithDecidableColifts\n",
117117
"* IsCategoryWithDecidableLifts\n",
118118
"* IsCategoryWithTerminalObject\n",
119119
"* IsFiniteCategory\n",
120-
"* IsCategoryWithCoequalizers\n",
121120
"* IsEquippedWithHomomorphismStructure\n",
121+
"* IsCategoryWithCoequalizers\n",
122122
"and furthermore mathematically\n",
123123
"* IsSkeletalCategory\n"
124124
]

gap/SkeletalCategoryOfTransitiveLeftGSets.gd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,11 @@ DeclareAttribute( "Size",
160160

161161
#! @Description
162162
#! The input is a transitive left $G$-set <A>Omega</A> $\cong G / U_i$.
163-
#! The output is the list of endomorphisms of the principal $G$-set $G / U_1$ defined by the generators of $U_i$.
164-
#! The coequalizers of these morphisms is the input object <A>Omega</A> $\cong G / U_i$.
163+
#! The output is the list of automorphisms of the principal $G$-set $G / U_1$ defined by the generators of $U_i$.
164+
#! The coequalizers of the identity and these automorphisms is the input object <A>Omega</A> $\cong G / U_i$.
165165
#! @Arguments Omega
166166
#! @Returns a list of morphisms
167-
DeclareAttribute( "CoequalizerMorphisms",
167+
DeclareAttribute( "CoequalizerAutomorphisms",
168168
IsObjectInSkeletalCategoryOfTransitiveLeftGSets );
169169

170170
DeclareAttribute( "EmbeddingOfUnderlyingGroupAsCategoryData",

gap/SkeletalCategoryOfTransitiveLeftGSets.gi

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,10 @@ InstallMethod( SkeletalCategoryOfTransitiveLeftGSets,
297297
end );
298298

299299
## for two parallel morphisms uniquely determined by their images of the standard left coset
300-
## phi: G/U[s] → G/U[t], U[s] ↦ a U[t], psi: G/U[s] → G/U[t], U[s] ↦ b U[t],
301-
## the projection onto the coequalizer is given by a morphism pi: G/U[t] → G/U[p], U[t] ↦ a U[p],
302-
## which has to satisfy U[t] ⊆ ᵍU[p] and (a g) U[p] = (b g) U[p] ⟺ g⁻¹ a⁻¹ b g ∈ U[p],
303-
## which simplify to ⟨ U[t], a⁻¹ b ⟩ ⊆ ᵍU[p], and hence ⟨ U[t], a⁻¹ b ⟩ = ᵍU[p].
300+
## φ: G/U[s] → G/U[t], U[s] ↦ a U[t], ψ: G/U[s] → G/U[t], U[s] ↦ b U[t],
301+
## the projection onto the coequalizer is given by a morphism π: G/U[t] → G/U[c], U[t] ↦ g U[c],
302+
## which has to satisfy U[t]U[c] and (a g) U[c] = (b g) U[c] ⟺ g⁻¹ a⁻¹ b g ∈ U[c],
303+
## which simplify to ⟨ U[t], a⁻¹ b ⟩U[c], and hence ⟨ U[t], a⁻¹ b ⟩ = U[c].
304304
AddProjectionOntoCoequalizer( SkeletalTransitiveGSets,
305305
function ( SkeletalTransitiveGSets, target, diagram )
306306
local G, U, objects, t, l, gs, C, Ucoeq, index, cards, positions, pos, g, coeq;
@@ -317,7 +317,7 @@ InstallMethod( SkeletalCategoryOfTransitiveLeftGSets,
317317

318318
gs := List( [ 1 .. l ], i -> UnderlyingGroupElement( diagram[i] ) );
319319

320-
C := List( [ 1 .. l - 1 ], i -> Inverse( gs[i] ) * gs[i + 1] ); ## gs[1] is taken 1 in CoequalizerMorphisms
320+
C := List( [ 1 .. l - 1 ], i -> Inverse( gs[i] ) * gs[i + 1] );
321321

322322
Ucoeq := Subgroup( G, Concatenation( GeneratorsOfGroup( U[t] ), C ) );
323323

@@ -327,9 +327,49 @@ InstallMethod( SkeletalCategoryOfTransitiveLeftGSets,
327327

328328
positions := Filtered( [ 1 .. NumberOfObjects( SkeletalTransitiveGSets ) ], i -> cards[i] = index );
329329

330-
## pos := SafeUniqueEntry( positions, p -> IsConjugate( G, Ucoeq, U[p] ) );
330+
## pos := SafeUniqueEntry( positions, c -> IsConjugate( G, Ucoeq, U[c] ) );
331331
## but for performance we use:
332-
pos := SafeFirst( positions, p -> IsConjugate( G, Ucoeq, U[p] ) );
332+
pos := SafeFirst( positions, c -> IsConjugate( G, Ucoeq, U[c] ) );
333+
334+
g := RepresentativeAction( G, Ucoeq, U[pos] );
335+
336+
coeq := objects[pos];
337+
338+
return MorphismConstructor( SkeletalTransitiveGSets,
339+
target,
340+
g,
341+
coeq );
342+
343+
end );
344+
345+
##
346+
AddProjectionOntoCoequalizerOfIdentityAndAutomorphisms( SkeletalTransitiveGSets,
347+
function ( SkeletalTransitiveGSets, target, diagram )
348+
local G, U, objects, t, l, gs, Ucoeq, index, cards, positions, pos, g, coeq;
349+
350+
G := UnderlyingGroup( SkeletalTransitiveGSets );
351+
352+
U := RepresentativesOfSubgroupsUpToConjugation( SkeletalTransitiveGSets );
353+
354+
objects := SetOfObjects( SkeletalTransitiveGSets );
355+
356+
t := ObjectNumber( target );
357+
358+
l := Length( diagram );
359+
360+
gs := List( [ 1 .. l ], i -> UnderlyingGroupElement( diagram[i] ) );
361+
362+
Ucoeq := Subgroup( G, Concatenation( GeneratorsOfGroup( U[t] ), gs ) );
363+
364+
index := Index( G, Ucoeq );
365+
366+
cards := CardinalitiesOfObjects( SkeletalTransitiveGSets );
367+
368+
positions := Filtered( [ 1 .. NumberOfObjects( SkeletalTransitiveGSets ) ], i -> cards[i] = index );
369+
370+
## pos := SafeUniqueEntry( positions, c -> IsConjugate( G, Ucoeq, U[c] ) );
371+
## but for performance we use:
372+
pos := SafeFirst( positions, c -> IsConjugate( G, Ucoeq, U[c] ) );
333373

334374
g := RepresentativeAction( G, Ucoeq, U[pos] );
335375

@@ -513,7 +553,7 @@ InstallMethod( Size,
513553
end );
514554

515555
##
516-
InstallOtherMethodForCompilerForCAP( CoequalizerMorphisms,
556+
InstallOtherMethodForCompilerForCAP( CoequalizerAutomorphisms,
517557
"for the skeletal category of transitive left G-sets and a transitive left G-set therein",
518558
[ IsSkeletalCategoryOfTransitiveLeftGSets, IsObjectInSkeletalCategoryOfTransitiveLeftGSets ],
519559

@@ -526,7 +566,7 @@ InstallOtherMethodForCompilerForCAP( CoequalizerMorphisms,
526566

527567
U := RepresentativesOfSubgroupsUpToConjugation( SkeletalTransitiveGSets );
528568

529-
gs := Concatenation( [ One( UnderlyingGroup( SkeletalTransitiveGSets ) ) ], GeneratorsOfGroup( U[ObjectNumber( Omega )] ) );
569+
gs := GeneratorsOfGroup( U[ObjectNumber( Omega )] );
530570

531571
return List( gs, g ->
532572
MorphismConstructor( G_as_cat,
@@ -537,13 +577,13 @@ InstallOtherMethodForCompilerForCAP( CoequalizerMorphisms,
537577
end );
538578

539579
##
540-
InstallMethod( CoequalizerMorphisms,
580+
InstallMethod( CoequalizerAutomorphisms,
541581
"for a skeletal transitive left G-set",
542582
[ IsObjectInSkeletalCategoryOfTransitiveLeftGSets ],
543583

544584
function ( Omega )
545585

546-
return CoequalizerMorphisms( CapCategory( Omega ), Omega );
586+
return CoequalizerAutomorphisms( CapCategory( Omega ), Omega );
547587

548588
end );
549589

@@ -609,25 +649,25 @@ InstallMethodForCompilerForCAP( ExtendFunctorToSkeletalCategoryOfTransitiveLeftG
609649
function ( obj_in_SkeletalTransitiveGSets )
610650
local coeq_mors, diagram, coeq;
611651

612-
coeq_mors := CoequalizerMorphisms( SkeletalTransitiveGSets, obj_in_SkeletalTransitiveGSets );
652+
coeq_mors := CoequalizerAutomorphisms( SkeletalTransitiveGSets, obj_in_SkeletalTransitiveGSets );
613653

614654
diagram := List( coeq_mors, g ->
615655
functor_on_morphisms(
616656
img_obj,
617657
g,
618658
img_obj ) );
619659

620-
return Coequalizer( category_with_coequalizers, img_obj, diagram );
660+
return CoequalizerOfIdentityAndAutomorphisms( category_with_coequalizers, img_obj, diagram );
621661

622662
end;
623663

624664
extended_functor_on_morphisms :=
625665
function ( source, mor_in_SkeletalTransitiveGSets, target )
626666
local coeq_mors_source, coeq_mors_target, diagram_source, diagram_target, g;
627667

628-
coeq_mors_source := CoequalizerMorphisms( SkeletalTransitiveGSets, Source( mor_in_SkeletalTransitiveGSets ) );
668+
coeq_mors_source := CoequalizerAutomorphisms( SkeletalTransitiveGSets, Source( mor_in_SkeletalTransitiveGSets ) );
629669

630-
coeq_mors_target := CoequalizerMorphisms( SkeletalTransitiveGSets, Target( mor_in_SkeletalTransitiveGSets ) );
670+
coeq_mors_target := CoequalizerAutomorphisms( SkeletalTransitiveGSets, Target( mor_in_SkeletalTransitiveGSets ) );
631671

632672
diagram_source := List( coeq_mors_source, g ->
633673
functor_on_morphisms(
@@ -641,19 +681,19 @@ InstallMethodForCompilerForCAP( ExtendFunctorToSkeletalCategoryOfTransitiveLeftG
641681
g,
642682
img_obj ) );
643683

644-
if not IsEqualForObjects( category_with_coequalizers, source, Coequalizer( category_with_coequalizers, diagram_source ) ) then
684+
if not IsEqualForObjects( category_with_coequalizers, source, CoequalizerOfIdentityAndAutomorphisms( category_with_coequalizers, img_obj, diagram_source ) ) then
645685
# COVERAGE_IGNORE_NEXT_LINE
646686
Error( "source and Coequalizer( diagram_source ) do not coincide\n" );
647687
fi;
648688

649-
if not IsEqualForObjects( category_with_coequalizers, target, Coequalizer( category_with_coequalizers, diagram_target ) ) then
689+
if not IsEqualForObjects( category_with_coequalizers, target, CoequalizerOfIdentityAndAutomorphisms( category_with_coequalizers, img_obj, diagram_target ) ) then
650690
# COVERAGE_IGNORE_NEXT_LINE
651691
Error( "target and Coequalizer( diagram_target ) do not coincide\n" );
652692
fi;
653693

654694
g := GroupAsCategoryMorphism( G_as_cat, UnderlyingGroupElement( mor_in_SkeletalTransitiveGSets ) );
655695

656-
return CoequalizerFunctorialWithGivenCoequalizers( category_with_coequalizers,
696+
return CoequalizerOfIdentityAndAutomorphismsFunctorialWithGivenCoequalizers( category_with_coequalizers,
657697
source,
658698
diagram_source,
659699
functor_on_morphisms(

tst/coequalizer.tst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ gap> Omega1 := TS5.1;
1717
S5 / U_1
1818
gap> Omega3 := TS5.3;
1919
S5 / U_3
20-
gap> ForAll( objs, o -> o = Coequalizer( Omega1, List( CoequalizerMorphisms( o ), g -> g / TS5 ) ) );
20+
gap> ForAll( objs, o -> o = CoequalizerOfIdentityAndAutomorphisms( Omega1, List( CoequalizerAutomorphisms( o ), g -> g / TS5 ) ) );
2121
true
2222
gap> mors := SetOfMorphisms( TS5 );; Length( mors );
2323
681

0 commit comments

Comments
 (0)