1############################################################################## 2## 3#W gp2obj.gd GAP4 package `XMod' Chris Wensley 4#W & Murat Alp 5#Y Copyright (C) 2001-2019, Chris Wensley et al, 6#Y School of Computer Science, Bangor University, U.K. 7 8############################################################################# 9## 10#P IsPreXModDomain( <obj> ) 11#P IsPreCat1Domain( <obj> ) 12## 13## these apply to groups, algebras, whatever ... 14## 15DeclareProperty( "IsPreXModDomain", Is2DimensionalDomain ); 16DeclareProperty( "IsPreCat1Domain", Is2DimensionalDomain ); 17InstallTrueMethod( Is2DimensionalDomain, IsPreXModDomain ); 18InstallTrueMethod( Is2DimensionalDomain, IsPreCat1Domain ); 19 20############################################################################# 21## 22#R IsPreXModObj( <obj> ) 23## A pre-crossed module is a group homomorphism which preserves an action 24#R IsPreCat1Obj( <obj> ) 25## A pre-cat1-group is a pair of group endomorphisms with a common image 26## 27DeclareRepresentation( "IsPreXModObj", Is2DimensionalGroup and 28 IsAttributeStoringRep, [ "boundary", "action" ] ); 29DeclareRepresentation( "IsPreCat1Obj", Is2DimensionalGroup and 30 IsAttributeStoringRep, [ "tailMap", "headMap", "rangeEmbedding" ] ); 31 32############################################################################# 33## 34#P IsPerm2DimensionalGroup( <obj> ) 35#P IsFp2DimensionalGroup( <obj> ) 36#P IsPc2DimensionalGroup( <obj> ) 37## 38DeclareProperty( "IsPerm2DimensionalGroup", Is2DimensionalGroup ); 39DeclareProperty( "IsFp2DimensionalGroup", Is2DimensionalGroup ); 40DeclareProperty( "IsPc2DimensionalGroup", Is2DimensionalGroup ); 41 42InstallTrueMethod( Is2DimensionalGroup, IsPerm2DimensionalGroup ); 43InstallTrueMethod( Is2DimensionalGroup, IsFp2DimensionalGroup ); 44InstallTrueMethod( Is2DimensionalGroup, IsPc2DimensionalGroup ); 45 46############################################################################# 47## 48#T PreXModObjType . . . . . . . . . . . . . . . . . type for crossed modules 49#T PermPreXModObjType . . . . . . . . . . . . type for perm crossed modules 50#T PcPreXModObjType . . . . . . . . . . . . . . type for pc crossed modules 51#T PreCat1ObjType . . . . . . . . . . . . . . . . . . . type for cat1-groups 52#T PermPreCat1ObjType . . . . . . . . . . . . . . type for perm cat1-groups 53#T PcPreCat1ObjType . . . . . . . . . . . . . . . . type for pc cat1-groups 54## 55BindGlobal( "PreXModObjType", 56 NewType( Family2DimensionalGroup, 57 IsPreXModObj ) ); 58BindGlobal( "PermPreXModObjType", 59 NewType( Family2DimensionalGroup, 60 IsPreXModObj and IsPerm2DimensionalGroup ) ); 61BindGlobal( "PcPreXModObjType", 62 NewType( Family2DimensionalGroup, 63 IsPreXModObj and IsPc2DimensionalGroup ) ); 64BindGlobal( "PreCat1ObjType", 65 NewType( Family2DimensionalGroup, 66 IsPreCat1Obj ) ); 67BindGlobal( "PermPreCat1ObjType", 68 NewType( Family2DimensionalGroup, 69 IsPreCat1Obj and IsPerm2DimensionalGroup ) ); 70BindGlobal( "PcPreCat1ObjType", 71 NewType( Family2DimensionalGroup, 72 IsPreCat1Obj and IsPc2DimensionalGroup ) ); 73 74############################################################################# 75## 76#P IsPreXMod( <PM> ) 77#P IsPermPreXMod( <PM> ) 78#P IsFpPreXMod( <PM> ) 79#P IsPcPreXMod( <PM> ) 80## 81DeclareProperty( "IsPreXMod", Is2DimensionalGroup ); 82InstallTrueMethod( Is2DimensionalGroup, IsPreXMod ); 83DeclareSynonym( "IsPermPreXMod", IsPreXMod and IsPerm2DimensionalGroup ); 84DeclareSynonym( "IsFpPreXMod", IsPreXMod and IsFp2DimensionalGroup ); 85DeclareSynonym( "IsPcPreXMod", IsPreXMod and IsPc2DimensionalGroup ); 86 87############################################################################# 88## 89#P IsXMod( <PM> ) 90#P IsPermXMod( <XM> ) 91#P IsFpXMod( <XM> ) 92#P IsPcXMod( <XM> ) 93## 94DeclareProperty( "IsXMod", IsPreXMod ); 95InstallTrueMethod( IsPreXMod, IsXMod ); 96DeclareSynonym( "IsPermXMod", IsXMod and IsPerm2DimensionalGroup ); 97DeclareSynonym( "IsFpXMod", IsXMod and IsFp2DimensionalGroup ); 98DeclareSynonym( "IsPcXMod", IsXMod and IsPc2DimensionalGroup ); 99 100############################################################################# 101## 102#P IsPreCat1Group( <PCG> ) 103#P IsPermPreCat1Group( <PCG> ) 104#P IsFpPreCat1Group( <PCG> ) 105#P IsPcPreCat1Group( <PCG> ) 106## 107DeclareProperty( "IsPreCat1Group", Is2DimensionalGroup ); 108InstallTrueMethod( Is2DimensionalGroup, IsPreCat1Group ); 109DeclareSynonym( "IsPermPreCat1Group", 110 IsPreCat1Group and IsPerm2DimensionalGroup ); 111DeclareSynonym( "IsFpPreCat1Group", IsPreCat1Group and IsFp2DimensionalGroup ); 112DeclareSynonym( "IsPcPreCat1Group", IsPreCat1Group and IsPc2DimensionalGroup ); 113 114############################################################################# 115## 116#P IsCat1Group( <C1G> ) 117#P IsPermCat1Group( <CG> ) 118#P IsFpCat1Group( <CG> ) 119#P IsPcCat1Group( <CG> ) 120## 121DeclareProperty( "IsCat1Group", IsPreCat1Group ); 122InstallTrueMethod( IsPreCat1Group, IsCat1Group ); 123DeclareSynonym( "IsPermCat1Group", IsCat1Group and IsPerm2DimensionalGroup ); 124DeclareSynonym( "IsFpCat1Group", IsCat1Group and IsFp2DimensionalGroup ); 125DeclareSynonym( "IsPcCat1Group", IsCat1Group and IsPc2DimensionalGroup ); 126 127############################################################################# 128## 129#O PreXModObj( <bdy>, <act> ) 130#A Boundary( <PM> ) 131#A XModAction( <PM> ) 132#A ExternalSetXMod( <PM> ) 133#O ImageElmXModAction( <PM>, <srcobj>, <rngobj> ) 134## 135DeclareOperation( "PreXModObj", [ IsGroupHomomorphism, IsGroupHomomorphism ] ); 136DeclareAttribute( "Boundary", IsPreXMod ); 137DeclareAttribute( "XModAction", IsPreXMod ); 138DeclareAttribute( "ExternalSetXMod", IsPreXMod ); 139DeclareOperation( "ImageElmXModAction", 140 [ Is2DimensionalDomain, IsObject, IsObject ] ); 141 142############################################################################# 143## 144#A PeifferSubgroup( <obj> ) 145#A PeifferSub2DimensionalGroup( <obj> ) 146#O PeifferSubgroupPreXMod( <PM> ) 147#O PeifferSubgroupPreCat1Group( <P1C> ) 148## 149DeclareAttribute( "PeifferSubgroup", Is2DimensionalGroup ); 150DeclareAttribute( "PeifferSub2DimensionalGroup", Is2DimensionalGroup ); 151DeclareOperation( "PeifferSubgroupPreXMod", [ IsPreXMod ] ); 152DeclareOperation( "PeifferSubgroupPreCat1Group", [ IsPreCat1Group ] ); 153 154############################################################################# 155## 156#O PreXModByBoundaryAndAction( <bdy>, <act> ) 157## 158DeclareOperation( "PreXModByBoundaryAndAction", 159 [ IsGroupHomomorphism, IsGroupHomomorphism ] ); 160 161############################################################################# 162## 163#F XMod( <args> ) 164#O AsXMod( <arg> ) 165#O XModByBoundaryAndAction( <bdy>, <act> ) 166#O XModByTrivialAction( <f> ) 167#O XModByNormalSubgroup( <G>, <N> ) 168#O XModByCentralExtension( <hom> ) 169#O XModByGroupOfAutomorphisms( <G>, <A> ) 170#A XModByAutomorphismGroup( <G> ) 171#A XModByInnerAutomorphismGroup( <G> ) 172#O XModByAbelianModule( <R> ) 173#A XModByPeifferQuotient( <PM> ) 174#O XModByPullback( <PM>, <hom> ) 175## 176DeclareGlobalFunction( "XMod" ); 177DeclareOperation( "AsXMod", [ IsDomain ] ); 178DeclareOperation( "XModByBoundaryAndAction", 179 [ IsGroupHomomorphism, IsGroupHomomorphism ] ); 180DeclareOperation( "XModByTrivialAction", [ IsGroupHomomorphism ] ); 181DeclareOperation( "XModByNormalSubgroup", [ IsGroup, IsGroup ] ); 182DeclareOperation( "XModByCentralExtension", [ IsGroupHomomorphism ] ); 183DeclareOperation( "XModByGroupOfAutomorphisms", [ IsGroup, IsGroup ] ); 184DeclareAttribute( "XModByAutomorphismGroup", IsGroup ); 185DeclareAttribute( "XModByInnerAutomorphismGroup", IsGroup ); 186DeclareOperation( "XModByAbelianModule", [ IsAbelianModule ] ); 187DeclareAttribute( "XModByPeifferQuotient", IsPreXMod ); 188DeclareOperation( "XModByPullback", [ IsXMod, IsGroupHomomorphism ] ); 189 190############################################################################# 191## 192#A KernelCokernelXMod( <xmod> ) 193## 194DeclareAttribute( "KernelCokernelXMod", IsXMod ); 195 196############################################################################# 197## 198#P IsTrivialAction2DimensionalGroup( <obj> ) 199#P IsNormalSubgroup2DimensionalGroup( <obj> ) 200#P IsCentralExtension2DimensionalGroup( <obj> ) 201#P IsAutomorphismGroup2DimensionalGroup( <XM> ) 202#P IsAbelianModule2DimensionalGroup( <obj> ) 203#P IsFreeXMod( <XM> ) 204## 205DeclareProperty( "IsTrivialAction2DimensionalGroup", Is2DimensionalGroup ); 206DeclareProperty( "IsNormalSubgroup2DimensionalGroup", Is2DimensionalGroup ); 207DeclareProperty( "IsCentralExtension2DimensionalGroup", Is2DimensionalGroup ); 208DeclareProperty( "IsAutomorphismGroup2DimensionalGroup", Is2DimensionalGroup ); 209DeclareProperty( "IsAbelianModule2DimensionalGroup", Is2DimensionalGroup ); 210DeclareProperty( "IsFreeXMod", IsPreXModObj ); 211 212############################################################################# 213## 214#O IsSubPreXMod( <obj>, <subobj> ) 215#O IsSubXMod( <obj>, <subobj> ) 216#O IsSubPreCat1Group( <obj>, <subobj> ) 217#O IsSubCat1Group( <obj>, <subobj> ) 218#O IsNormalSub2DimensionalDomain( <obj>, <subobj> ) 219## 220DeclareOperation( "IsSubPreXMod", 221 [ Is2DimensionalGroup, Is2DimensionalGroup ] ); 222DeclareOperation( "IsSubXMod", [ Is2DimensionalGroup, Is2DimensionalGroup ] ); 223DeclareOperation( "IsSubPreCat1Group", 224 [ Is2DimensionalGroup, Is2DimensionalGroup ] ); 225DeclareOperation( "IsSubCat1Group", 226 [ Is2DimensionalGroup, Is2DimensionalGroup ] ); 227DeclareOperation( "IsNormalSub2DimensionalDomain", 228 [ Is2DimensionalGroup, Is2DimensionalGroup ] ); 229 230############################################################################## 231## 232#O Sub2DimensionalGroup( <obj>, <src>, <rng> ) 233#O SubPreXMod( <PM, Ssrc, Srng> ) 234#O SubXMod( <PM, Ssrc, Srng> ) 235#O SubPreCat1Group( <C>, <H> ) 236## 237DeclareOperation( "Sub2DimensionalGroup", 238 [ Is2DimensionalGroup, IsGroup, IsGroup ] ); 239DeclareOperation( "SubPreXMod", [ IsPreXMod, IsGroup, IsGroup ] ); 240DeclareOperation( "SubXMod", [ IsXMod, IsGroup, IsGroup ] ); 241DeclareOperation( "SubPreCat1Group", [ IsPreCat1Group, IsGroup, IsGroup ] ); 242DeclareOperation( "SubCat1Group", [ IsCat1Group, IsGroup, IsGroup ] ); 243 244############################################################################# 245## 246#O TrivialSub2DimensionalGroup( <obj> ) 247#A TrivialSubPreXMod( <obj> ) 248#A TrivialSubXMod( <obj> ) 249#A TrivialSubPreCat1Group( <obj> ) 250#A TrivialSubCat1Group( <obj> ) 251#P IsIdentityPreCat1Group( <obj> ) 252#P IsPreCat1GroupByEndomorphisms( <obj> ) 253## 254DeclareOperation( "TrivialSub2DimensionalGroup", [ Is2DimensionalGroup ] ); 255DeclareAttribute( "TrivialSubPreXMod", IsPreXMod ); 256DeclareAttribute( "TrivialSubXMod", IsXMod ); 257DeclareAttribute( "TrivialSubPreCat1Group", IsPreCat1Group ); 258DeclareAttribute( "TrivialSubCat1Group", IsCat1Group ); 259DeclareProperty( "IsIdentityPreCat1Group", IsPreCat1Group ); 260DeclareProperty( "IsPreCat1GroupByEndomorphisms", IsPreCat1Group ); 261 262############################################################################# 263## 264#O PreCat1Obj( <arg> ) 265#A HeadMap( <PCG> ) 266#A TailMap( <PCG> ) 267#A RangeEmbedding( <PCG> ) 268#A KernelEmbedding( <C> ) 269## 270DeclareOperation( "PreCat1Obj", 271 [ IsGroupHomomorphism, IsGroupHomomorphism, IsGroupHomomorphism ] ); 272DeclareAttribute( "HeadMap", IsPreCat1Group ); 273DeclareAttribute( "TailMap", IsPreCat1Group ); 274DeclareAttribute( "RangeEmbedding", IsPreCat1Group ); 275DeclareAttribute( "KernelEmbedding", IsPreCat1Group ); 276 277## temporary measure to keep XModAlg working: 278DeclareSynonym( "PreCat1ByTailHeadEmbedding", PreCat1Obj ); 279 280############################################################################# 281## 282#F PreCat1Group( <arg> ) 283#O PreCat1GroupByTailHeadEmbedding( <t>, <h>, <e> ) 284#O PreCat1GroupByEndomorphisms( <tail>, <head> ) 285#A EndomorphismPreCat1Group( <PCG> ) 286#A ReverseCat1Group( <PCG> ) 287## 288DeclareGlobalFunction( "PreCat1Group" ); 289DeclareOperation( "PreCat1GroupByTailHeadEmbedding", 290 [ IsGroupHomomorphism, IsGroupHomomorphism, IsGroupHomomorphism ] ); 291DeclareOperation( "PreCat1GroupByEndomorphisms", 292 [ IsGroupHomomorphism, IsGroupHomomorphism ] ); 293DeclareAttribute( "EndomorphismPreCat1Group", IsPreCat1Group ); 294DeclareAttribute( "ReverseCat1Group", IsPreCat1Group ); 295 296############################################################################# 297## 298#P IsPreCat1GroupByEndomorphisms( <PCG> ) 299## 300DeclareProperty( "IsPreCat1GroupByEndomorphisms", IsPreCat1Group ); 301 302############################################################################# 303## 304#A PreXModOfPreCat1Group( <PCG> ) 305#A PreCat1GroupOfPreXMod( <PM> ) 306#A XModOfCat1Group( <C1G> ) 307#A Cat1GroupOfXMod( <XM> ) 308## 309DeclareAttribute( "PreXModOfPreCat1Group", IsPreCat1Group ); 310DeclareAttribute( "PreCat1GroupOfPreXMod", IsPreXMod ); 311DeclareAttribute( "XModOfCat1Group", IsCat1Group ); 312DeclareAttribute( "Cat1GroupOfXMod", IsXMod ); 313 314############################################################################# 315## 316#F Cat1Group( <arg> ) 317#O Cat1Select( <size>, <gpnum>, <num> ) 318#O PermCat1Select( <size>, <gpnum>, <num> ) 319#O Cat1GroupByPeifferQuotient( <PM> ) 320#O DiagonalCat1Group( <list> ) 321## 322DeclareGlobalFunction( "Cat1Group" ); 323DeclareOperation( "Cat1Select", [ IsInt, IsInt, IsInt ] ); 324DeclareOperation( "Cat1Select", [ IsInt, IsInt ] ); 325DeclareOperation( "Cat1Select", [ IsInt ] ); 326DeclareOperation( "PermCat1Select", [ IsInt, IsInt, IsInt ] ); 327DeclareOperation( "Cat1GroupByPeifferQuotient", [ IsPreCat1Group ] ); 328DeclareOperation( "DiagonalCat1Group", [ IsList ] ); 329 330############################################################################# 331## 332#O AllCat1GroupsWithImage( <gp>, <subgp> ) 333#O AllCat1GroupsWithImageIterator( <gp>, <subgp> ) 334#O AllCat1GroupsWithImageNumber( <gp>, <subgp> ) 335#F DoAllCat1GroupsWithImageIterator 336#O AllCat1GroupsWithImageUpToIsomorphism( <gp> ) 337## 338DeclareOperation( "AllCat1GroupsWithImage", [ IsGroup, IsGroup ] ); 339DeclareOperation( "AllCat1GroupsWithImageIterator", [ IsGroup, IsGroup ] ); 340DeclareOperation( "AllCat1GroupsWithImageNumber", [ IsGroup, IsGroup ] ); 341DeclareGlobalFunction( "DoAllCat1GroupsWithImageIterator" ); 342DeclareOperation( "AllCat1GroupsWithImageUpToIsomorphism", [ IsGroup ] ); 343 344############################################################################# 345## 346#O AllCat1Groups( <gp> ) 347#O AllCat1GroupsIterator( <gp> ) 348#F DoAllCat1GroupsIterator 349#A AllCat1GroupsNumber( <gp> ) 350#O AllCat1GroupsUpToIsomorphism( <gp> ) 351## 352DeclareOperation( "AllCat1Groups", [ IsGroup ] ); 353DeclareOperation( "AllCat1GroupsIterator", [ IsGroup ] ); DeclareGlobalFunction( "DoAllCat1GroupsIterator" ); 354DeclareAttribute( "AllCat1GroupsNumber", IsGroup ); 355DeclareOperation( "AllCat1GroupsUpToIsomorphism", [ IsGroup ] ); 356 357 358############################################################################# 359## 360#A DirectProduct2dInfo( <D> ) 361#A Coproduct2dInfo( <D> ) 362## 363DeclareAttribute( "DirectProduct2dInfo", Is2DimensionalDomain, "mutable" ); 364DeclareAttribute( "Coproduct2dInfo", Is2DimensionalDomain, "mutable" ); 365 366############################################################################# 367## 368#A NormalSubXMods( <XM> ) 369#A NormalSubXCat1Groups( <C1G> ) 370## 371DeclareAttribute( "NormalSubXMods", IsXMod ); 372DeclareAttribute( "NormalSubCat1Groups", IsCat1Group ); 373 374############################################################################# 375## 376#A CatnGroupNumbers( <G> ) 377#A CatnGroupLists( <G> ) 378#A InitCatnGroupRecords( <G> ) 379## 380DeclareAttribute( "CatnGroupNumbers", IsGroup, "mutable" ); 381DeclareAttribute( "CatnGroupLists", IsGroup, "mutable" ); 382DeclareOperation( "InitCatnGroupRecords", [ IsGroup ] ); 383