# GAP:CharacteristicSubgroups

This GAP function takes as input a group. See more functions like this.

## Definition

### Function type

CharacteristicSubgroups is a GAP function that takes in one argument, representing a group, and outputs a list of its subgroups.

### Behavior

The function returns the list of all characteristic subgroups of the group.

### Typical usage

The typical usage of the function is in the form:

`CharacteristicSubgroups(group);`

## Examples of usage

### Some examples involving prespecified groups

```gap> CharacteristicSubgroups(SymmetricGroup(4));
[ Sym( [ 1 .. 4 ] ), Group([ (2,4,3), (1,4)(2,3), (1,3)(2,4) ]), Group([ (1,4)(2,3), (1,3)(2,4) ]), Group(()) ]
gap> L := CharacteristicSubgroups(SL(2,3));
[ Group([ [ [ Z(3)^0, Z(3)^0 ], [ 0*Z(3), Z(3)^0 ] ], [ [ 0*Z(3), Z(3)^0 ], [ Z(3), 0*Z(3) ] ] ]), Group([ [ [ Z(3)^0, Z(3)^0 ], [ Z(3)^0, Z(3) ] ], [ [ Z(3), Z(3)^0 ], [ Z(3)^0, Z(3)^0 ] ], [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] ]),
Group([ [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3) ] ] ]), Group([  ]) ]
gap> List(L, IdGroup);
[ [ 24, 3 ], [ 8, 4 ], [ 2, 1 ], [ 1, 1 ] ]
```

The first command lists the characteristic subgroups of symmetric group:S4. You can compare these results against the subgroup structure of symmetric group:S4.

The second command stores the characteristic subgroups of special linear group:SL(2,3) into a list, and the third command uses IdGroup to find their group IDs in the SmallGroups library. Note that the first entry of the group ID is the order of the group. You can compare these results against the subgroup structure of special linear group:SL(2,3).

## Time analysis

The following is the total time and average time over all groups of specific orders. Times were measured on a 6-core virtual machine and are in milliseconds. While the actual times may be different on a machine with different processor specifications, the relative time should hold up.

The time on second run is generally very low since it relies on pre-computed data.

The sequence of commands used was as follows, where $n$ is the order:

```A := AllSmallGroups(n);
List(A, CharacteristicSubgroups);
time;```
Order Number of groups of that order Total time on first run (milliseconds) Average time on first run (milliseconds) Total time on second run (milliseconds) Average time on second run (milliseconds)
1 1 4 4 0 0
2 1 50 50 0 0
3 1 57 57 0 0
4 2 116 58 0 0
5 1 37 37 0 0
6 2 183 91.5 0 0
8 5 204 40.8 0 0
12 5 356 71.2 0 0
16 14 843 60.2 3 0.2
24 15 2230 148.7 4 0.3
32 51 4020 78.8 24 0.5