# GAP:CharacteristicSubgroups

This article is about a GAP function.

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

Template:Subgroup property enumeration

## 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);

## Related functions

- GAP:NormalSubgroups lists all the normal subgroups of the group.
- GAP:IsCharacteristicSubgroup tests if a subgroup is characteristic in the whole 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 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 |