This chapter describes functions which compute and display information about automorphism groups of finite soluble groups.

The algorithm used for computing the automorphism group requires that the
soluble group be given in terms of a special ag presentation. Such
presentations are described in the chapter of the **GAP3** manual which deals
with `Special Ag Groups`

. Given a group presented by an arbitrary ag
presentation, a special ag presentation can be computed using the function
`SpecialAgGroup`

.

The automorphism group is returned as a standard **GAP3** group record.
Automorphisms are represented by their action on the sag group generating set
of the input group. The order of the automorphism group is also computed.

The performance of the automorphism group algorithm is highly dependent on the
structure of the input group. Given two groups with the same sequence of
LG-series factor groups it will usually take much less time to compute the
automorphism group of the one with the larger automorphism group. For example,
it takes less than 1 second (Sparc 10/52) to compute the automorphism group of
the exponent 7 extraspecial group of order *7 ^{3}*. It takes more than 40
seconds to compute the automorphism group of the exponent 49 extraspecial
group of order

`AutomorphismsPGroup`

from
the ANU PQ package instead).
The following section describes the function that computes the automorphism group of a special ag group (see AutGroupSagGroup). It is followed by a description of automorphism group elements and their operations (see Automorphism Group Elements and Operations for Automorphism Group Elements). Functions for obtaining some structural information about the automorphism group are described next (see AutGroupStructure, AutGroupFactors and AutGroupSeries). Finally, a function that converts the automorphism group into a form which may be more suitable for some applications is described (see AutGroupConverted).

- AutGroupSagGroup
- Automorphism Group Elements
- Operations for Automorphism Group Elements
- AutGroupStructure
- AutGroupFactors
- AutGroupSeries
- AutGroupConverted

`AutGroupSagGroup(`

`G`)

`AutGroupSagGroup(`

`G`, `l`)

Given a special ag group `G`, the function `AutGroupSagGroup`

computes the
automorphism group of `G`. It returns a group generated by automorphism group
elements (see Automorphism Group Elements). The order of the resulting
automorphism group can be obtained by applying the function `Size`

to it.

If the optional argument `l` is supplied, the automorphism group of *G/G _{l}* is
computed, where

```
More
about Special Ag Groups
```

).

gap> C6 := CyclicGroup(AgWords, 6);; gap> S3 := SymmetricGroup(AgWords, 3);; gap> H := WreathProduct(C6,S3);; gap> G := SpecialAgGroup(H / Centre(H));; gap> G := RenamedGensSagGroup(G, "g"); # rename gens of G to [g1,g2,..,g12] Group( g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ) gap> G.name := "G";; gap> A := AutGroupSagGroup(G); Group( Aut(G, [ g1*g2, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ]), Aut(G, [ g1, g2, g3^2, g4^2*g6^2*g7, g5^2*g6*g7^2, g6*g8^2, g7*g8^2, g8^2, g10*g11, g10, g9*g10, g9*g11*g12 ]), Aut(G, [ g1, g2, g3, g4, g5^2*g6*g7^2, g6*g7, g7^2, g8^2, g9, g10, g11, g12 ]), Aut(G, [ g1, g2, g3, g4*g6*g7^2, g5*g6^2*g7, g6, g7, g8, g9, g10, g11, g12 ]), Aut(G, [ g1, g2, g3, g4, g5*g6*g7^2, g6, g7, g8, g9, g10, g11, g12 ]), Aut(G, [ g1, g2, g3, g4^2, g5*g6^2*g7, g6^2*g8, g7^2*g8, g8, g10*g11, g10, g9*g10, g9*g11*g12 ]), Aut(G, [ g1, g2, g3, g4*g6^2*g7, g5*g6*g7^2, g6, g7, g8, g9, g10, g11, g12 ]), InnerAut(G, g1), InnerAut(G, g3), InnerAut(G, g4), InnerAut(G, g5), InnerAut(G, g6), Aut(G, [ g1, g2, g3*g7*g8, g4, g5, g6*g8, g7, g8, g9, g10, g11, g12 ]), InnerAut(G, g7*g8), Aut(G, [ g1, g2, g3, g4, g5*g8, g6, g7, g8, g9, g10, g11, g12 ]), InnerAut(G, g8^2), Aut(G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g9*g11, g9*g10, g10*g11*g12 ]), Aut(G, [ g1, g2, g3, g4, g5, g6, g7, g8, g10*g12, g10, g9*g11*g12, g9*g10 ]), InnerAut(G, g10), InnerAut(G, g11), InnerAut(G, g12), InnerAut(G, g9) ) gap> Size(A); 30233088 gap> PrimePowersInt(last); [ 2, 9, 3, 10 ]

The size of the outer automorphism group is easily computed as follows.

gap> innersize := Size(G) / Size(Centre(G)); 23328 gap> outersize := Size(A) / innersize; 1296

An element `a` of an automorphism group is a group element record with the
following additional components:

`isAut`

:-

Is bound to`true`

if`a`is an automorphism record.

`group`

:-

Is the special ag group`G`on which the automorphism`a`acts.

`images`

:-

Is the list of images of the generating set of`G`under`a`. That is,`a.images[i]`

is the image of`G.generators[i]`

under the automorphism.

The following components may also be defined for an automorphism group element:

`inner`

:-

If this component is bound, then it is either an element`g`of`G`indicating that`a`is the inner automorphism of`G`induced by`g`, or it is`false`

indicating that`a`is not an inner automorphism.

`weight`

:-

This component is set for the elements of the generating set of the full automorphism group of a sag group. It stores the weight of the generator (see AutGroupStructure).

Along with most of the functions that can be applied to any group elements
(e.g. `Order`

and `IsTrivial`

), the following functions are specific to
automorphism group elements:

`IsAut(`

`a`)

The function `IsAut`

returns `true`

if `a` is an automorphism record, and
`false`

otherwise.

`IsInnerAut(`

`a`)

Returns `true`

if `a` is an inner automorphism, and `false`

otherwise. If
`a.inner`

is already bound, then the information stored there is used. If
`a.inner`

is not bound, `IsInnerAut`

determines whether `a` is an inner
automorphism, and sets `a.inner`

appropriately before returning the answer.

`a` = `b`

For automorphism group elements `a` and `b`, the operator `=`

evaluates to
`true`

if the automorphism records correspond to the same automorphism, and
`false`

otherwise. Note that this may return `true`

even when the two records
themselves are different (one of them may have more information stored in it).

`a` {*} `b`

For automorphism group elements `a` and `b`, the operator `*`

evaluates to the
product *a b* of the automorphisms.

`a` / `b`

For automorphism group elements `a` and `b`, the operator `/`

evaluates to the
quotient *a b ^{-1}* of the automorphisms.

`a` {^} `i`

For an automorphism group element `a` and an integer `i`, the operator `^`

evaluates to the `i`-th power *a ^{i}* of

`a` {^} `b`

For automorphism group elements `a` and `b`, the operator `^`

evaluates to the
conjugate *b ^{-1} a b* of

`Comm(`

`a`, `b`)

The function `Comm`

returns the commutator *a ^{-1} b^{-1} a b*
of the two automorphism group elements

`g` {^} `a`

For a sag group element `g` and an automorphism group element `a`, the operator
`^`

evaluates to the image *g ^{a}* of the ag word

`a.group`

.

`S` {^} `a`

For a subgroup `S` of a sag group and an automorphism group element `a`, the
operator `^`

evaluates to the image *S ^{a}* of the subgroup

`a.group`

.

`list` {*} `a`

`a` {*} `list`

For a list `list` and an automorphism group element `a`, the operator `*`

evaluates to the list whose `i`-th entry is

or `list`[`i`] {*} `a`

respectively.
`a`
{*} `list`[`i`]

`list` {^} `a`

For a list `list` and an automorphism group element `a`, the operator `^`

evaluates to the list whose `i`-th entry is

.
`list`[`i`] {^} `a`

Note that the action of automorphism group elements on the elements of the sag
group via the operator `^`

corresponds to the default action `OnPoints`

(see `Other Operations`

) so that the functions `Orbit`

and `Stabilizer`

can
be used in the natural way. For example:

gap> Orbit(A, G.7); [ g7, g7*g8^2, g7^2, g7^2*g8, g7*g8, g7^2*g8^2 ] gap> Length(last); 6 gap> S := Subgroup(G, [G.11, G.12]); Subgroup( G, [ g11, g12 ] ) gap> Size(S); 4 gap> Orbit(A, S); [ Subgroup( G, [ g11, g12 ] ), Subgroup( G, [ g9*g10, g9*g11*g12 ] ) ] gap> Intersection(last); Subgroup( G, [ ] )

`AutGroupStructure(`

`A`)

The generating set of the automorphism group returned by `AutGroupSagGroup`

is
closely related to a particular subnormal series of the automorphism group.
This function displays a description of the factors of this series.

Let *A* be the automorphism group of *G*. Let *G=G _{1} > G_{2} > ... > G_{m} >
G_{m+1}=1* be the LG-series of

`More about Special Ag Groups`

). For

A = A_{1} ≥ A_{2} ≥ ... ≥ A_{2m+1} = 1 |

of *A* is obtained. The subgroup *A _{i}* is the

The function `AutGroupStructure`

takes as input an automorphism group `A`
computed using `AutGroupSagGroup`

and prints out a description of the
non-trivial factors of the subnormal series of the automorphism group `A`.

The factor of **weight** *i* is *A _{i}/A_{i+1}*. A factor of even weight is an
elementary abelian group, and it is described by giving its order. A factor of
odd weight is described by giving a generating set for a faithful
representation of it as a matrix group acting on a layer of the LG-series of

gap> AutGroupStructure(A);; Order of full automorphism group is 30233088 = 2^9 * 3^10 Factor of size 2 (matrix group, weight 1) Field: GF(2) [1 1] [0 1] Factor of size 2 (matrix group, weight 3) Field: GF(3) [2] Factor of size 36 = 2^2 * 3^2 (matrix group, weight 5) Field: GF(3) [1 0 0] [1 0 1] [1 0 0] [2 0 0] [1 0 2] [0 2 1] [0 1 2] [0 1 1] [0 1 2] [0 1 1] [0 0 1] [0 0 1] [0 0 1] [0 0 2] [0 0 1] [2 0 0] [1 0 1] [0 2 0] [0 1 0] [0 0 2] [0 0 1] Factor of size 27 = 3^3 (elementary abelian, weight 6) Factor of size 3 (elementary abelian, weight 8) Factor of size 27 = 3^3 (elementary abelian, weight 10) Factor of size 6 = 2 * 3 (matrix group, weight 11) Field: GF(2) [1 0 0 0] [0 1 0 1] [1 0 1 0] [0 1 0 0] [1 1 0 0] [1 0 1 1] [0 1 1 1] [1 1 0 0] Factor of size 16 = 2^4 (elementary abelian, weight 12)

As mentioned earlier, each generator of the automorphism group has its weight
stored in the record component `weight`

.

gap> List(Generators(A), a -> a.weight); [ 1, 3, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 8, 10, 10, 10, 11, 11, 12, 12, 12, 12 ]

Note that the subgroup *A _{i}* of

The generating set of a matrix group displayed by `AutGroupStructure`

corresponds directly to the list of elements of the corresponding weight in
`A.generators`

. In the example above, the first matrix listed at weight 5
corresponds to `A.generators[3]`

, and the last matrix listed at weight 5
corresponds to `A.generators[9]`

.

It is also worth noting that the generating set for an automorphism group
returned by `AutGroupSagGroup`

can be heavily redundant. In the example given
above, the weight 5 matrix group can be generated by just three of the seven
elements listed (for example elements 1, 5 and 6). The other four elements can
be discarded from the generating set for the matrix group, and the
corresponding elements of the generating set for *A* can also be discarded.

`AutGroupFactors(`

`A`)

The function `AutGroupFactors`

takes as input an automorphism group `A`
computed by `AutGroupSagGroup`

and returns a list containing descriptions of
the non-trivial factors *A _{i}/A_{i+1}* (see AutGroupStructure). Each element
of this list is either a list

gap> fact:=AutGroupFactors(A);; gap> F := fact[3];; gap> D := DerivedSubgroup(F);; gap> Nice(Generators(D)); Field: GF(3) [1 0 0] [0 1 2] [0 0 1] gap> S := SylowSubgroup(F,2);; gap> Nice(Generators(S)); Field: GF(3) [2 0 0] [1 0 0] [0 1 1] [0 2 2] [0 0 2] [0 0 1]

Of course, the factors of the returned series can be examine further. For

- example:

gap> F := fact[3];; gap> D := DerivedSubgroup(F);; gap> Nice(Generators(D)); Field: GF(3) [1 0 0] [0 1 2] [0 0 1] gap> S := SylowSubgroup(F,2);; gap> Nice(Generators(S)); Field: GF(3) [2 0 0] [1 0 0] [0 1 1] [0 2 2] [0 0 2] [0 0 1]

`AutGroupSeries(`

`A`)

The function `AutGroupSeries`

takes as input an automorphism group `A`
computed by `AutGroupSagGroup`

and returns a list containing those subgroups
*A _{i}* of

gap> series:=AutGroupSeries(A);; gap> series[7].weight; 11 gap> series[8].weight; 12

Each of the subgroups in the list has its weight stored in record component
`weight`

.

gap> series[7].weight; 11 gap> series[8].weight; 12

`AutGroupConverted (`

`A`)

Convert the automorphism group returned by `AutGroupSagGroup`

into a group
generated by `GroupHomomorphismByImages`

records, and return the resulting
group. Note that this function should not be used unless absolutely
necessary, since operations for elements of the resulting group are
substantially slower than operations with automorphism records.

gap> H := AutGroupConverted(A); Group( GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g2, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3^2, g4^2*g6^2*g7, g5^2*g6*g7^2, g6*g8^2, g7*g8^2, g8^2, g10*g11, g10, g9*g10, g9*g11*g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4, g5^2*g6*g7^2, g6*g7, g7^2, g8^2, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4*g6*g7^2, g5*g6^2*g7, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4, g5*g6*g7^2, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4^2, g5*g6^2*g7, g6^2*g8, g7^2*g8, g8, g10*g11, g10, g9*g10, g9*g11*g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4*g6^2*g7, g5*g6*g7^2, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4^2, g5^2, g6^2*g7^2*g8^2, g7*g8^2, g8^2, g10*g11, g10, g9*g10, g9*g11*g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4*g6*g7^2, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g4^2, g2, g3*g6^2*g7, g4, g5*g7^2*g8, g6*g8^2, g7*g8^2, g8, g10*g11, g9*g10*g12, g11*g12, g11 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g5^2, g2, g3, g4*g7*g8^2, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g6^2*g7*g8, g2, g3, g4*g8, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3*g7*g8, g4, g5, g6*g8, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4*g8, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4, g5*g8, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g8, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g9*g11, g9*g10, g10*g11*g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4, g5, g6, g7, g8, g10*g12, g10, g9*g11*g12, g9*g10 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1, g2, g3, g4*g9*g12, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g9*g10*g11, g2, g3, g4*g12, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g9*g11, g2, g3, g4*g11*g12, g5, g6, g7, g8, g9, g10, g11, g12 ] ), GroupHomomorphismByImages( G, G, [ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12 ], [ g1*g9*g10*g11, g2, g3, g4*g9*g10*g11, g5, g6, g7, g8, g9, g10, g11, g12 ] ) )

gap3-jm

11 Mar 2019