1#############################################################################
2##
3##  This file is part of GAP, a system for computational discrete algebra.
4##  This file's authors include Werner Nickel, Alexander Hulpke.
5##
6##  Copyright of GAP belongs to its developers, whose names are too numerous
7##  to list here. Please refer to the COPYRIGHT file for details.
8##
9##  SPDX-License-Identifier: GPL-2.0-or-later
10##
11
12#############################################################################
13##
14#V  InfoSchur
15##
16##  <ManSection>
17##  <InfoClass Name="InfoSchur"/>
18##
19##  <Description>
20##  </Description>
21##  </ManSection>
22##
23DeclareInfoClass( "InfoSchur" );
24
25#############################################################################
26##
27#O  SchurCover(<G>)
28##
29##  <#GAPDoc Label="SchurCover">
30##  <ManSection>
31##  <Attr Name="SchurCover" Arg='G'/>
32##
33##  <Description>
34##  returns one (of possibly several) Schur covers of the group <A>G</A>.
35##  <P/>
36##  At the moment this cover is represented as a finitely presented group
37##  and <Ref Attr="IsomorphismPermGroup"/> would be needed to convert it to a
38##  permutation group.
39##  <P/>
40##  If also the relation to <A>G</A> is needed,
41##  <Ref Attr="EpimorphismSchurCover"/> should be used.
42##  <Example><![CDATA[
43##  gap> g:=Group((1,2,3,4),(1,2));;
44##  gap> epi:=EpimorphismSchurCover(g);
45##  [ F1, F2, F3 ] -> [ (1,2), (2,3), (3,4) ]
46##  gap> Size(Source(epi));
47##  48
48##  gap> f:=FreeGroup("a","b");;
49##  gap> g:=f/ParseRelators(f,"a2,b3,(ab)5");;
50##  gap> epi:=EpimorphismSchurCover(g);
51##  [ a, b ] -> [ a, b ]
52##  gap> Size(Kernel(epi));
53##  2
54##  ]]></Example>
55##  <P/>
56##  If the group becomes bigger, Schur Cover calculations might become
57##  unfeasible.
58##  <P/>
59##  There is another operation, <Ref Attr="AbelianInvariantsMultiplier"/>,
60##  which only returns the structure of the Schur Multiplier,
61##  and which should work for larger groups as well.
62##  </Description>
63##  </ManSection>
64##  <#/GAPDoc>
65##
66DeclareAttribute( "SchurCover", IsGroup );
67
68##############################################################################
69##
70#O  EpimorphismSchurCover(<G>[,<pl>])
71##
72##  <#GAPDoc Label="EpimorphismSchurCover">
73##  <ManSection>
74##  <Attr Name="EpimorphismSchurCover" Arg='G[, pl]'/>
75##
76##  <Description>
77##  returns an epimorphism <M>epi</M> from a group <M>D</M> onto <A>G</A>.
78##  The group <M>D</M> is one (of possibly several) Schur covers of <A>G</A>.
79##  The group <M>D</M> can be obtained as the <Ref Attr="Source"/> value of
80##  <A>epi</A>.
81##  The kernel of <M>epi</M> is the Schur multiplier of <A>G</A>.
82##  If <A>pl</A> is given as a list of primes,
83##  only the multiplier part for these primes is realized.
84##  At the moment, <M>D</M> is represented as a finitely presented group.
85##  </Description>
86##  </ManSection>
87##  <#/GAPDoc>
88##
89DeclareAttribute( "EpimorphismSchurCover", IsGroup );
90
91##############################################################################
92##
93#A  AbelianInvariantsMultiplier(<G>)
94##
95##  <#GAPDoc Label="AbelianInvariantsMultiplier">
96##  <ManSection>
97##  <Attr Name="AbelianInvariantsMultiplier" Arg='G'/>
98##
99##  <Description>
100##  <Index>Multiplier</Index>
101##  <Index>Schur multiplier</Index>
102##  returns a list of the abelian invariants of the Schur multiplier of
103##  <A>G</A>.
104##  <P/>
105##  At the moment, this operation will not give any information about how to
106##  extend the multiplier to a Schur Cover.
107##  <Example><![CDATA[
108##  gap> AbelianInvariantsMultiplier(g);
109##  [ 2 ]
110##  gap> AbelianInvariantsMultiplier(AlternatingGroup(6));
111##  [ 2, 3 ]
112##  gap> AbelianInvariantsMultiplier(SL(2,3));
113##  [  ]
114##  gap> AbelianInvariantsMultiplier(SL(3,2));
115##  [ 2 ]
116##  gap> AbelianInvariantsMultiplier(PSU(4,2));
117##  [ 2 ]
118##  ]]></Example>
119##  (Note that the last command from the example will take some time.)
120##  <P/>
121##  The &GAP;&nbsp;4.4.12 manual contained examples for larger groups e.g.
122##  <M>M_{22}</M>. However, some issues that may very rarely (and not
123##  easily reproducibly) lead to wrong results were discovered in the code
124##  capable of handling larger groups, and in &GAP;&nbsp;4.5 it was replaced
125##  by a more reliable basic method. To deal with larger groups, one can use
126##  the function <Ref BookName="cohomolo" Func="SchurMultiplier"/> from the
127##  <Package>cohomolo</Package> package. Also, additional methods for
128##  <Ref Attr="AbelianInvariantsMultiplier"/> are installed in the
129##  <Package>Polycyclic</Package> package for pcp-groups.
130##  </Description>
131##  </ManSection>
132##  <#/GAPDoc>
133##
134DeclareAttribute( "AbelianInvariantsMultiplier", IsGroup );
135
136##############################################################################
137####  Derived functions.                                       Robert F. Morse
138####
139##############################################################################
140##
141#A  Epicentre(<G>)
142#A  ExteriorCentre(<G>)
143##
144##  <#GAPDoc Label="Epicentre">
145##  <ManSection>
146##  <Attr Name="Epicentre" Arg='G'/>
147##  <Attr Name="ExteriorCentre" Arg='G'/>
148##
149##  <Description>
150##  There are various ways of describing the epicentre of a group <A>G</A>.
151##  It is the smallest normal subgroup <M>N</M> of <A>G</A> such that
152##  <M><A>G</A>/N</M> is a central quotient of a group.
153##  It is also equal to the Exterior Center of <A>G</A>,
154##  see <Cite Key="Ellis98"/>.
155##  </Description>
156##  </ManSection>
157##  <#/GAPDoc>
158##
159DeclareAttribute("Epicentre", IsGroup );
160DeclareSynonymAttr("Epicenter", Epicentre);
161DeclareSynonymAttr("ExteriorCentre", Epicentre);
162DeclareSynonymAttr("ExteriorCenter", Epicentre);
163
164##############################################################################
165##
166#O  NonabelianExteriorSquare(<G>)
167##
168##  <#GAPDoc Label="NonabelianExteriorSquare">
169##  <ManSection>
170##  <Oper Name="NonabelianExteriorSquare" Arg='G'/>
171##
172##  <Description>
173##  Computes the nonabelian exterior square <M><A>G</A> \wedge <A>G</A></M>
174##  of the group <A>G</A>, which for a finitely presented group is the
175##  derived subgroup of any Schur cover of <A>G</A>
176##  (see <Cite Key="BJR87"/>).
177##  </Description>
178##  </ManSection>
179##  <#/GAPDoc>
180##
181DeclareOperation("NonabelianExteriorSquare", [IsGroup]);
182
183##############################################################################
184##
185#O  EpimorphismNonabelianExteriorSquare(<G>)
186##
187##  <#GAPDoc Label="EpimorphismNonabelianExteriorSquare">
188##  <ManSection>
189##  <Oper Name="EpimorphismNonabelianExteriorSquare" Arg='G'/>
190##
191##  <Description>
192##  Computes the mapping
193##  <M><A>G</A> \wedge <A>G</A> \rightarrow <A>G</A></M>.
194##  The kernel of this mapping is equal to the Schur multiplier of <A>G</A>.
195##  </Description>
196##  </ManSection>
197##  <#/GAPDoc>
198##
199DeclareOperation("EpimorphismNonabelianExteriorSquare", [IsGroup]);
200
201##############################################################################
202##
203#P  IsCentralFactor(<G>)
204##
205##  <#GAPDoc Label="IsCentralFactor">
206##  <ManSection>
207##  <Prop Name="IsCentralFactor" Arg='G'/>
208##
209##  <Description>
210##  This function determines if there exists a group <M>H</M> such that
211##  <A>G</A> is isomorphic to the quotient <M>H/Z(H)</M>.
212##  A group with this property is called in literature <E>capable</E>.
213##  A group being capable is
214##  equivalent to the epicentre of <A>G</A> being trivial,
215##  see <Cite Key="BFS79"/>.
216##  </Description>
217##  </ManSection>
218##  <#/GAPDoc>
219##
220DeclareProperty("IsCentralFactor", IsGroup);
221
222##############################################################################
223###########################END RFM############################################
224
225
226##############################################################################
227##
228#F  SchuMu(<G>,<p>)
229##
230##  <ManSection>
231##  <Func Name="SchuMu" Arg='G,p'/>
232##
233##  <Description>
234##  returns epimorphism from p-part of multiplier.p-Sylow (note: This
235##  extension is <E>not</E> necessarily isomorphic to a Sylow subgroup of a
236##  Darstellungsgruppe!) onto p-Sylow, the
237##  kernel is the p-part of the multiplier.
238##  The implemented algorithm is based on section 7 in Derek Holt's paper.
239##  However we use some of the general homomorphism setup to avoid having to
240##  remember certain relations.
241##  </Description>
242##  </ManSection>
243##
244DeclareGlobalFunction("SchuMu");
245
246##############################################################################
247##
248#F  CorestEval(<FG>,<s>)
249##
250##  <ManSection>
251##  <Func Name="CorestEval" Arg='FG,s'/>
252##
253##  <Description>
254##  evaluate corestriction mapping.
255##  <A>FH</A> is a homomorphism from a finitely presented group onto a finite
256##  group <A>G</A>. <A>s</A> an epimorphism onto a p-Sylow subgroup of <A>G</A> as obtained
257##  from <C>SchuMu</C>.
258##  This function evaluates the relators of the source of <A>FH</A> in the
259##  extension M_p.<A>G</A>. It returns a list whose entries are of the form
260##  [<A>rel</A>,<A>val</A>], where <A>rel</A> is a relator of <A>G</A> and <A>val</A> its evaluation as
261##  an element of M_p.
262##  </Description>
263##  </ManSection>
264##
265DeclareGlobalFunction("CorestEval");
266
267##############################################################################
268##
269#F  RelatorFixedMultiplier(<hom>,<p>)
270##
271##  <ManSection>
272##  <Func Name="RelatorFixedMultiplier" Arg='hom,p'/>
273##
274##  <Description>
275##  Let <A>hom</A> an epimorphism from an fp group onto a finite group <A>G</A>. This
276##  function returns an epimorphism onto the <A>p</A>-Sylow subgroup of <A>G</A>,
277##  whose kernel is the largest quotient of the multiplier, that can lift
278##  <A>hom</A> to a larger quotient. (The source of this map thus is <M>M_R(B)</M>
279##  of&nbsp;<Cite Key="HulpkeQuot"/>.)
280##  </Description>
281##  </ManSection>
282##
283DeclareGlobalFunction("RelatorFixedMultiplier");
284