<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<!-- %% -->
<!-- %A  pcgs.xml                    GAP documentation            Alexander Hulpke -->
<!-- %A                                                               Bettina Eick -->
<!-- %% -->
<!-- %% -->
<!-- %Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland -->
<!-- %Y  Copyright (C) 2002 The GAP Group -->
<!-- %% -->
<Chapter Label="Polycyclic Groups">
<Heading>Polycyclic Groups</Heading>

A group <A>G</A> is <E>polycyclic</E> if there exists a subnormal series
<M>G = C_1 > C_2 > \ldots > C_n > C_{{n+1}} = \{ 1 \}</M>
with cyclic factors. Such a series is called <E>pc series</E> of <A>G</A>.
<P/>
Every polycyclic group is solvable and every finite solvable group
is polycyclic. However, there are infinite solvable groups which
are not polycyclic.
<P/>
In &GAP; there exists a large number of methods for polycyclic groups
which are based upon the polycyclic structure of these groups. These
methods are usually very efficient, especially for groups which are
given by a pc-presentation (see chapter <Ref Chap="Pc Groups"/>), and can
be applied to many types of groups. Hence &GAP; tries to use them
whenever possible, for example, for permutation groups and matrix
groups over finite fields that are known to be polycyclic
(the only exception is the representation as finitely presented group
for which the polycyclic methods cannot be used in general).
<P/>
At the current state of implementations the &GAP; library contains
methods to compute with finite polycyclic groups, while the &GAP;
package <Package>Polycyclic</Package> by Bettina Eick and Werner Nickel
allows also computations with infinite polycyclic groups which are given
by a pc-presentation.
<P/>
<!-- %%  Most of the methods for polycyclic groups are due to Frank Celler, Bettina -->
<!-- %%  Eick, Alexander Hulpke and Werner Nickel. The methods to consider a solvable -->
<!-- %%  permutation group as a polycyclic group are due to Heiko Theißen. -->


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Polycyclic Generating Systems">
<Heading>Polycyclic Generating Systems</Heading>

Let <A>G</A> be a polycyclic group with a pc series as above.  A
<E>polycyclic generating sequence</E> (<E>pcgs</E> for short) of <A>G</A> is a
sequence <M>P := (g_1, \ldots, g_n)</M> of elements of <A>G</A> such that
<M>C_i = \langle C_{{i+1}}, g_i \rangle</M> for <M>1 \leq i \leq n</M>.
Note that each polycyclic group has a pcgs, but except for very
small groups, a pcgs is not unique.
<P/>
For each index <M>i</M> the subsequence of elements <M>(g_i, \ldots, g_n)</M>
forms a pcgs of the subgroup <M>C_i</M>. In particular, these <E>tails</E>
generate the subgroups of the pc series and hence we say that
the pc series is <E>determined</E> by <M>P</M>.
<P/>
Let <M>r_i</M> be the index of <M>C_{{i+1}}</M> in <M>C_i</M> which is either
a finite positive number or infinity. Then <M>r_i</M> is the order of
<M>g_i C_{{i+1}}</M> and we call the resulting list of indices the
<E>relative orders</E> of the pcgs <A>P</A>.
<P/>
Moreover, with respect to a given pcgs <M>(g_1, \ldots, g_n)</M> each
element <A>g</A> of <A>G</A> can be represented in a unique
way as a product <M>g = g_1^{{e_1}} \cdot g_2^{{e_2}} \cdots g_n^{{e_n}}</M>
with exponents <M>e_i \in \{0, \ldots, r_i-1\}</M>, if <M>r_i</M> is finite,
and <M>e_i \in &ZZ;</M> otherwise.
Words of this form are called <E>normal words</E> or <E>words in normal form</E>.
Then the integer vector <M>[ e_1, \ldots, e_n ]</M> is called the
<E>exponent vector</E> of the element <M>g</M>. Furthermore, the smallest
index <M>k</M> such that <M>e_k \neq 0</M> is called the <E>depth</E> of <A>g</A> and
<M>e_k</M> is the <E>leading exponent</E> of <A>g</A>.
<P/>
For many applications we have to assume that each of the relative orders
<M>r_i</M> is either a prime or infinity. This is equivalent to saying that
there are no trivial factors in the pc series and the finite factors of the
pc series are maximal refined.
Then we obtain that <M>r_i</M> is the order of <M>g C_{{i+1}}</M> for all
elements <M>g</M> in <M>C_i \setminus C_{{i+1}}</M> and we call
<M>r_i</M> the <E>relative order</E> of the element <M>g</M>.

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Computing a Pcgs">
<Heading>Computing a Pcgs</Heading>

Suppose a group <A>G</A> is given; for example, let <A>G</A> be a permutation
or matrix group. Then we can ask &GAP; to compute a pcgs of this group.
If <A>G</A> is not polycyclic, the result will be <K>fail</K>.
<P/>
Note that these methods can only be applied if <A>G</A> is not given
as finitely presented group. For finitely presented groups one
can try to compute a pcgs via the polycyclic quotient methods,
see <Ref Sect="Quotient Methods"/>.
<P/>
Note also that a pcgs behaves like a list.

<#Include Label="Pcgs">
<#Include Label="IsPcgs">
<#Include Label="CanEasilyComputePcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Defining a Pcgs Yourself">
<Heading>Defining a Pcgs Yourself</Heading>

In a number of situations it might be useful to supply a pcgs to a group.
<P/>
Note that the elementary operations for such a pcgs might be rather
inefficient, since &GAP; has to use generic methods in this case.
It might be helpful to supply the relative orders of the self-defined
pcgs as well by <C>SetRelativeOrder</C>.
See also&nbsp;<Ref Prop="IsPrimeOrdersPcgs"/>.

<#Include Label="PcgsByPcSequence">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Elementary Operations for a Pcgs">
<Heading>Elementary Operations for a Pcgs</Heading>

<#Include Label="RelativeOrders:pcgs">
<#Include Label="IsFiniteOrdersPcgs">
<#Include Label="IsPrimeOrdersPcgs">
<#Include Label="PcSeries">
<#Include Label="GroupOfPcgs">
<#Include Label="OneOfPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Elementary Operations for a Pcgs and an Element">
<Heading>Elementary Operations for a Pcgs and an Element</Heading>

<#Include Label="RelativeOrderOfPcElement">
<#Include Label="ExponentOfPcElement">
<#Include Label="ExponentsOfPcElement">
<#Include Label="DepthOfPcElement">
<#Include Label="LeadingExponentOfPcElement">
<#Include Label="PcElementByExponents">
<#Include Label="LinearCombinationPcgs">
<#Include Label="SiftedPcElement">
<#Include Label="CanonicalPcElement">
<#Include Label="ReducedPcElement">
<#Include Label="CleanedTailPcElement">
<#Include Label="HeadPcElementByNumber">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Exponents of Special Products">
<Heading>Exponents of Special Products</Heading>

There are certain products of elements whose exponents are used often within
algorithms, and which might be obtained more easily than by computing the
product first and to obtain its exponents afterwards. The operations in this
section provide a way to obtain such exponent vectors directly.
<P/>
(The circumstances under which these operations give a speedup depend very
much on the pcgs and the representation of elements that is used. So the
following operations are not guaranteed to give a speedup in every case,
however the default methods are not slower than to compute the exponents of
a product and thus these operations should <E>always</E> be used if applicable.)
<P/>
The second class are exponents of products of the generators which make up
the pcgs.
If the pcgs used is a family pcgs (see <Ref Attr="FamilyPcgs"/>) then
these exponents can be looked up and do not need to be computed.

<#Include Label="ExponentsConjugateLayer">
<#Include Label="ExponentsOfRelativePower">
<#Include Label="ExponentsOfConjugate">
<#Include Label="ExponentsOfCommutator">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Subgroups of Polycyclic Groups - Induced Pcgs">
<Heading>Subgroups of Polycyclic Groups &ndash; Induced Pcgs</Heading>

Let <A>U</A> be a subgroup of <A>G</A> and let <A>P</A> be a pcgs of <A>G</A> as above such
that <A>P</A> determines the subnormal series
<M>G = C_1 > \ldots > C_{{n+1}} = \{ 1 \}</M>.
Then the series of subgroups <M>U \cap C_i</M> is a subnormal series
of <A>U</A> with cyclic or trivial factors. Hence, if we choose an element
<M>u_{{i_j}} \in (U \cap C_{{i_j}}) \setminus (U \cap C_{{i_j+1}})</M>
whenever this factor is non-trivial, then we obtain a pcgs
<M>Q = (u_{{i_1}}, \ldots, u_{{i_m}})</M> of <M>U</M>.
We say that <M>Q</M> is an <E>induced pcgs</E> with respect to <A>P</A>.
The pcgs <A>P</A> is the <E>parent pcgs</E> to the induced pcgs <A>Q</A>.
<P/>
Note that the pcgs <M>Q</M> is induced with respect to <A>P</A> if and only
if the matrix of exponent vectors of the elements <M>u_{{i_j}}</M> with
respect to <A>P</A> is in upper triangular form. Thus <M>Q</M> is not unique in
general.
<P/>
In particular, the elements of an induced pcgs do <E>not necessarily</E> have
leading coefficient 1 relative to the inducing pcgs. The attribute
<Ref Attr="LeadCoeffsIGS"/> holds the leading coefficients in case
they have to be renormed in an algorithm.
<P/>
Each induced pcgs is a pcgs and hence allows all elementary operations
for pcgs. On the other hand each pcgs could be transformed into an
induced pcgs for the group defined by the pcgs, but note that an
arbitrary pcgs is in general not an induced pcgs for technical reasons.
<P/>
An induced pcgs is <Q>compatible</Q> with its parent,
see <Ref Attr="ParentPcgs"/>.
<P/>
In <Cite Key="SOGOS"/> a <Q>non-commutative Gauss</Q> algorithm is
described to compute an induced pcgs of a subgroup <A>U</A>  from a
generating set of <A>U</A>.
For calling this in &GAP;, see <Ref Subsect="InducedPcgs"/> to
<Ref Subsect="ExtendedPcgs"/>.
<P/>
To create a subgroup generated by an induced pcgs such that the
induced pcgs gets stored automatically, use <Ref Oper="SubgroupByPcgs"/>.

<#Include Label="IsInducedPcgs">
<#Include Label="InducedPcgsByPcSequence">
<#Include Label="ParentPcgs">
<#Include Label="InducedPcgs">
<#Include Label="InducedPcgsByGenerators">
<#Include Label="InducedPcgsByPcSequenceAndGenerators">
<#Include Label="LeadCoeffsIGS">
<#Include Label="ExtendedPcgs">
<#Include Label="SubgroupByPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Subgroups of Polycyclic Groups - Canonical Pcgs">
<Heading>Subgroups of Polycyclic Groups &ndash; Canonical Pcgs</Heading>

The induced pcgs <A>Q</A> of <A>U</A> is called <E>canonical</E> if the matrix
of exponent vectors contains normed vectors only and above each
leading entry in the matrix there are 0's only.  The canonical pcgs
of <A>U</A> with respect to <A>P</A> is unique and hence such pcgs can be used
to compare subgroups.

<#Include Label="IsCanonicalPcgs">
<#Include Label="CanonicalPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Factor Groups of Polycyclic Groups - Modulo Pcgs">
<Heading>Factor Groups of Polycyclic Groups &ndash; Modulo Pcgs</Heading>

Let <A>N</A> be a normal subgroup of <A>G</A> such that <A>G/N</A> is polycyclic
with pcgs <M>(h_1 N, \ldots, h_r N)</M>. Then we call the sequence of
preimages <M>(h_1, \ldots h_r)</M> a <E>modulo pcgs</E> of <A>G/N</A>.
<A>G</A> is called the <E>numerator</E> of the modulo pcgs and <A>N</A> is the
<E>denominator</E> of the modulo pcgs.
<P/>
Modulo pcgs are often used to facilitate efficient computations with
factor groups, since they allow computations with factor groups without
formally defining the factor group at all.
<P/>
All elementary operations of pcgs,
see Sections <Ref Sect="Elementary Operations for a Pcgs"/> and
<Ref Sect="Elementary Operations for a Pcgs and an Element"/>,
apply to modulo pcgs as well. However, it is in general not possible to
compute induced pcgs with respect to a modulo pcgs.
<P/>
Two more elementary operations for modulo pcgs are
<Ref Attr="NumeratorOfModuloPcgs"/> and
<Ref Attr="DenominatorOfModuloPcgs"/>.

<#Include Label="ModuloPcgs">
<#Include Label="IsModuloPcgs">
<#Include Label="NumeratorOfModuloPcgs">
<#Include Label="DenominatorOfModuloPcgs">

<ManSection>
<Meth Name="\mod" Arg='P, I' Label="for two pcgs"/>

<Description>
Modulo Pcgs can also be built from compatible induced pcgs.
Let <M>G</M> be a group with pcgs <A>P</A> and let <A>I</A> be
an induced pcgs of a normal subgroup <M>N</M> of <M>G</M>.
(Respectively: <A>P</A> and <A>I</A> are both induced
with respect to the <E>same</E> Pcgs.)
Then we can compute a modulo pcgs of <M>G</M> mod <M>N</M> by
<P/>
<A>P</A> <K>mod</K> <A>I</A>
<P/>
Note that in this case we obtain the advantage that the values of
<Ref Attr="NumeratorOfModuloPcgs"/> and <Ref Attr="DenominatorOfModuloPcgs"/>
are just <A>P</A> and <A>I</A>, respectively, and hence are unique.
<P/>
The resulting modulo pcgs will consist of a subset of <A>P</A> and will be
<Q>compatible</Q> with <A>P</A> (or its parent).
<P/>
<Example><![CDATA[
gap> G := Group((1,2,3,4));;
gap> P := Pcgs(G);
Pcgs([ (1,2,3,4), (1,3)(2,4) ])
gap> I := InducedPcgsByGenerators(P, [(1,3)(2,4)]);
Pcgs([ (1,3)(2,4) ])
gap> M := P mod I;
[ (1,2,3,4) ]
gap> NumeratorOfModuloPcgs(M);
Pcgs([ (1,2,3,4), (1,3)(2,4) ])
gap> DenominatorOfModuloPcgs(M);
Pcgs([ (1,3)(2,4) ])
]]></Example>
</Description>
</ManSection>

<#Include Label="CorrespondingGeneratorsByModuloPcgs">
<#Include Label="CanonicalPcgsByGeneratorsWithImages">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Factor Groups of Polycyclic Groups in their Own Representation">
<Heading>Factor Groups of Polycyclic Groups in their Own Representation</Heading>

If substantial calculations are done in a factor it might be worth still to
construct the factor group in its own representation (for example by
calling <Ref Attr="PcGroupWithPcgs"/> on a modulo pcgs.
<P/>
<#Include Label="[1]{pcgs}">
<#Include Label="ProjectedPcElement">
<#Include Label="ProjectedInducedPcgs">
<#Include Label="LiftedPcElement">
<#Include Label="LiftedInducedPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Pcgs and Normal Series">
<Heading>Pcgs and Normal Series</Heading>

By definition, a pcgs determines a pc series of its underlying group.
However, in many applications it will be necessary that this pc series
refines a normal series with certain properties; for example, a normal
series with abelian factors.
<P/>
There are functions in &GAP; to compute a pcgs through a normal series
with elementary abelian factors, a central series or the lower p-central
series. See also Section <Ref Sect="Special Pcgs"/> for a more explicit possibility.

<#Include Label="IsPcgsElementaryAbelianSeries">
<#Include Label="PcgsElementaryAbelianSeries">
<#Include Label="IndicesEANormalSteps">
<#Include Label="EANormalSeriesByPcgs">
<#Include Label="IsPcgsCentralSeries">
<#Include Label="PcgsCentralSeries">
<#Include Label="IndicesCentralNormalSteps">
<#Include Label="CentralNormalSeriesByPcgs">
<#Include Label="IsPcgsPCentralSeriesPGroup">
<#Include Label="PcgsPCentralSeriesPGroup">
<#Include Label="IndicesPCentralNormalStepsPGroup">
<#Include Label="PCentralNormalSeriesByPcgsPGroup">
<#Include Label="IsPcgsChiefSeries">
<#Include Label="PcgsChiefSeries">
<#Include Label="IndicesChiefNormalSteps">
<#Include Label="ChiefNormalSeriesByPcgs">
<#Include Label="IndicesNormalSteps">
<#Include Label="NormalSeriesByPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Sum and Intersection of Pcgs">
<Heading>Sum and Intersection of Pcgs</Heading>

<!-- %eclaration{SumPcgs} -->
<!-- %eclaration{IntersectionSumPcgs} -->
<!-- %eclaration{NormalIntersectionPcgs} -->
<#Include Label="SumFactorizationFunctionPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Special Pcgs">
<Heading>Special Pcgs</Heading>

In short, a special pcgs is a pcgs which has particularly nice properties,
for example it always refines an elementary abelian series, for <M>p</M>-groups
it even refines a central series. These nice properties permit particularly
efficient algorithms.
<P/>
Let <A>G</A> be a finite polycyclic group. A <E>special pcgs</E> of <A>G</A> is a pcgs
which is closely related to a Hall system and the maximal subgroups of <A>G</A>.
These pcgs have been introduced by C. R. Leedham-Green who also gave an
algorithm to compute them. Improvements to this algorithm
<!-- %%  and the &GAP; implementation -->
are due to Bettina Eick.  For a more detailed account of
their definition the reader is referred to <Cite Key="Eick97"/>
<P/>
To introduce the definition of special pcgs we first need to define
the <E>LG-series</E> and <E>head complements</E> of a finite polycyclic group <A>G</A>.
Let <M>G = G_1 > G_2 > \ldots G_m > G_{{m+1}} = \{ 1 \}</M> be the lower
nilpotent series of <M>G</M>; that is, <M>G_i</M> is the smallest normal
subgroup of <M>G_{{i-1}}</M> with nilpotent factor. To obtain the LG-series
of <A>G</A> we need to refine this series.
Thus consider a factor <M>F_i := G_i / G_{{i+1}}</M>.
Since <M>F_i</M> is finite nilpotent, it is a direct
product of its Sylow subgroups <M>F_i = P_{{i,1}} \cdots P_{{i,r_i}}</M>.
For each Sylow <M>p_j</M>-subgroup <M>P_{{i,j}}</M> we can consider its
lower <M>p_j</M>-central series. To obtain a characteristic central series
with elementary abelian factors of <M>F_i</M> we loop over its Sylow subgroups.
Each time we consider <M>P_{{i,j}}</M> in this process we take the next step of
its lower <M>p_j</M>-central series into the series of <M>F_i</M>. If there
is no next step, then we just skip the consideration of <M>P_{{i,j}}</M>.
Note that the second term of the lower <M>p</M>-central series of a <M>p</M>-group
is in fact its Frattini subgroup. Thus the Frattini subgroup of <M>F_i</M>
is contained in the computed series of this group. We denote the
Frattini subgroup of <M>F_i = G_i / G_{{i+1}}</M> by <M>G_i^* / G_{{i+1}}</M>.
<P/>
The factors <M>G_i / G_i^*</M> are called the heads of <M>G</M>, while the
(possibly trivial) factors <M>G_i^* / G_{{i+1}}</M> are the tails of <M>G</M>.
A head complement of <M>G</M> is a subgroup <M>U</M> of <M>G</M> such that
<M>U / G_i^*</M>
is a complement to the head <M>G_i / G_i^*</M> in <M>G / G_i^*</M>
for some <M>i</M>.
<P/>
Now we are able to define a special pcgs of <A>G</A>. It is a pcgs of <A>G</A>
with three additional properties. First, the pc series determined
by the pcgs refines the LG-series of <A>G</A>. Second, a special pcgs
<E>exhibits</E> a Hall system of the group <A>G</A>; that is, for each set of
primes <M>\pi</M> the elements of the pcgs with relative order in <M>\pi</M>
form a pcgs of a Hall <M>\pi</M>-subgroup in a Hall system of <A>G</A>.
Third, a special pcgs exhibits a head complement for each head
of <A>G</A>.
<P/>
To record information about the LG-series with the special pcgs
we define the <E>LGWeights</E> of the special pcgs. These weights are
a list which contains a weight <M>w</M> for each elements <M>g</M> of the
special pcgs. Such a weight <M>w</M> represents the smallest subgroup of
the LG-series containing <M>g</M>.
<P/>
Since the LG-series is defined in terms of the lower nilpotent
series, Sylow subgroups of the factors and lower
<M>p</M>-central series of the Sylow subgroup, the weight <M>w</M> is a
triple. More precisely, <M>g</M> is contained in the <M>w[1]</M>th term
<M>U</M> of the lower nilpotent series of <A>G</A>, but not in the next smaller
one <M>V</M>. Then <M>w[3]</M> is a prime such that <M>g V</M> is contained in the
Sylow <M>w[3]</M>-subgroup <M>P/V</M> of <M>U/V</M>. Moreover, <M>gV</M> is contained in
the <M>w[2]</M>th term of the lower <M>p</M>-central series of <M>P/V</M>.
<P/>
There are two more attributes of a special pcgs containing
information about the LG-series: the list <E>LGLayers</E> and the
list <E>LGFirst</E>. The list of layers corresponds to the elements
of the special pcgs and denotes the layer of the LG-series in
which an element lies. The list LGFirst corresponds to the
LG-series and gives the number of the first element in the
special pcgs of the corresponding subgroup.

<#Include Label="IsSpecialPcgs">
<#Include Label="SpecialPcgs">
<#Include Label="LGWeights">
<#Include Label="LGLayers">
<#Include Label="LGFirst">
<#Include Label="LGLength">
<#Include Label="IsInducedPcgsWrtSpecialPcgs">
<#Include Label="InducedPcgsWrtSpecialPcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Action on Subfactors Defined by a Pcgs">
<Heading>Action on Subfactors Defined by a Pcgs</Heading>

When working with a polycyclic group, one often needs to compute matrix
operations of the group on a factor of the group.
For this purpose there are the functions described in
<Ref Subsect="VectorSpaceByPcgsOfElementaryAbelianGroup"/> to
<Ref Subsect="LinearActionLayer"/>.
<P/>
In certain situations, for example within the computation of conjugacy
classes of finite soluble groups as described in <Cite Key="MeckyNeubueser89"/>,
affine actions of groups are required. For this purpose we introduce
the functions <Ref Oper="AffineAction"/> and
<Ref Func="AffineActionLayer"/>.

<#Include Label="VectorSpaceByPcgsOfElementaryAbelianGroup">
<#Include Label="LinearAction">
<#Include Label="LinearActionLayer">
<#Include Label="AffineAction">
<#Include Label="AffineActionLayer">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Orbit Stabilizer Methods for Polycyclic Groups">
<Heading>Orbit Stabilizer Methods for Polycyclic Groups</Heading>

If a pcgs <A>pcgs</A> is known for a group <A>G</A>, then orbits and stabilizers
can be computed by a special method which is particularly efficient.
Note that within this function only the elements in <A>pcgs</A> and the
relative orders of <A>pcgs</A> are needed. Hence this function works effectively
even if the elementary operations for <A>pcgs</A> are slow.

<#Include Label="StabilizerPcgs">

<#Include Label="Pcgs_OrbitStabilizer:pcgs">

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Operations which have Special Methods for Groups with Pcgs">
<Heading>Operations which have Special Methods for Groups with Pcgs</Heading>

<Index Key="IsNilpotent" Subkey="for groups with pcgs"><C>IsNilpotent</C></Index>
<Index Key="IsSupersolvable" Subkey="for groups with pcgs"><C>IsSupersolvable</C></Index>
<Index Key="Size" Subkey="for groups with pcgs"><C>Size</C></Index>
<Index Key="CompositionSeries" Subkey="for groups with pcgs"><C>CompositionSeries</C></Index>
<Index Key="ConjugacyClasses" Subkey="for groups with pcgs"><C>ConjugacyClasses</C></Index>
<Index Key="Centralizer" Subkey="for groups with pcgs"><C>Centralizer</C></Index>
<Index Key="FrattiniSubgroup" Subkey="for groups with pcgs"><C>FrattiniSubgroup</C></Index>
<Index Key="PrefrattiniSubgroup" Subkey="for groups with pcgs"><C>PrefrattiniSubgroup</C></Index>
<Index Key="MaximalSubgroups" Subkey="for groups with pcgs"><C>MaximalSubgroups</C></Index>
<Index Key="HallSystem" Subkey="for groups with pcgs"><C>HallSystem</C></Index>
<Index Key="MinimalGeneratingSet" Subkey="for groups with pcgs"><C>MinimalGeneratingSet</C></Index>
<Index Key="Centre" Subkey="for groups with pcgs"><C>Centre</C></Index>
<Index Key="Intersection" Subkey="for groups with pcgs"><C>Intersection</C></Index>
<Index Key="AutomorphismGroup" Subkey="for groups with pcgs"><C>AutomorphismGroup</C></Index>
<Index Key="IrreducibleModules" Subkey="for groups with pcgs"><C>IrreducibleModules</C></Index>
For the following operations there are special methods for groups with
pcgs installed:
<P/>
<Ref Prop="IsNilpotentGroup"/>,
<Ref Prop="IsSupersolvableGroup"/>,
<Ref Attr="Size"/>,
<Ref Attr="CompositionSeries"/>,
<Ref Attr="ConjugacyClasses" Label="attribute"/>,
<Ref Oper="Centralizer" Label="for a magma and an element"/>,
<Ref Attr="FrattiniSubgroup"/>,
<Ref Attr="PrefrattiniSubgroup"/>,
<Ref Attr="MaximalSubgroups"/> and related operations,
<Ref Attr="HallSystem"/> and related operations,
<Ref Attr="MinimalGeneratingSet"/>,
<Ref Attr="Centre"/>,
<Ref Func="Intersection" Label="for various collections"/>,
<Ref Attr="AutomorphismGroup"/>,
<Ref Oper="IrreducibleModules"/>.

</Section>


<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
<Section Label="Conjugacy Classes in Solvable Groups">
<Heading>Conjugacy Classes in Solvable Groups</Heading>

There are a variety of algorithms to compute conjugacy classes and
centralizers in solvable groups via epimorphic images
(<Cite Key="FelschNeubueser79"/>, <Cite Key="MeckyNeubueser89"/>,
<Cite Key="Theissen93"/>).
Usually these are only invoked as methods, but it is possible to access the
algorithm directly.
<P/>
<#Include Label="ClassesSolvableGroup">
<#Include Label="CentralizerSizeLimitConsiderFunction">

</Section>
</Chapter>

