gap> GL2 := GeneralLinearGroup(2, GF(3));
GL(2, GF(3))
gap> SL2 := SpecialLinearGroup(2, GF(3));
SL(2, GF(3))
GF(3) defines the finite field with three elements.GF(p^n).GF(p^n) form a cyclic group of order Z(p^n)Z(p^m) for Z returns a generator of the multiplicative group of the finite field with gap> F := GF(2^4);
GF(2^4)
gap> Elements(F);
[ 0*Z(2), Z(2)^0, Z(2^2), Z(2^2)^2, Z(2^4), Z(2^4)^2, Z(2^4)^3, Z(2^4)^4,
Z(2^4)^6, Z(2^4)^7, Z(2^4)^8, Z(2^4)^9, Z(2^4)^11, Z(2^4)^12, Z(2^4)^13,
Z(2^4)^14 ]
Z(p^n)^m is not the same as Z(p^(mn)).
Z(p^n) is an element in Z(p^n)^m is the Z(p^(mn)) is a generator of gap> Order(Z(2^4));
15
gap> Order(Z(2^2)^2);
3
Z(2^4)).Z(2^4)^5 = Z(2^2) and Z(2^4)^10 = Z(2^2)^2.gap> Z(2^4)^5;
Z(2^2)
gap> Z(2^4)^10;
Z(2^2)^2
AllSubgroups to list all subgroups of a group.gap> GL2 := GeneralLinearGroup(2, GF(3));
GL(2, GF(3))
gap> Order(GL2);
48
gap> Size(AllSubgroups(GL2));
55
AllSubgroups can become inefficient for large groups.AllSubgroups would give us a list of ConjugacyClassesSubgroups.gap> GL2 := GeneralLinearGroup(2, GF(3));
GL(2, GF(3))
gap> Size(ConjugacyClassesSubgroups(GL2));
16
gap> c := cc[3];
Group([ [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3)^0 ] ] ])^G
gap> Size(c);
12
gap> Representative(c);
Group([ [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3)^0 ] ] ])
gap> AsList(c);
[ Group([ [ [ 0*Z(3), Z(3)^0 ], [ Z(3)^0, 0*Z(3) ] ] ]),
Group([ [ [ 0*Z(3), Z(3) ], [ Z(3), 0*Z(3) ] ] ]),
Group([ [ [ Z(3)^0, 0*Z(3) ], [ 0*Z(3), Z(3) ] ] ]),
Group([ [ [ Z(3)^0, 0*Z(3) ], [ Z(3)^0, Z(3) ] ] ]),
Group([ [ [ Z(3)^0, 0*Z(3) ], [ Z(3), Z(3) ] ] ]),
Group([ [ [ Z(3)^0, Z(3)^0 ], [ 0*Z(3), Z(3) ] ] ]),
Group([ [ [ Z(3)^0, Z(3) ], [ 0*Z(3), Z(3) ] ] ]),
Group([ [ [ Z(3), 0*Z(3) ], [ 0*Z(3), Z(3)^0 ] ] ]),
Group([ [ [ Z(3), 0*Z(3) ], [ Z(3)^0, Z(3)^0 ] ] ]),
Group([ [ [ Z(3), 0*Z(3) ], [ Z(3), Z(3)^0 ] ] ]),
Group([ [ [ Z(3), Z(3)^0 ], [ 0*Z(3), Z(3)^0 ] ] ]),
Group([ [ [ Z(3), Z(3) ], [ 0*Z(3), Z(3)^0 ] ] ]) ]
c := cc[3];.Size(c) tells us how many elements are in the class c.Representative function, we obtain a representative of this conjugacy class.AsList we list all the subgroups in this conjugacy class.gap> S3 := SymmetricGroup(3);;
gap> A3 := AlternatingGroup(3);;
gap> omega := RightCosets(S3, A3);
[ RightCoset(Alt( [ 1 .. 3 ] ),()), RightCoset(Alt( [ 1 .. 3 ] ),(2,3)) ]
gap> OrbitsDomain(S3, omega, OnRight);
[ [ RightCoset(Alt( [ 1 .. 3 ] ),()), RightCoset(Alt( [ 1 .. 3 ] ),(2,3)) ] ]
gap> IsTransitive(S3, omega, OnRight);
true
gap> D8 := DihedralGroup(IsPermGroup, 8);;
gap> GeneratorsOfGroup(D8);
[ (1,2,3,4), (2,4) ]
gap> IsTransitive(D8, [1..4]);
true
gap> Stabilizer(D8, 1);
Group([ (2,4) ])
Filtered to find the elements of gap> Filtered(D8, g->ForAll([1..4], x -> x^g = x));
[ () ]
gap> G := GL(2, 5);; # Here GL(2, 5) is the same as GL(2, GF(5))
gap> omega := AsList(GF(5)^2);;
gap> v := Random(omega);
[ Z(5), Z(5)^0 ]
gap> Orbit(G, v);
[ [ Z(5), Z(5)^0 ], [ Z(5)^2, Z(5)^0 ], [ Z(5), Z(5) ], [ Z(5)^3, Z(5)^0 ],
[ 0*Z(5), Z(5)^2 ], [ Z(5)^2, Z(5) ], [ Z(5)^0, Z(5) ], [ Z(5)^0, Z(5)^0 ],
[ Z(5)^0, Z(5)^3 ], [ Z(5)^0, 0*Z(5) ], [ Z(5)^3, Z(5) ],
[ Z(5)^2, Z(5)^2 ], [ Z(5), Z(5)^3 ], [ Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^3 ],
[ Z(5)^3, Z(5)^2 ], [ Z(5), Z(5)^2 ], [ Z(5)^2, Z(5)^3 ], [ 0*Z(5), Z(5) ],
[ Z(5)^2, 0*Z(5) ], [ Z(5)^0, Z(5)^2 ], [ Z(5)^3, Z(5)^3 ],
[ Z(5)^3, 0*Z(5) ], [ 0*Z(5), Z(5)^0 ] ]
gap> Stabilizer(G, v);
Group([ [ [ Z(5)^0, Z(5) ], [ 0*Z(5), Z(5) ] ],
[ [ Z(5)^2, Z(5)^0 ], [ Z(5)^2, Z(5)^2 ] ] ])
gap> StructureDescription(last);
"C5 : C4"
Action to obtain the image of the group homomorphism induced by the action.gap> Action(G, GF(5)^2, OnPoints);
Group([ (6,11,16,21)(7,12,17,22)(8,13,18,23)(9,14,19,24)(10,15,20,25),
(2,16,9)(3,21,15)(4,6,17)(5,11,23)(7,22,10)(8,12,13)(14,18,19)(20,24,25) ])
ActionHomomorphism to construct the natural homo-gap> f := ActionHomomorphism(G, GF(5)^2, OnPoints);
<action homomorphism>
gap> Image(f) = Action(G, GF(5)^2, OnPoints);
true
GroupHomomorphismByImages returns the group homomorphism constructed by specifying the values of the map on a given set of generators.fail.Image,IsInjective,IsSurjective,Kernel,PreImage.gap> S4 := SymmetricGroup(4);;
gap> S3 := SymmetricGroup(3);;
gap> f := GroupHomomorphismByImages(S4, S3,\
> [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)],\
> [(1,2),(1,2),(1,2),(1,2),(1,2),(1,2)]);
[ (1,2), (1,3), (1,4), (2,3), (2,4), (3,4) ] ->
[ (1,2), (1,2), (1,2), (1,2), (1,2), (1,2) ]
gap> Size(Kernel(f));
12
gap> IsInjective(f);
false
gap> Size(Image(f));
2
gap> IsSurjective(f);
false
^ to compute the image of a particular element.gap> (1,3)^f;
(1,2)
gap> (1,2,3)^f;
()
NaturalHomomorphismByNormalSubgroup.gap> C12 := CyclicGroup(IsPermGroup, 12);
Group([ (1,2,3,4,5,6,7,8,9,10,11,12) ])
gap> g := GeneratorsOfGroup(C12)[1];
(1,2,3,4,5,6,7,8,9,10,11,12)
gap> N := Subgroup(C12, [g^6]);;
gap> f := NaturalHomomorphismByNormalSubgroup(C12, N);
[ (1,2,3,4,5,6,7,8,9,10,11,12) ] -> [ f1 ]
GeneratorsOfGroup returns a list of generators.GQuotients allows us to determine whether a given group is an epimorphic image of another one.gap> S3 := SymmetricGroup(3);;
gap> S4 := SymmetricGroup(4);
Sym( [ 1 .. 4 ] )
gap> GQuotients(S4, S3);
[ [ (3,4), (1,2,3) ] -> [ (2,3), (1,2,3) ] ]
GQuotients computes all epimorphisms from S4 onto S3.S4 which are isomorphic to S3.gap> f := GQuotients(S4, S3)[1];
[ (2,3), (1,2,4) ] -> [ (2,3), (1,2,3) ]
gap> N := Kernel(f);
Group([ (1,4)(2,3), (1,2)(3,4) ])
gap> Elements(N);
[ (), (1,2)(3,4), (1,3)(2,4), (1,4)(2,3) ]
gap> S4/N = S3;
false
gap> IsomorphismGroups(S4/N, S3);
[ f1, f2 ] -> [ (2,3), (1,2,3) ]
= failed in recognise that, as abstract group, the two groups are the same.AutomorphismGroup computes the automorphism group of a finite group, i.e. the group of all isomorphisms of the group to itself.IsInnerAutomorphism checks whether a given automorphism is inner.gap> aut := AutomorphismGroup(S3);
<group of size 6 with 2 generators>
gap> IsAbelian(aut);
false
gap> for n in [2..5] do
> G := SymmetricGroup(n);;
> if ForAll(AutomorphismGroup(G), IsInnerAutomorphism) then
> Print("Each automorphism of S", n, " is inner.\n");
> fi;
> od;
Each automorphism of S2 is inner.
Each automorphism of S3 is inner.
Each automorphism of S4 is inner.
Each automorphism of S5 is inner.
gap> S6 := SymmetricGroup(6);;
gap> f := First(AutomorphismGroup(S6), x -> not IsInnerAutomorphism(x));
[ (1,2)(3,5)(4,6), (1,2,3,4,5) ] -> [ (5,6), (1,2,3,4,5) ]
First returns the first occurrence in the list satisfying the condition.InnerAutomorphismGroup to construct the inner automorphism of a given group.gap> S6 := SymmetricGroup(6);;
gap> aut := AutomorphismGroup(S6);;
gap> inn := InnerAutomorphismGroup(S6);:
aut/inn is the cyclic group with two elements.gap> Size(aut/inn);
2
Schreier conjecture. If
This is now known to be true as a result of the classification of finite simple groups.
Let's use GAP to test the conjecture for some simple groups.
gap> OuterAutomorphismGroup := function(g)
> return AutomorphismGroup(g)/InnerAutomorphismGroup(g);
> end;
function( g ) ... end
gap> G := ElementaryAbelianGroup(25); # It's C_5 x C_5, clearly not simple
gap> IsSolvable(OuterAutomorphismGroup(G));
false
gap> SchreierConjecture := function(g)
> if not IsSimple(g) then
> return fail;
> else
> return IsSolvable(OuterAutomorphismGroup(g));
> fi;
> end;
function( g ) ... end
gap> SchreierConjecture(AlternatingGroup(5));
true
fail.gap> SchreierConjecture(ElementaryAbelianGroup(25));
fail
AllHomomorphisms constructs the set of all group homomorphisms from a group to another.AllEndomorphisms constructs the set of endomorphism of a group.gap> S3 := SymmetricGroup(3);;
gap> Size(AllEndomorphisms(S3));
10
DirectProduct to define the direct product.gap> S3 := SymmetricGroup(3);;
gap> D8 := DihedralGroup(8);;
gap> S3xD8 := DirectProduct(S3, D8);
<group of size 48 with 5 generators>
Embedding gives the canonical embedding.gap> i_S3 := Embedding(S3xD8, 1);
MappingByFunction( Sym( [ 1 .. 3 ] ), <group of size 48 with
5 generators>, function( elm ) ... end )
gap> IsInjective(i_S3);
true
gap> IsSurjective(i_S3);
false
Projection gives the canonical projection.gap> p_D8 := Projection(S3xD8, 2);
MappingByFunction( <group of size 48 with 5 generators>, <pc group of size
8 with 3 generators>, function( elm ) ... end )
gap> IsSurjective(p_D8);
true
gap> IsInjective(p_D8);
false
gap> Image(i_S3) = Kernel(p_D8);
true
gap> C4 := CyclicGroup(IsPermGroup, 4);;
gap> C2 := CyclicGroup(IsPermGroup, 2);;
gap> Q8 := QuaternionGroup(8);;
gap> C4xC4 := DirectProduct(C4, C4);;
gap> C2xQ8 := DirectProduct(C2, Q8);;
gap> Collected(List(C4xC4, Order));
[ [ 1, 1 ], [ 2, 3 ], [ 4, 12 ] ]
gap> Collected(List(C2xQ8, Order));
[ [ 1, 1 ], [ 2, 3 ], [ 4, 12 ] ]
Q8 is the Quaternion Group. It is a non-abelian group of order gap> IsAbelian(C4xC4);
true
gap> IsAbelian(C2xQ8);
false
SemidirectProduct(H, phi, G) allows us to construct the semidirect product gap> C7 := CyclicGroup(7);;
gap> C2 := CyclicGroup(2);;
gap> f := GroupHomomorphismByFunction(C7, C7, x->Inverse(x));;
gap> f in AutomorphismGroup(C7);
true
gap> Order(f);
2
gap> g := GeneratorsOfGroup(C2)[1];;
gap> phi := GroupHomomorphismByImages(C2, AutomorphismGroup(C7), [g], [f]);;
gap> G := SemidirectProduct(C2, phi, C7);;
gap> IsomorphismGroups(G, DihedralGroup(14));
[ f1, f2 ] -> [ f1, f2 ]
gap> StructureDescription(G);
"D14"
Embedding and Projection for the canonical mapsgap> i_C2 := Embedding(G, 1);;
gap> StructureDescription(Image(i_C2));
"C2"
gap> p := Projection(G);;
gap> StructureDescription(Image(p));
"C2"
gap> C2 := CyclicGroup(2);;
gap> C4xC4 := DirectProduct(CyclicGroup(4), CyclicGroup(4));;
gap> hom := AllHomomorphisms(C2, AutomorphismGroup(C4xC4));;
gap> list := [];;
gap> for phi in hom do
> Add(list, SemidirectProduct(C2, phi, C4xC4));
> od;
gap> Size(list);
28
gap> Set(list, IdSmallGroup);
[ [ 32, 11 ], [ 32, 21 ], [ 32, 24 ], [ 32, 25 ], [ 32, 31 ], [ 32, 33 ],
[ 32, 34 ] ]
Group(mat1, mat2, ...) - Create matrix group.GL(n, F) - General Linear Group.SL(n, F) - Special Linear Group.GF(p^n) - Finite field.Order(el) - Order of element.GeneratorsOfGroup(G) - Group generators.AllSubgroups(G) - All subgroupsConjugacyClassesSubgroups(G) - Conjugacy classes of subgroups.Representative(c) - Representative of a conjugacy class.AsList(c) - List elements of conjugacy class.Orbit(G, x) - Orbit under action.IsTransitive(G, omega) - Is transitive?Action(G, Omega, OnPoints) - Action group.ActionHomomorphism(G, Omega, OnPoints) - Action homomorphism.GroupHomomorphismByImages(G, H, gensG, images) - Define homomorphismImage(f) - ImageKernel(f) - KernelIsInjective(f) - Is injective?IsSurjective(f) - Is surjective?AutomorphismGroup(G) - Automorphism group.