# This file defines the group G of order 16 that acts on X, and
# some of its subgroups.
# The identity element of G is denoted by 1.
# The generator lambda is called L in the Maple code. Its powers are
# LL and LLL. The generators mu and nu are M and N respectively.
# Thus LLMN refers to lambda^2 mu nu, for example.
G4 := [1,L,LL,LLL]; #@ G4
H4 := [1,LL,N,LLN]; #@ H4
G8 := [1,L,LL,LLL,M,LM,LLM,LLLM]; #@ G8
H8 := [1,LL,M,LLM,N,LLN,MN,LLMN]; #@ H8
K8 := [1,LL,LM,LLLM,LN,LLLN,MN,LLMN]; #@ K8
L8 := [1,L,LL,LLL,N,LN,LLN,LLLN]; #@ L8
G16 := [1,L,LL,LLL,M,LM,LLM,LLLM,
N,LN,LLN,LLLN,MN,LMN,LLMN,LLLMN]; #@ G16
protect(
'L','LL','LLL',
'M','LM','LLM','LLLM',
'N','LN','LLN','LLLN',
'MN','LMN','LLMN','LLLMN'
);
# The table v_permlist encodes the standard action of G on {0,1,..,13}.
# If g.i = j, then j occurs as entry number i+1 in v_permlist[g].
# (The shift by 1 occurs because Maple indexes lists starting with
# position 1, not position 0.)
#@ v_permlist
v_permlist[1] := [0,1,2,3,4,5,6,7,8,9,10,11,12,13]:
v_permlist[L] := [0,1,3,4,5,2,7,8,9,6,11,10,13,12]:
v_permlist[LL] := [0,1,4,5,2,3,8,9,6,7,10,11,12,13]:
v_permlist[LLL] := [0,1,5,2,3,4,9,6,7,8,11,10,13,12]:
v_permlist[M] := [1,0,2,5,4,3,9,8,7,6,12,13,10,11]:
v_permlist[LM] := [1,0,3,2,5,4,6,9,8,7,13,12,11,10]:
v_permlist[LLM] := [1,0,4,3,2,5,7,6,9,8,12,13,10,11]:
v_permlist[LLLM] := [1,0,5,4,3,2,8,7,6,9,13,12,11,10]:
v_permlist[N] := [0,1,2,5,4,3,9,8,7,6,10,11,12,13]:
v_permlist[LN] := [0,1,3,2,5,4,6,9,8,7,11,10,13,12]:
v_permlist[LLN] := [0,1,4,3,2,5,7,6,9,8,10,11,12,13]:
v_permlist[LLLN] := [0,1,5,4,3,2,8,7,6,9,11,10,13,12]:
v_permlist[MN] := [1,0,2,3,4,5,6,7,8,9,12,13,10,11]:
v_permlist[LMN] := [1,0,3,4,5,2,7,8,9,6,13,12,11,10]:
v_permlist[LLMN] := [1,0,4,5,2,3,8,9,6,7,12,13,10,11]:
v_permlist[LLLMN] := [1,0,5,2,3,4,9,6,7,8,13,12,11,10]:
# This function converts a permutation represented as above, to
# a list of disjoint cycles. It is essentially the built in
# function convert(-,disjcyc) with a wrapper to deal with the fact
# that we index vertices from 0.
#@ to_cycles
to_cycles := proc(s::list(integer))
local s1,s2,c;
s1 := map(i -> i+1,s);
s2 := convert(s1,disjcyc);
map(c -> map(i -> i-1,c),s2);
end:
# This is the inverse of to_cycles.
#@ from_cycles
from_cycles := proc(s::list(list(integer)))
map(i -> i-1,convert(map(c -> map(i -> i+1,c),s),permlist,14));
end:
# This gives a different representation of the action, as a table
# of functions. If g.i = j, then act_V[g](i) wil be equal to j.
#@ v_cycles
#@ act_V
for T in G16 do
v_cycles[T] := to_cycles(v_permlist[T]);
act_V[T] := unapply(T,i);
for j from 0 to 13 do
act_V[T](j) := v_permlist[T][j+1];
od;
od:
# We now calculate orbits and stabilisers.
#@ v_stabiliser_G16
#@ v_stabiliser_G8
#@ v_orbit_G16
#@ v_orbit_G8
for i from 0 to 13 do
v_stabiliser_G16[i] := select(T -> act_V[T](i)=i,G16);
v_stabiliser_G8[i] := select(T -> act_V[T](i)=i,G8);
v_orbit_G16[i] := sort([op({op(map(T -> act_V[T](i),G16))})]);
v_orbit_G8[i] := sort([op({op(map(T -> act_V[T](i),G8))})]);
od:
unassign('i'):
# fixed_vertices[g] is the set of indices i such that g.v[i] = v[i].
#@ fixed_vertices
fixed_vertices[L] := [0,1];
fixed_vertices[LL] := [0,1,10,11,12,13];
fixed_vertices[LLL] := [0,1];
fixed_vertices[M] := [2,4];
fixed_vertices[LM] := [6,8];
fixed_vertices[LLM] := [3,5];
fixed_vertices[LLLM] := [7,9];
# These are generators of the group of equivariant automorphisms of V
#@ aut_V_phi
aut_V_phi[0] := from_cycles([[0,1]]);
aut_V_phi[1] := from_cycles([[2,4],[3,5]]);
aut_V_phi[2] := from_cycles([[6,8],[7,9]]);
aut_V_phi[3] := from_cycles([[10,11],[12,13]]);
aut_V_phi[4] := from_cycles([[10,12],[11,13]]);
# The following block defines functions
# G_mult and G_inv, such that G_mult(U,V) is the product of U and V
# in G16 (eg G_mult(M,L) = LLLM) and G_inv(U) is the inverse of U.
#@ G_mult
#@ G_inv
make_cayley_table := proc()
global G_mult,G_inv,G_lookup,G_conj;
local o,T1,T2,T3,u,v;
G_mult := proc() procname(args) end;
G_inv := proc() procname(args) end;
o := proc(s,t) [seq(s[t[i+1]+1],i=0..13)]; end:
for T1 in G16 do
G_lookup[v_permlist[T1]] := T1;
od;
for T1 in G16 do
for T2 in G16 do
v := o(v_permlist[T1],v_permlist[T2]);
T3 := G_lookup[v];
G_mult(T1,T2) := T3;
if T3 = 1 then
G_inv(T1) := T2;
fi;
od:
od:
for T1 in G16 do
for T2 in G16 do
G_conj(T1,T2) := G_mult(T1,G_mult(T2,G_inv(T1)));
od:
od:
NULL;
end:
make_cayley_table();
# Conjugacy classes in G
#@ G_classes
G_classes := [
[1],
[LL],
[MN],
[LLMN],
[L,LLL],
[M,LLM],
[LM,LLLM],
[N,LLN],
[LN,LLLN],
[LMN,LLLMN]
];
# Character table of G
#@ characters
characters[1 ] := [ 1, 1, 1, 1, 1, 1, 1, 1, 2, 2]:
characters[LL ] := [ 1, 1, 1, 1, 1, 1, 1, 1, -2, -2]:
characters[MN ] := [ 1, 1, -1, -1, 1, 1, -1, -1, 2, -2]:
characters[LLMN ] := [ 1, 1, -1, -1, 1, 1, -1, -1, -2, 2]:
characters[L ] := [ 1, -1, 1, -1, -1, 1, -1, 1, 0, 0]:
characters[LLL ] := [ 1, -1, 1, -1, -1, 1, -1, 1, 0, 0]:
characters[M ] := [ 1, 1, -1, -1, -1, -1, 1, 1, 0, 0]:
characters[LLM ] := [ 1, 1, -1, -1, -1, -1, 1, 1, 0, 0]:
characters[N ] := [ 1, 1, 1, 1, -1, -1, -1, -1, 0, 0]:
characters[LLN ] := [ 1, 1, 1, 1, -1, -1, -1, -1, 0, 0]:
characters[LM ] := [ 1, -1, -1, 1, 1, -1, -1, 1, 0, 0]:
characters[LLLM ] := [ 1, -1, -1, 1, 1, -1, -1, 1, 0, 0]:
characters[LN ] := [ 1, -1, 1, -1, 1, -1, 1, -1, 0, 0]:
characters[LLLN ] := [ 1, -1, 1, -1, 1, -1, 1, -1, 0, 0]:
characters[LMN ] := [ 1, -1, -1, 1, -1, 1, 1, -1, 0, 0]:
characters[LLLMN ] := [ 1, -1, -1, 1, -1, 1, 1, -1, 0, 0]:
#@ character
for i from 0 to 9 do
for T in G16 do
character[i][T] := characters[T][i+1];
od:
od:
unassign('i','j','T');
#@ G16_subgroups
#@ G16_subgroup_classes
proc()
global G16_subgroups,G16_subgroup_classes;
local PG,is_subgroup,H,c,T;
PG := combinat[powerset](G16):
is_subgroup := proc(H)
local a,b;
if not member(1,H) then return false; fi;
for a in H do
for b in H do
if not member(G_mult(a,b),H) then return false; fi;
od:
od:
return true;
end:
G16_subgroups := select(is_subgroup,PG);
G16_subgroup_classes := []:
for H in G16_subgroups do
c := false;
for T in G16 do
if member(map2(G_conj,T,H),G16_subgroup_classes) then
c := true;
break;
fi;
od:
if not c then
G16_subgroup_classes := [op(G16_subgroup_classes),H];
fi;
od:
end():
######################################################################
#@ make_latex_character_table
make_latex_character_table := proc()
local GG,GGL,tex,i,k;
GG := [1,LL,MN,LLMN,L,M,LM,N,LN,LMN]:
GGL := ["1","\\lm^2","\\mu\\nu","\\lm^2\\mu\\nu","\\lm^{\\pm 1}","\\mu,\\lm^2\\mu",
"\\lm^{\\pm 1}\\mu","\\nu,\\lm^2\\nu","\\lm^{\\pm 1}\\nu","\\lm^{\\pm 1}\\mu\\nu"]:
tex := " \\[ \\renewcommand{\\arraystretch}{1.5}\n \\begin{array}{|c|c|c|c|c|c|c|c|c|c|c|} \\hline\n ":
for i from 0 to 9 do tex := cat(tex,sprintf("& \\chi_%d ",i)); od:
tex := cat(tex,"\\\\ \\hline\n"):
for k from 1 to 10 do
tex := cat(tex,sprintf("%17A ",GGL[k]));
for i from 0 to 9 do
tex := cat(tex,sprintf("& %2d ",character[i][GG[k]]));
od:
tex := cat(tex,"\\\\ \\hline\n");
od:
tex := cat(tex," \\end{array}\n \\]\n"):
save_tikz("char_table",tex);
end: