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