Chapter6.mws

Abstract Algebra with Maple
Chapter 6: Other Topics in Group Theory

by Alec Mihailovs

6: Other Topics in Group Theory

Procedures defined from previous chapters

> restart;

> with(numtheory):

Warning, the protected name order has been redefined and unprotected

> un:=n->select(m->evalb(igcd(m,n)=1),[$1..n]):

> cycleU:=(c,n)->[seq(c^(i-1) mod n, i=1..order(c,n))]:

> gl2:=n->select(A->evalb(igcd(A[1,1]*A[2,2]-A[1,2]*A[2,1],n)=1),
[seq(seq(seq(seq([[j,i],[l,k]],l=0..n-1),k=0..n-1),j=0..n-1),i=0..n-1)]):

> Cycle:=proc(c,g)
local v,a;
v:=[g[3]];
a:=c;
while not a=g[3] do
v:=[op(v),a];
a:=g[2](a,c)
od;
v
end:

> isCP:=proc(g,m)
local i,j;
i:=1;
while (i<=nops(g) and {seq(m(g[i],g[j]),j=1..nops(g))}={op(g)}) do
i:=i+1
od;
evalb(i=nops(g)+1)
end:

> isAssociative:=proc(g,m)
local i,j,k;
i:=1;
j:=1;
k:=1;
while(i<=nops(g) and m(m(g[i],g[j]),g[k])=m(g[i],m(g[j],g[k]))) do
if k=nops(g) then
if j=nops(g) then
i:=i+1;
j:=1;
k:= 1
else
j:=j+1
fi
else
k:=k+1
fi od;
evalb(i=nops(g)+1)
end:

> hasRightId:=proc(g,m)
local i,k;
member(g[1],[seq(m(g[1],g[i]), i=1..nops(g))],'k');
i:=1;
while (i<=nops(g) and m(g[i],g[k])=g[i]) do
i:=i+1
od;
evalb(i=nops(g)+1)
end:

> `type/group`:=proc(g)
type(g,list) and nops(g)=2 and (type(g[1],list) or type(g[1],set)) and type(g[2],procedure) and isCP(op(g)) and isAssociative(op(g)) and hasRightId(op(g)) end:

> `type/extendedGroup`:=proc(g) local i;
if type(g,list) and nops(g)=4 and type([g[1],g[2]],group) and g[2](g[1][1],g[3])=g[1][1]
then i:=1; while not i=nops(g[1])+1 and g[2](g[1][i],g[4](g[1][i]))=g[3] do i:=i+1 od;
evalb(i=nops(g[1])+1) else false fi end:

> invU:=proc(a,n)
local v;
igcdex(a,n,'v');
v mod n
end:

> invSL:=(A,n)->[[A[2,2],-A[1,2] mod n],[-A[2,1] mod n, A[1,1]]]:

> invGL:=proc(A,n)
local d;
d:=invU(A[1,1]*A[2,2]-A[1,2]*A[2,1],n);
[[A[2,2]*d mod n,-A[1,2]*d mod n],[-A[2,1]*d mod n, A[1,1]*d mod n]]
end:

> cyclic:=n->[seq([$i..n,$1..i-1],i=1..n)]:

> dihedral:=n->[op(cyclic(n)),seq([n+1-j$j=i..n,n+1-j$j=1..i-1],i=1..n)]:

> mult:=proc(a,b,g)
local i,v;
member([seq(g[a][g[b][i]],i=1..nops(g[a]))],g,'v');
v
end:

> Cyclic:=n->[[$1..n], (a,b)->`if`(a+b-1<=n,a+b-1,(a+b-1)-n), 1, a->`if`(a=1,1,n-a+2)]:

> Dihedral:=n->[[$1..2*n], (a,b)->mult(a,b,dihedral(n)), 1, a->`if`(a=1 or a>n,a,n-a+2)]:

> Un:=n->[un(n),(a,b)->a*b mod n, 1, a->invU(a,n)]:

> mm:=(A,B,n)->[[A[1,1]*B[1,1] +A[1,2]*B[2,1] mod n,A[1,1]*B[1,2] +A[1,2]*B[2,2] mod n ],[A[2,1]*B[1,1] +A[2,2]*B[2,1] mod n,A[2,1]*B[1,2] +A[2,2]*B[2,2] mod n]]:

> GL2:=n->[gl2(n),(a,b)->mm(a,b,n),[[1,0],[0,1]],a->invGL(a,n)]:

> sl2:=n->select(A->evalb(A[1,1]*A[2,2]-A[1,2]*A[2,1] mod n=1),
[seq(seq(seq(seq([[j,i],[l,k]],l=0..n-1),k=0..n-1),j=0..n-1),i=0..n-1)]):

> SL2:=n->[sl2(n),(a,b)->mm(a,b,n),[[1,0],[0,1]],a->invSL(a,n)]:

> Z:=n->[[$0..n-1],(a,b)->a+b mod n, 0, a->-a mod n]:

> Ord:=proc(c,g)
local a,n;
a:=c;
n:=1;
while not a=g[3] do
n:=n+1;
a:=g[2](a,c)
od;
n
end:

> Nordlist:=proc(d,g)
local i,
v;
v:=[];
for i from 1 to nops(g[1]) do
if Ord(g[1][i],g)=d then
v:=[op(v),g[1][i]]
fi od;
v
end:

> CentralizerS:=proc(S,G) local i,j,v;
v:=[]; for i to nops(G[1]) do j:=1; while not j=nops(S)+1 and
G[2](G[1][i],S[j])=G[2](S[j],G[1][i]) do j:=j+1 od; if j=nops(S)+1 then v:=[op(v),G[1][i]] fi od; v end:

> Center:=G->CentralizerS(G[1],G):

>

Subgroups Generated by a Few Elements

We already have the procedure cycleU listing the elements of a cyclic subgroup of U ( n ). Here is the procedure finding elements of the subgroup of U ( n ), generated by a set s of elements of U ( n ):

> genU:=proc(s,n)
local i,j,v,vs;
v:={1};
vs:={op(s)} union {1};
while not v=vs do
v:=vs;
for i from 1 to nops(v) do
for j from 1 to nops(s) do
vs:=vs union {v[i]*s[j] mod n} od
od
od;
v
end:

For example, here is the subgroup of U (48) generated by 5 and 7:

> genU({5,7},48);

{1, 5, 7, 11, 25, 29, 31, 35}

> un(48);

[1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 4...

For a comparison, here are the cyclic subgroups generated by 5 and 7:

> cycleU(5,48);

[1, 5, 25, 29]

> cycleU(7,48);

[1, 7]

Here is the analogous procedure for extended groups:

> Gen:=proc(s,g)
local i,j,v,vs;
v:={g[3]};
vs:={op(s)} union v;
while not v=vs do
v:=vs;
for i from 1 to nops(v) do
for j from 1 to nops(s) do
vs:=vs union {g[2](v[i],s[j]), g[2](s[j],v[i])}
od
od
od;
v
end:

For Z[n] ,we don't actually need such a procedure, because the subgroup generated by s = { a, b, ..., c } is just a cyclic subgroup generated by igcd ( op(s) ) . Let's see what we get using Gen :

> Gen({4,6},Z(12));

{0, 2, 4, 6, 8, 10}

The same answer! Now, something a little bit more complicated, a subgroup of SL (2, Z[3] ) generated by matrix([[1, 1], [0, 1]]) and matrix([[0, 1], [2, 0]]) :

> map(matrix,Gen({[[1,1],[0,1]],[[0,1],[2,0]]},GL2(3)));

{matrix([[0, 2], [1, 1]]), matrix([[1, 1], [2, 0]])...
{matrix([[0, 2], [1, 1]]), matrix([[1, 1], [2, 0]])...
{matrix([[0, 2], [1, 1]]), matrix([[1, 1], [2, 0]])...
{matrix([[0, 2], [1, 1]]), matrix([[1, 1], [2, 0]])...
{matrix([[0, 2], [1, 1]]), matrix([[1, 1], [2, 0]])...

It looks like SL (2, Z[3] ). Let's check it out:

> evalb(Gen({[[1,1],[0,1]],[[0,1],[2,0]]},GL2(3))={op(sl2(3))});

true

Intersections and Products of Groups

Some exercises in Dr. Gallian's text are using intersections of subgroups and a product of groups. The intersections can be found using the Maple command intersect . For example, the intersection of subgroups of U (48) generated by {5,7} and {9,25}:

> genU({5,7},48) intersect genU({9,25},48);

{1, 25}

Another example, the intersection of cyclic subgroups of Z[120] generated by 4, 6, and 25. :

> `intersect`({op(Cycle(4, Z(120)))}, {op(Cycle(6, Z(120)))}, {op(Cycle(25, Z(120)))});

{0, 60}

It must be the cyclic subgroup of Z[120] generated by the least common multiple of 4, 6, and 25 mod 120:

> Cycle(ilcm(4,6,25) mod 120, Z(120));

[0, 60]

Now, define the product of the extended groups using the following procedure:

> `&x`:=proc(g,h) local m,i;
m:=(a,b)->[g[2](a[1],b[1]),h[2](a[2],b[2])];
i:=a->[g[4](a[1]),h[4](a[2])];
[[seq(seq([g[1][i],h[1][j]],j=1..nops(h[1])),i=1..nops(g[1]))],
m, [g[3],h[3]], i] end:

For example, the product of Z[5] and Z[7] :

> A:=Z(5) &x Z(7):

Check if it is an extended group:

> type(A, extendedGroup);

true

Find the order of it:

> nops(A[1]);

35

We can use it to find products of three or more groups, too:

> B:=Z(2) &x Z(2) &x GL2(2):

> type(B, extendedGroup);

true

> nops(B[1]);

24

Here is the identity of it:

> B[3];

[[0, 0], [[1, 0], [0, 1]]]

It looks as if B equals the product of the first two groups multiplied by the third group. Check if it is true:

> evalb( B[1] = ((Z(2) &x Z(2)) &x GL2(2))[1] );

true

Is a Group Cyclic?

The following procedure is checking whether an extended group G is cyclic:

> IsCyclic:=proc(g) local v;
v:={op(g[1])}; while not nops(v)=0 and not Ord(v[1],g)=nops(g[1]) do v:=v minus {op(Cycle(v[1],g))} od; not evalb(v={}) end:

Here are a few examples:

> IsCyclic(Z(1));

true

> IsCyclic(Cyclic(25));

true

> IsCyclic(Dihedral(12));

false

> IsCyclic(Un(48));

false

> IsCyclic(Un(49));

true

> IsCyclic(Z(4) &x Z(6));

false

> IsCyclic(Z(4) &x Z(5));

true

If a group is cyclic, the following procedure finds its generators:

> Generators:=proc(g) local v,n; n:=nops(g[1]); if n=1 then g[3] else
v:={op(g[1])}; while not nops(v)=0 and not Ord(v[1],g)=n do v:=v minus {op(Cycle(v[1],g))} od; if v={} then FAIL else {seq(Cycle(v[1],g)[un(n)[i]+1],i=1..phi(n))} fi fi end:

For example,

> Generators(Un(49));

{3, 5, 10, 12, 17, 24, 26, 33, 38, 40, 45, 47}

> Generators(Z(4) &x Z(5));

{[1, 3], [1, 4], [3, 1], [3, 2], [3, 3], [3, 4], [1...

> Generators(Un(48));

FAIL

Normalizers and Conjugacy Classes

"Normalizer" is an environment variable in Maple, so we should use another term for the normalizer of a subgroup. I chose to use "normalizer" even if it contradicts the agreement of using capital letters for commands related to the extended groups. First we have to define conjugate groups:

> Conjugate:=(x,h,g)->map(y->g[2](g[2](x,y),g[4](x)),h):

For example, the group x*H*x^`-1` conjugate to the subgroup H of D[3] generated by the 6th element, for x = 2, is

> Conjugate(2,[1,6],Dihedral(3));

[1, 4]

Now we define normalizers by the following procedure:

> normalizer:=(h,g)->select(x->evalb({op(Conjugate(x,h,g))}={op(h)}),g[1]):

For example, the normalizer of the cyclic subgroup of GL (2, Z[3] ) generated by matrix([[1, 1], [0, 1]]) :

> map(matrix,normalizer(Cycle([[1,1],[0,1]],GL2(3)),GL2(3)));

[matrix([[1, 0], [0, 1]]), matrix([[1, 0], [0, 2]])...
[matrix([[1, 0], [0, 1]]), matrix([[1, 0], [0, 2]])...
[matrix([[1, 0], [0, 1]]), matrix([[1, 0], [0, 2]])...

Conjugacy classes can be defined as follows (also without the capitalization):

> cl:=(a,g)->{seq(g[2](g[2](g[1][i],a),g[4](g[1][i])),i=1..nops(g[1]))}:

For example, the conjugacy class of the 6th element of D[3] :

> cl(6,Dihedral(3));

{4, 5, 6}

Another example, the conjugacy class of matrix([[1, 1], [0, 1]]) in GL (2, Z[3] ):

> map(matrix,cl([[1,1],[0,1]],GL2(3)));

{matrix([[2, 2], [1, 0]]), matrix([[0, 2], [1, 2]])...
{matrix([[2, 2], [1, 0]]), matrix([[0, 2], [1, 2]])...

Group of Quaternions

All the groups of order less than 12 are either groups in our list of extended groups, or their products, except the group of quaternions. We will add the group of quaternions Q[8] to our list. It is a non-Abelian group of order 8 having 1 element of order 1 (the identity), 1 element of order 2 (negative 1), and 6 elements of order 4 (plus or minus i, j, k ). There are only 2 non-Abelian groups of order 8, Q[8] and D[4] . The dihedral group D[4] has only 2 elements of order 4, the rotations by 90 degrees and 270 degrees. Its other elements have degrees either 1 (identity), or 2 (the reflections and the rotation by 180 degrees). Thus, if we find a non-Abelian group of order 8 having more than 2 elements of order 4, it will be the group of quaternions. Try to find it among the subgroups of the groups we already know. GL2 (2, Z[2] ) is too small to contain Q[8] as a subgroup, it has only 6 elements. Try the next smallest groups in the GL and SL series , SL (2, Z[3] ). First, find its elements of order 4:

> Q:=Nordlist(4,SL2(3)):

> map(matrix,Q);

[matrix([[0, 1], [2, 0]]), matrix([[1, 1], [1, 2]])...
[matrix([[0, 1], [2, 0]]), matrix([[1, 1], [1, 2]])...

Exactly 6 elements. If the group generated by them has 8 elements, then it is the group of quaternions.

> map(matrix,Gen(Q,SL2(3)));

{matrix([[1, 0], [0, 1]]), matrix([[2, 0], [0, 2]])...
{matrix([[1, 0], [0, 1]]), matrix([[2, 0], [0, 2]])...

8 elements, so it is the group of quaternions. Let's make an extended group from it:

> Q8inSL:=[[[[1,0],[0,1]],[[2,0],[0,2]],op(Q)],(a,b)->mm(a,b,3),[[1,0],[0,1]],a->invSL(a,3)]:

We also need a function converting the matrices, or lists, to the standard i, j, k expressions. Let's do it:

> quat([[1,0],[0,1]]):=1: quat([[2,0],[0,2]]):=-1: quat(Q[1]):=i: quat(Q[2]):=j:
quat(Q[3]):=-k: quat(Q[4]):=-i: quat(Q[5]):=k: quat(Q[6]):=-j:

We will also need the backward conversion, from i, j, k to the lists:

> qback(1):=[[1,0],[0,1]]: qback(-1):=[[2,0],[0,2]]: qback(i):=Q[1]: qback(j):=Q[2]:
qback(-k):=Q[3]: qback(-i):=Q[4]: qback(k):=Q[5]: qback(-j):=Q[6]:

Now we can redefine the quaternion group in terms of i , j , and k :

> Q8:=[map(quat,Q8inSL[1]),(a,b)->quat(Q8inSL[2](qback(a),qback(b))),1,a->quat(Q8inSL[4](qback(a)))]:

For example,

> Center(Q8);

[1, -1]

> cl(i,Q8);

{-i, i}

> Cycle(i,Q8);

[1, i, -1, -i]

>

Certainly, we could define the group of quaternions directly from its Cayley table on p. 89 of Dr. Gallian's text.

Exercises