Abstract Algebra with Maple
Chapter 6: Other Topics in Group Theory
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);
> un(48);
For a comparison, here are the cyclic subgroups generated by 5 and 7:
> cycleU(5,48);
> cycleU(7,48);
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
,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));
The same answer! Now, something a little bit more complicated, a subgroup of
SL
(2,
) generated by
and
:
> map(matrix,Gen({[[1,1],[0,1]],[[0,1],[2,0]]},GL2(3)));
It looks like
SL
(2,
). Let's check it out:
> evalb(Gen({[[1,1],[0,1]],[[0,1],[2,0]]},GL2(3))={op(sl2(3))});
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);
Another example, the intersection of cyclic subgroups of
generated by 4, 6, and 25. :
> `intersect`({op(Cycle(4, Z(120)))}, {op(Cycle(6, Z(120)))}, {op(Cycle(25, Z(120)))});
It must be the cyclic subgroup of
generated by the least common multiple of 4, 6, and 25 mod 120:
> Cycle(ilcm(4,6,25) mod 120, Z(120));
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
and
:
> A:=Z(5) &x Z(7):
Check if it is an extended group:
> type(A, extendedGroup);
Find the order of it:
> nops(A[1]);
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);
> nops(B[1]);
Here is the identity of it:
> B[3];
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] );
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));
> IsCyclic(Cyclic(25));
> IsCyclic(Dihedral(12));
> IsCyclic(Un(48));
> IsCyclic(Un(49));
> IsCyclic(Z(4) &x Z(6));
> IsCyclic(Z(4) &x Z(5));
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));
> Generators(Z(4) &x Z(5));
> Generators(Un(48));
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
conjugate to the subgroup
H
of
generated by the 6th element, for
x
= 2, is
> Conjugate(2,[1,6],Dihedral(3));
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,
) generated by
:
> map(matrix,normalizer(Cycle([[1,1],[0,1]],GL2(3)),GL2(3)));
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
:
> cl(6,Dihedral(3));
Another example, the conjugacy class of
in
GL
(2,
):
> map(matrix,cl([[1,1],[0,1]],GL2(3)));
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
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,
and
. The dihedral group
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,
) is too small to contain
as a subgroup, it has only 6 elements. Try the next smallest groups in the
GL
and
SL
series
,
SL
(2,
). First, find its elements of order 4:
> Q:=Nordlist(4,SL2(3)):
> map(matrix,Q);
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)));
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);
> cl(i,Q8);
> Cycle(i,Q8);
>
Certainly, we could define the group of quaternions directly from its Cayley table on p. 89 of Dr. Gallian's text.
Exercises
and
.