%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%W  upext.tex             GrpConst documentation             Bettina Eick
%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Chapter{The Upwards Extension Method}

\index{UpwardsExtensions}

This is a method to construct up to isomorphism the finite groups of
a given order. For this purpose it will loop over all possible perfect
groups and construct upwards extensions by soluble groups. This, in turn, 
is done by iterated cyclic extensions.

Since this method is less efficient than the above two methods, it
will usually only be used for the determination of non-soluble groups.

\> UpwardsExtensions( <G>, <s> ) F

Let <G> be a permutation group and <s> a positive integer.  This function
returns a list corresponding to `DivisorsInt(s)'.  Let $t$ be the $i$-th 
divisor of <s>. Then the $i$-th entry in the output is a list of all 
extensions of <G> by a soluble group of order $t$ up to isomorphism. The 
returned groups are permutation groups again. 

Typically, this function is applied to perfect groups <G>, which may be 
obtained from the perfect groups catalogue in GAP (see the Section on
`Finite perfect groups' in the reference manual).

The most time-consuming part of the computation in `UpwardsExtensions'
is the isomorphism test. The following function does no reduction to
isomorphism type representatives and hence is much more efficient.

\> CyclicExtensions( <G>, <p> ) F

Here <G> should be a  permutation group and <p> a prime. This function 
computes a list of permutation groups containing the upwards extensions
of <G> by the cyclic group of order <p>, but not reduced to isomorphism
type representatives. 

There is an info class `InfoUpExt' available with values from 1 to 3.

\beginexample
gap> G := PerfectGroup( IsPermGroup, 120, 1 );
A5 2^1
gap> c := CyclicExtensions( G, 2 );;
gap> List( c, IdGroup );   
[ [ 240, 94 ], [ 240, 93 ], [ 240, 90 ], [ 240, 89 ] ]
gap> H := c[1];
<permutation group of size 240 with 2 generators>
gap> CyclicExtensions( H, 2 );;
gap> List(last, IdGroup);
[ [ 480, 960 ], [ 480, 955 ], [ 480, 222 ], [ 480, 222 ], [ 480, 953 ], 
  [ 480, 953 ], [ 480, 957 ], [ 480, 957 ], [ 480, 949 ], [ 480, 950 ], 
  [ 480, 219 ], [ 480, 219 ] ]

gap> u := UpwardsExtensions( G, 4 );;
gap> List( u, Length );
[ 1, 4, 14 ]
gap> List( u[3], IdGroup);
[ [ 480, 960 ], [ 480, 959 ], [ 480, 950 ], [ 480, 222 ], [ 480, 221 ], 
  [ 480, 947 ], [ 480, 949 ], [ 480, 219 ], [ 480, 948 ], [ 480, 218 ], 
  [ 480, 955 ], [ 480, 957 ], [ 480, 953 ], [ 480, 946 ] ]
\endexample

In case that we want to extend a perfect group with trivial
centre, then there is a better algorithm available. This is
implemented as well and can be used with the following functions.

\> UpwardsExtensionsNoCentre( <G>, <s> ) F

Let <G> be a perfect permutation group with trivial centre and <s> 
a positive integer. This function returns a list of all extensions 
of <G> by a soluble group of order $s$ up to isomorphism. The returned 
groups are permutation groups again. Note that, in difference to 
`UpwardsExtensions' this function does not return the extensions by
groups of order dividing <s>. Moreover, the implementation of the
function requires that all soluble groups of order <s> are available
as `SmallGroups'. The implementation then uses the following function
to determine groups.

\> ExtensionsByGroupNoCentre( <G>, <H> ) F

Let <G> be a perfect permutation group with trivial centre and <H> a soluble
group. This functions returns all extensions of <G> by <H> up to isomorphism.  
