<html><head><title>[SONATA-tutorial] 1 Groups</title></head>
<body text="#000000" bgcolor="#ffffff">
[<a href = "chapters.htm">Up</a>] [<a href ="CHAP002.htm">Next</a>] [<a href = "theindex.htm">Index</a>]
<h1>1 Groups</h1><p>
<P>
<H3>Sections</H3>
<oL>
<li> <A HREF="CHAP001.htm#SECT001">Thomas' and Wood's catalogue of small groups</a>
<li> <A HREF="CHAP001.htm#SECT002">Subgroups</a>
<li> <A HREF="CHAP001.htm#SECT003">Group endomorphisms</a>
<li> <A HREF="CHAP001.htm#SECT004">Finding a set of generators</a>
</ol><p>
<p>
SONATA adds some functions for groups. To use the functions provided by
SONATA, one has to load it into GAP:
<pre>
gap> LoadPackage( "sonata" );
</pre>
<p>
<p>
<h2><a name="SECT001">1.1 Thomas' and Wood's catalogue of small groups</a></h2>
<p><p>
Most of the nonabelian groups (even small ones) do not have a
popular name (as <i>S</i><sub>3</sub> or <i>A</i><sub>4</sub>). We like to give unique names to
the groups we are working with. The book ``Group Tables'' by
Thomas and Wood classifies all groups up to order 32. In this book
every group has a name of the form <code>m/n</code>, where <code>m</code> is the order of
the group and <code>n</code> the number of the particular group of order <code>m</code>.
The cyclic groups have the name <code>m/1</code>. Then come the abelian groups,
finally the non-abelian ones. To find out the name of a given group
in their book we use <code>IdTWGroup</code>.
<pre>
gap> G := DihedralGroup( 8 );
<pc group of size 8 with 3 generators>
gap> IdTWGroup( G );
[ 8, 4 ]
</pre>
If we want to refer to the group with the name <code>8/4</code> directly we
say
<pre>
gap> H := TWGroup( 8, 4 );
8/4
</pre>
Groups which are obtained in this way always come as a group of
permutations. We can have a look at the elements of <var>H</var> if we ask
for <var>H</var> as a list.
<pre>
gap> AsList( H );
[ (), (2,4), (1,2)(3,4), (1,2,3,4), (1,3), (1,3)(2,4), (1,4,3,2),
(1,4)(2,3) ]
</pre>
Clearly, <var>G</var> and <var>H</var> are not equal but they are isomorphic. If we want
to know what the isomorphism between the two looks like, we use
<code>IsomorphismGroups</code>. Note, that a homomorphism is determined by the
images of the generators.
<pre>
gap> IsomorphismGroups(G,H);
[ f1, f2, f3 ] -> [ (2,4), (1,2,3,4), (1,3)(2,4) ]
</pre>
How many nonisomorphic groups are there of order <var>n</var>? Up to order
1000 the function <code>NumberSmallGroups</code> gives the answer. As a shortcut
for <code>TWGroup( 32, 46 )</code> we may also type <code>GTW32_46</code>.
<pre>
gap> NumberSmallGroups( 32 );
51
gap> GTW32_46;
32/46
gap> GTW32_46 = TWGroup( 32, 46 );
true
</pre>
Now we find all nonabelian groups with trivial centre of order at most
32. We use <code>GroupList</code>, a list of all groups up to order 32 and filter
out the nonabelian ones with trivial center.
<pre>
gap> Filtered( GroupList, g -> not IsAbelian( g ) and
> Size(Centre( g ))=1 );
[ 6/2, 10/2, 12/4, 14/2, 18/4, 18/5, 20/5, 21/2, 22/2, 24/12, 26/2,
30/4 ]
</pre>
This was the first time that we have used a function as an argument.
The second argument of the function <code>Filtered</code> is a function
(<code>g -> not ...</code>), which returns for every <code>g</code> the boolean value <code>true</code>
if <code>g</code> is not abelian and the size of its centre is 1, and <code>false</code>
otherwise. This is the easiest way to write a function.
<p>
<p>
<h2><a name="SECT002">1.2 Subgroups</a></h2>
<p><p>
The function <code>Subgroups</code> returns a list of all subgroups of a group.
We can use this function and the <code>Filtered</code> command to determine all
characteristic subgroups of the dihedral group of order 16.
<pre>
gap> D16 := DihedralGroup( 16 );
<pc group of size 16 with 4 generators>
gap> S := Subgroups( D16 );
[ Group([ ]), Group([ f4 ]), Group([ f1 ]), Group([ f1*f3 ]),
Group([ f1*f4 ]), Group([ f1*f3*f4 ]), Group([ f1*f2 ]),
Group([ f1*f2*f3 ]), Group([ f1*f2*f4 ]),
Group([ f1*f2*f3*f4 ]), Group([ f4, f3 ]), Group([ f4, f1 ]),
Group([ f1*f3, f4 ]), Group([ f4, f1*f2 ]),
Group([ f1*f2*f3, f4 ]), Group([ f4, f3, f1 ]),
Group([ f4, f3, f2 ]), Group([ f4, f3, f1*f2 ]),
Group([ f4, f3, f1, f2 ]) ]
gap> C := Filtered( S, G -> IsCharacteristicInParent( G ) );
[ Group([ ]), Group([ f4 ]), Group([ f4, f3 ]), Group([ f4, f3, f2 ]),
Group([ f4, f3, f1, f2 ]) ]
</pre>
<p>
<p>
<h2><a name="SECT003">1.3 Group endomorphisms</a></h2>
<p><p>
Everybody knows that every automorphism of the symmetric group <i>S</i><sub>3</sub>
(= <code>GTW6_2</code>) fixes a point (besides the identity of the group). But,
are there endomorphisms which fix nothing but the identity? We are
going to simply try it out. On our way we will find out that all
automorphisms of <i>S</i><sub>3</sub> are inner automorphisms.
<pre>
gap> G := GTW6_2;
6/2
gap> Automorphisms( G );
[ IdentityMapping( 6/2 ), ^(2,3), ^(1,3), ^(1,3,2), ^(1,2,3), ^(1,2) ]
gap> Endos := Endomorphisms( G );
[ [ (1,2), (1,2,3) ] -> [ (), () ], [ (1,2), (1,2,3) ] -> [ (2,3), () ],
[ (1,2), (1,2,3) ] -> [ (1,3), () ], [ (1,2), (1,2,3) ] -> [ (1,2), () ],
[ (1,2), (1,2,3) ] -> [ (2,3), (1,2,3) ],
[ (1,2), (1,2,3) ] -> [ (2,3), (1,3,2) ],
[ (1,2), (1,2,3) ] -> [ (1,2), (1,3,2) ],
[ (1,2), (1,2,3) ] -> [ (1,2), (1,2,3) ],
[ (1,2), (1,2,3) ] -> [ (1,3), (1,2,3) ],
[ (1,2), (1,2,3) ] -> [ (1,3), (1,3,2) ] ]
</pre>
Now it is time for real programming, but don't worry, it is all very
simple. We write a function which decides whether an endomorphism
fixes a point besides the identity or not (in the latter case we
call the endomorphism <strong>fixed-point-free</strong>).
<pre>
gap> IsFixedpointfree := function( endo )
>local group;
> group := Source( endo ); # the domain of endo
> return ForAll( group, x -> (x <> x^endo) or (x = Identity(group)) );
> # x is not fixed or x is the identity
>end;
function ( endo ) ... end
</pre>
This paragraph says that <code>IsFixedpointfree</code> is a function that takes
one argument (called <code>endo</code>). Now we create a local variable <code>group</code> to
store the group on which the endomorphism acts (in our example this
will always be <i>S</i><sub>3</sub>, but maybe we want to use this function for
other groups, too). Local means that <font face="Gill Sans,Helvetica,Arial">GAP</font> may forget this variable
as soon as it has computed what we want (and it will forget it
instantly afterwards). Now we store the domain of <code>endo</code> in the
variable <code>group</code>. The next line already returns the result. It returns
<code>true</code> if for all elements <code>x</code> of <code>group</code> either <code>x</code> is not fixed
by <code>endo</code> or <code>x</code> is the identity of the group. This line is a
one-to-one translation of the logical statement that <code>endo</code> is
fixed-point-free.
<p>
The result is a function which can be applied to any endomorphism, now.
For example we can ask if the fourth endomorphism in the list <code>E</code> is
fixed-point-free.
<pre>
gap> e := Endos[4];
[ (1,2), (1,2,3) ] -> [ (1,2), () ]
gap> IsFixedpointfree( e );
false
</pre>
Now we filter out the fixed-point-free endomorphisms.
<pre>
gap> Filtered( Endos, IsFixedpointfree );
[ [ (1,2), (1,2,3) ] -> [ (), () ] ]
</pre>
<p>
<p>
<h2><a name="SECT004">1.4 Finding a set of generators</a></h2>
<p><p>
It is well known that for any finite p-group <i>G</i> the factor <i>G</i>/Φ(<i>G</i>)
modulo the Frattini subgroup Φ(<i>G</i>) has order <i>p</i><sup>δ(<i>G</i>)</sup>, where
δ(<i>G</i>) is the minimal number of generators of <i>G</i>. Moreover
the representatives of the residue classes modulo Φ(<i>G</i>) form a
set of generators. So a generating set for a <i>p</i>-group
could be obtained in the following way. We choose the group 16/11 (a
semidirect product of the cyclic group of order 8 with the cyclic
group of order 2).
<pre>
gap> G := GTW16_11;
16/11
gap> F := FrattiniSubgroup( G );
Group([ (1,4,11,14)(2,7,10,16)(3,8,15,9)(5,12,6,13) ])
gap> NontrivialRepresentativesModNormalSubgroup( G, F );
[ (1,16,14,10,11,7,4,2)(3,12,9,5,15,13,8,6),
(1,3)(2,5)(4,8)(6,10)(7,12)(9,14)(11,15)(13,16),
(1,13,4,5,11,12,14,6)(2,3,7,8,10,15,16,9) ]
gap> H := Group( last );
Group([ (1,16,14,10,11,7,4,2)(3,12,9,5,15,13,8,6),
(1,3)(2,5)(4,8)(6,10)(7,12)(9,14)(11,15)(13,16),
(1,13,4,5,11,12,14,6)(2,3,7,8,10,15,16,9) ])
gap> G = H; # test
true
</pre>
The variable <code>last</code> in the this example refers to the last result,
i.e. in this case the list of representatives.
<p>
<p>
[<a href = "chapters.htm">Up</a>] [<a href ="CHAP002.htm">Next</a>] [<a href = "theindex.htm">Index</a>]
<P>
<address>SONATA-tutorial manual<br>September 2025
</address></body></html>
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.