|
#
# SL2Reps: Constructing symmetric representations of SL(2,Z).
#
# Lists of Representations.
#
# Implementations
#
InstallGlobalFunction( _SL2IrrepsPPLOfDegree,
function(degree)
local irrep_list, p, ld, pmax, ldmax, pset, ldset, name, rho, l,
i, j, u, w, si, r, t, x;
if not degree in PositiveIntegers then
Error("degree must be a positive integer.");
fi;
irrep_list := [];
if 1 = degree then
# The trivial irrep Xi_0 = C_1; level 1.
name := "Xi_0";
_SL2RecordIrrep(irrep_list, name, [[[1]], [[1]]], 1);
fi;
# p odd, ld = 1.
pmax := 2*degree + 1;
pset := Filtered([3..pmax], x -> IsPrime(x));
for p in pset do
l := p^1;
if p + 1 = degree and p > 3 then
# D_1(chi), for chi primitive, chi^2 != 1.
# Defined for p >= 3.
# A = <beta> (alpha is trivial) with ord(beta) = p-1.
# All non-trivial characters are primitive.
# Relevant character indices: [0, (1..(p-3)/2)].
for i in [1 .. (p-3)/2] do
rho := SL2IrrepD(p, 1, [0, i])[1];
name := Concatenation("D_1([0,", String(i), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
fi;
if p - 1 = degree then
# N_1(chi), for chi primitive.
# A = <zeta>, ord(zeta) = p+1.
# Relevant character indices: [0, (1..(p-1)/2)].
for j in [1 .. (p-1)/2] do
rho := SL2IrrepN(p, 1, [0, j])[1];
name := Concatenation("N_1([0,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
fi;
if (p+1)/2 = degree then
# R_1(1)+ and R_1(u)+, for u a non-residue.
# SL2IrrepRUnary gives a list containing two reps, + and - .
rho := SL2IrrepRUnary(p, 1, 1)[1];
name := "R_1(1)+";
_SL2RecordIrrep(irrep_list, name, rho, l);
u := _SL2QuadNonRes(p);
rho := SL2IrrepRUnary(p, 1, u)[1];
name := Concatenation("R_1(", String(u), ")+");
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if (p-1)/2 = degree then
# R_1(1)- and R_1(u)-, for u a non-residue.
# SL2IrrepRUnary gives a list containing two reps, + and - .
# For p=3, R_1(1)- = Xi_4 and R_1(2)- = Xi_8, the two linear reps. of level 3.
rho := SL2IrrepRUnary(p, 1, 1)[2];
name := "R_1(1)-";
_SL2RecordIrrep(irrep_list, name, rho, l);
u := _SL2QuadNonRes(p);
rho := SL2IrrepRUnary(p, 1, u)[2];
name := Concatenation("R_1(", String(u), ")-");
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if p = degree then
# N_1(nu), the Steinberg representation.
rho := SL2IrrepN(p, 1, [0, 0])[1];
name := "N_1(nu)";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
od;
# p odd, ld >= 2.
pmax := Maximum([RootInt(2*degree+1, 2), 3]);
ldmax := Maximum([LogInt(degree, 3) + 2, 2]);
pset := Filtered([3..pmax], x -> IsPrime(x));
ldset := [2..ldmax];
for p in pset do
for ld in ldset do
l := p^ld;
if (p+1)*p^(ld-1) = degree then
# D_ld(chi), for chi primitive, chi^2 != 1.
# A = <alpha> x <beta>, with ord(alpha) = p^(ld-1) and ord(beta) = p-1.
# chi is primitive iff it is injective on <alpha>.
# Remember chi and bar(chi) give same rep; for j = 0 or (p-1)/2,
# bar(chi(i,j)) = chi(-i, j).
# We handle that case first:
for i in PrimeResidues(p^(ld-1)) do
if i > p^(ld-1) / 2 then
break;
fi;
rho := SL2IrrepD(p, ld, [i, 0])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepD(p, ld, [i, (p-1)/2])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",", String((p-1)/2), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# Then the rest:
for i in PrimeResidues(p^(ld-1)) do
for j in [1 .. (p-3)/2] do
if Gcd(i, p) = 1 then
rho := SL2IrrepD(p, ld, [i, j])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
od;
od;
fi;
if (p-1)*p^(ld-1) = degree then
# N_ld(chi), for chi primitive.
# A = <alpha> x <zeta>; ord(alpha) = p^(ld-1), ord(zeta) = p+1.
# chi is primitive if injective on <alpha>.
# Remember chi and bar(chi) give same rep; for j = 0 or (p+1)/2,
# bar(chi(i,j)) = chi(-i, j).
# We handle that case first:
for i in PrimeResidues(p^(ld-1)) do
if i > p^(ld-1) / 2 then
break;
fi;
rho := SL2IrrepN(p, ld, [i, 0])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepN(p, ld, [i, (p+1)/2])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",", String((p+1)/2), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# Then the rest:
for i in PrimeResidues(p^(ld-1)) do
for j in [1 .. (p-1)/2] do
rho := SL2IrrepN(p, ld, [i, j])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if p^(ld-2)*(p^2-1)/2 = degree then
# R_ld^si(r,t,chi), for 1 <= si <= ld-1, r,t either 1 or a non-residue, and chi primitive
for si in [1 .. ld-1] do
u := _SL2QuadNonRes(p);
for r in [1,u] do
for t in [1,u] do
if p = 3 and ld >= 3 and si = 1 and t = 1 then
# Special case, see RepR.
# A = <alpha> x <zeta> where ord(alpha) = 3^(ld-2) and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
# Remember chi and bar(chi) give same rep; for j = 0 or 3,
# bar(chi(i,j)) = chi(-i, j).
for i in PrimeResidues(3^(ld-2)) do
if i > 3^(ld-2) / 2 then
break;
fi;
for j in [0,3] do
rho := SL2IrrepR(p, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for i in PrimeResidues(3^(ld-2)) do
for j in [1,2] do
rho := SL2IrrepR(p, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
else
# A is cyclic; A = <alpha> x <-1> where Ord(alpha) = p^(ld-si).
# A character is primitive iff it is injective on <alpha>.
for i in PrimeResidues(p^(ld-si)) do
if i > p^(ld-si) / 2 then
break;
fi;
for j in [0,1] do
rho := SL2IrrepR(p, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
od;
od;
od;
# (R_ld(1)+-)_1 and (R_ld(u)+-)_1, for u a non-residue
rho := SL2IrrepRUnary(p, ld, 1);
name := Concatenation("(R_", String(ld), "(1)+)_1");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("(R_", String(ld), "(1)-)_1");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
u := _SL2QuadNonRes(p);
rho := SL2IrrepRUnary(p, ld, u);
name := Concatenation("(R_", String(ld), "(", String(u), ")+)_1");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("(R_", String(ld), "(", String(u), ")-)_1");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
fi;
od;
od;
# p = 2, ld = 1.
l := 2;
if 1 = degree then
# Xi_6 = C_2, with s = t = -1.
rho := [
[[-1]],
[[-1]]
];
name := "Xi_6";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if 2 = degree then
# N_1(nu), the Steinberg representation.
rho := SL2IrrepN(2, 1, [0, 0])[1];
name := "N_1(nu)";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
# p = 2, ld = 2.
l := 4;
if 3 = degree then
# D_2(chi)+-, for chi != 1. Note that there is only one non-trivial character,
# indexed by [1,0]. SL2IrrepD returns a list of the two subreps, + and - .
rho := SL2IrrepD(2, 2, [1, 0]);
name := "D_2([1,0])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "D_2([1,0])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
# R_2^0(1,3)_1 and C_2 tensor R_2^0(1,3)_1 (exceptional).
# Matrix given in notes sec. 1.6.2.
w := Sqrt(2);
rho := [
1/2 * [
[-1, 1, w],
[ 1, -1, w],
[ w, w, 0]
],
DiagonalMat([E(4), -E(4), 1])
];
name := "R_2^0(1,3)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [-1*rho[1], -1*rho[2]];
name := "Xi_6 tensor R_2^0(1,3)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if 2 = degree then
# N_2(chi), for chi primitive, chi^2 != 1.
# A = <zeta> with ord(zeta) = 6.
# For this specific case, chi is primitive iff chi(-1) = -1, which leaves only
# a single relevant character, indexed by [0,1].
rho := SL2IrrepN(2, 2, [0, 1])[1];
name := "N_2([0,1])";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if 1 = degree then
# Xi_3 = C_4, with s = -1, t = i.
rho := [
[[-E(4)]],
[[E(4)]]
];
name := "Xi_3";
_SL2RecordIrrep(irrep_list, name, rho, l);
# Xi_9 = C_3, with s = i, t = -i.
rho := [
[[E(4)]],
[[-E(4)]]
];
name := "Xi_9";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
# p = 2, ld = 3.
l := 8;
if 6 = degree then
# D_3(chi)+-, for chi primitive.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# This gives two characters, [1,0] and [1,1] (note that both square to 1).
# SL2IrrepD returns a list of the two subreps, + and - .
rho := SL2IrrepD(2, 3, [1, 0]);
name := "D_3([1,0])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "D_3([1,0])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepD(2, 3, [1, 1]);
name := "D_3([1,1])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "D_3([1,1])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
# R_3^0(1,3,nu)_1 and C_3 tensor R_3^0(1,3,nu)_1.
# Matrix given in notes S. 1.6.3.
rho := [
-1/2 * [
[ 0, 0, 1, 1, 1, 1],
[ 0, 0, -1, -1, 1, 1],
[ 1, -1, 0, 0, 1, -1],
[ 1, -1, 0, 0, -1, 1],
[ 1, 1, 1, -1, 0, 0],
[ 1, 1, -1, 1, 0, 0],
],
DiagonalMat([1, -1, E(8), E(8)^5, E(8)^3, E(8)^7])
];
name := "R_3^0(1,3,nu)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [E(4) * rho[1], -E(4) * rho[2]];
name := "Xi_9 tensor R_3^0(1,3,nu)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if 4 = degree then
# N_3(chi), for chi primitive, chi^2 != 1.
# A = <alpha> x <zeta> where ord(alpha) = 2 and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
# This gives two relevant characters, [1,1] and [1,2].
rho := SL2IrrepN(2, 3, [1, 1])[1];
name := "N_3([1,1])";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepN(2, 3, [1, 2])[1];
name := "N_3([1,2])";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if 2 = degree then
# N_3(chi)+-, for chi primitive, chi^2 = 1.
# As above; relevant characters are those which square to 1: [1,0] and [1,3].
# SL2IrrepN returns a list of the two subreps, + and - .
rho := SL2IrrepN(2, 3, [1, 0]);
name := "N_3([1,0])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "N_3([1,0])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepN(2, 3, [1, 3]);
name := "N_3([1,3])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "N_3([1,3])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
fi;
if 3 = degree then
# R_3^0(r,t,chi), for chi(zeta) = i and r in {1,3} and t in {1,5}.
# A = <zeta> with ord(zeta) = 4.
# Specifically, zeta = (0,1) when t = 1, and zeta = (2,1) when t = 5.
# The given character is indexed by [0,1].
for r in [1,3] do
for t in [1,5] do
rho := SL2IrrepR(2, 3, 0, r, t, [0,1])[1];
name := Concatenation("R_3^0(", String(r), ",", String(t), ",[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# R_3^0(1, t, chi)_+-, for chi != 1 and t in {3,7}.
# |A| = 2, so there's only one non-trivial chi, indexed by [0,1].
# chi squares to 1, giving two subreps.
# SL2IrrepR returns a list with the two supreps, + and -.
for t in [3,7] do
rho := SL2IrrepR(2,3,0,1,t,[0,1]);
name := Concatenation("R_3^0(1,", String(t), ",[0,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_3^0(1,", String(t), ",[0,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
fi;
# p = 2, ld = 4.
l := 16;
if 24 = degree then
# D_4(chi), for chi primitive, chi^2 != 1.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# Note that 5 has order 4.
# This gives two relevant characters, [1,0] and [1,1].
rho := SL2IrrepD(2, 4, [1, 0])[1];
name := "D_4([1,0])";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepD(2, 4, [1, 1])[1];
name := "D_4([1,1])";
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
if 8 = degree then
# N_4(chi), for chi primitive, chi^2 != 1.
# A = <alpha> x <zeta> where ord(alpha) = 4 and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
# This gives six relevant characters: [1,0],[1,3],[1,1],[1,2],[3,1],[3,2].
for x in [[1,0],[1,3],[1,1],[1,2],[3,1],[3,2]] do
rho := SL2IrrepN(2, 4, x)[1];
name := Concatenation("N_4([", String(x[1]), ",", String(x[2]), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
fi;
if 6 = degree then
# R_4^0(r,t,chi), for chi primitive with chi^2 != 1, r in {1,3}, t in {1,5}.
# For t = 1, A = <alpha> x <zeta>, with ord(alpha) = 2 and ord(zeta) = 4,
# and a character is primitive iff injective on alpha, so the only relevant
# character is [1,1].
# For t = 5, A = <alpha> x <-1>, with ord(alpha) = 4; in this case a character
# is primitive iff injective on <-alpha^2> (see NW p. 496), which means [1,0].
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 1, [1, 1])[1];
name := Concatenation("R_4^0(", String(r), ",1,[1,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 5, [1, 0])[1];
name := Concatenation("R_4^0(", String(r), ",5,[1,0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_4^0(1,t,chi)+-, for chi primitive, t in {3,7}.
# A = <alpha> x <-1>, with ord(alpha) = 2. There are therefore two primitive chars,
# indexed by [1,0] and [1,1]. Both square to 1, giving two subreps.
# SL2IrrepR returns a list of the two subreps, + and - .
for t in [3,7] do
rho := SL2IrrepR(2, 4, 0, 1, t, [1,0]);
name := Concatenation("R_4^0(1,", String(t), ",[1,0])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(1,", String(t), ",[1,0])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepR(2, 4, 0, 1, t, [1,1]);
name := Concatenation("R_4^0(1,", String(t), ",[1,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(1,", String(t), ",[1,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
# R_4^2(r,t,chi) and C_2 tensor R_4^2(r,t,chi), for chi != 1, r,t in {1,3}.
# A = {+-1}, so there is a single non-trivial character, indexed by [0,1].
# NOTE: C_2 tensor R_4^2(1,1,[0,1]) is iso to R_4^2(1,3,nu)_1, and
# C_2 tensor R_4^2(3,1,[0,1]) is iso to R_4^2(3,3,nu)_1.
# NW lists them under the latter name, so this is what we do here; see below.
for r in [1,3] do
rho := SL2IrrepR(2,4,2,r,1,[0,1])[1];
name := Concatenation("R_4^2(", String(r), ",1,[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepR(2,4,2,r,3,[0,1])[1];
name := Concatenation("R_4^2(", String(r), ",3,[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [-1 * rho[1], -1 * rho[2]];
name := Concatenation("Xi_6 tensor R_4^2(", String(r), ",3,[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_4^2(r,3,nu)_1, for r in {1,3}.
# Basis is given on NW p. 524.
# See above.
for r in [1,3] do
rho := SL2IrrepR(2,4,2,r,3,[0,0])[1];
name := Concatenation("R_4^2(", String(r), ",3,nu)_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
fi;
if 3 = degree then
# R_4^0(r,t,chi)+-, for chi primitive, chi^2 = 1, r in {1,3}, t in {1,5}.
# See previous. For t = 1, the relevant chars. are [1,0] and [1,2].
# For t = 5, the relevant chars. are [0,1] and [2,1].
# SL2IrrepR returns a list with the two supreps, + and -.
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 1, [1,0]);
name := Concatenation("R_4^0(", String(r), ",1,[1,0])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",1,[1,0])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepR(2, 4, 0, r, 1, [1,2]);
name := Concatenation("R_4^0(", String(r), ",1,[1,2])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",1,[1,2])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 5, [0,1]);
name := Concatenation("R_4^0(", String(r), ",5,[0,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",5,[0,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepR(2, 4, 0, r, 5, [2,1]);
name := Concatenation("R_4^0(", String(r), ",5,[2,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",5,[2,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
fi;
if 12 = degree then
# N_3(chi)+ tensor R_4^0(1,7,psi)+, for psi(alpha) = -1, psi(-1) = 1,
# chi primitive and chi^2 = 1.
# Calculated via Kronecker product.
# For the N part, chars. are [1,0] and [1,3] (see the ld=3 section earlier).
#
# First construct R_4^0(1,7,psi)+. Char is [1,1]. SL2IrrepR gives a list with + and then -.
x := SL2IrrepR(2, 4, 0, 1, 7, [1, 1]);
for j in [0,3] do
# Construct N_3(chi)+. SL2IrrepR again returns a list.
rho := SL2IrrepN(2, 3, [1, j]);
rho := [
KroneckerProduct(rho[1][1], x[1][1]),
KroneckerProduct(rho[1][2], x[1][2]),
12
];
name := Concatenation("N_3([1,", String(j), "])+ tensor R_4^0(1,7,[1,1])+");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
fi;
# p = 2, ld = 5.
l := 32;
if 48 = degree then
# D_5(chi), for chi primitive.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# Note that 5 has order 8.
# This gives four relevant characters, [1,0], [1,1], [3,0], [3,1].
for i in [1,3] do
for j in [0,1] do
rho := SL2IrrepD(2, 5, [i, j])[1];
name := Concatenation("D_5([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if 16 = degree then
# N_5(chi), for chi primitive.
# A = <alpha> x <zeta> where ord(alpha) = 8 and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
for i in [1,3] do
for j in [0,3] do
rho := SL2IrrepN(2, 5, [i,j])[1];
name := Concatenation("N_5([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for i in [1,3,5,7] do
for j in [1,2] do
rho := SL2IrrepN(2, 5, [i,j])[1];
name := Concatenation("N_5([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if 12 = degree then
# R_5^0(r,t,chi), for chi primitive, r in {1,3}, t in {1,5}.
# For t = 1, A = <alpha> x <zeta>, with ord(alpha) = 4 and ord(zeta) = 4.
# For t = 5, A = <alpha> x <-1>, with ord(alpha) = 8.
# In both cases, a character is primitive iff injective on alpha.
for r in [1,3] do
for j in [0,2] do
rho := SL2IrrepR(2, 5, 0, r, 1, [1,j])[1];
name := Concatenation("R_5^0(", String(r), ",1,[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
for i in [1,3] do
rho := SL2IrrepR(2, 5, 0, r, 1, [i,1])[1];
name := Concatenation("R_5^0(", String(r), ",1,[", String(i), ",1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for r in [1,3] do
for i in [1,3] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 0, r, 5, [i,j])[1];
name := Concatenation("R_5^0(", String(r), ",5,[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
# R_5^1(r,t,chi), for chi primitive and:
# r in {1,5}, t in {1,5}, or
# r in {1,3}, t in {3,7}.
# A = <alpha> x <-1>; ord(alpha) = 4. Prim. iff injective on alpha.
# Chars are therefore [0,1] and [1,1].
for r in [1,5] do
for t in [1,5] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 1, r, t, [1,j])[1];
name := Concatenation("R_5^1(", String(r), ",", String(t), ",[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
for r in [1,3] do
for t in [3,7] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 1, r, t, [1,j])[1];
name := Concatenation("R_5^1(", String(r), ",", String(t), ",[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
# R_5^2(r,1,chi)_1 and C_3 tensor R_5^2(r,1,chi)_1,
# for chi NOT primitive and r in {1,3}.
# A = <alpha> x <-1>, so non-primitive characters are indexed by [0,0] and [0,1].
for r in [1,3] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 2, r, 1, [0,j])[1];
name := Concatenation("R_5^2(", String(r), ",1,[0,", String(j), "])_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [E(4) * rho[1], -E(4) * rho[2], 12];
name := Concatenation("Xi_9 tensor R_5^2(", String(r), ",1,[0,", String(j), "])_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if 24 = degree then
# R_5^0(1,t,chi), for chi primitive and t in {3,7}.
# A = <alpha> x <-1> with ord(alpha) = 4.
# A character is primitive iff injective on <alpha>.
# Relevant chars. are therefore [1,0] and [1,1].
for t in [3,7] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 0, 1, t, [1,j])[1];
name := Concatenation("R_5^0(1,", String(t), ",[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if 6 = degree then
# R_5^2(r,t,chi)+-, for chi primitive, r in {1,3}, and t in {1,3,5,7}.
# A = <alpha> x <-1>, with ord(alpha) = 2.
# Relevant chars are therefore [1,0] and [1,1], both of which square to 1.
# SL2IrrepR returns a list of the two resulting subreps, + and - .
for r in [1,3] do
for t in [1,3,5,7] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 2, r, t, [1,j]);
name := Concatenation("R_5^2(", String(r), ",", String(t), ",[1,", String(j), "])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_5^2(", String(r), ",", String(t), ",[1,", String(j), "])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
od;
od;
fi;
# p = 2, ld > 5.
ldmax := Maximum([LogInt(degree, 2) + 4, 6]);
ldset := [6..ldmax];
for ld in ldset do
l := 2^ld;
if 3*2^(ld-1) = degree then
# D_ld(chi), for chi primitive.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# Note that 5 has order 2^(ld-2).
for i in PrimeResidues(2^(ld-2) / 2) do
for j in [0,1] do
rho := SL2IrrepD(2, ld, [i, j])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if 2^(ld-1) = degree then
# N_ld(chi), for chi primitive.
# A = <alpha> x <zeta> where ord(alpha) = 2^(ld-2) and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
for i in PrimeResidues(2^(ld-2) / 2) do
for j in [0,3] do
rho := SL2IrrepN(2, ld, [i,j])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for i in PrimeResidues(2^(ld-2)) do
for j in [1,2] do
rho := SL2IrrepN(2, ld, [i,j])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
if 3*2^(ld-2) = degree then
# R_ld^0(1,t,chi), for chi primitive and t in {3,7}.
# A = <alpha> x <-1> with ord(alpha) = 2^(ld-3).
# A character is primitive iff injective on <alpha>.
for t in [3,7] do
for i in PrimeResidues(2^(ld-3) / 2) do
for j in [0,1] do
rho := SL2IrrepR(2, ld, 0, 1, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^0(1,", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
fi;
if 3*2^(ld-3) = degree then
# R_ld^si(r,t,chi), for chi primitive and:
# si = 0, r in {1,3}, t = 1 (ord(alpha) = 2^(ld-3), ord(zeta) = 4),
# si = 0, r in {1,3}, t = 5 (ord(alpha) = 2^(ld-2), ord(zeta) = 2),
# si = 1, r in {1,5}, t in {1,5} or r in {1,3}, t in {3,7} (ord(alpha) = 2^(ld-3), ord(zeta) = 2),
# si = 2, r in {1,3}, t in {1,3,5,7} (ord(alpha) = 2^(ld-4), ord(zeta) = 2).
# In all cases, a character is primitive iff injective on <alpha>.
for r in [1,3] do
for i in PrimeResidues(2^(ld-3) / 2) do
for j in [0,2] do
rho := SL2IrrepR(2, ld, 0, r, 1, [i,j])[1];
name := Concatenation("R_", String(ld), "^0(", String(r), ",1,[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for i in PrimeResidues(2^(ld-3)) do
rho := SL2IrrepR(2, ld, 0, r, 1, [i,1])[1];
name := Concatenation("R_", String(ld), "^0(", String(r), ",1,[", String(i), ",1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for r in [1,3] do
for i in PrimeResidues(2^(ld-2) / 2) do
for j in [0,1] do
rho := SL2IrrepR(2, ld, 0, r, 5, [i,j])[1];
name := Concatenation("R_", String(ld), "^0(", String(r), ",5,[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
for r in [1,5] do
for t in [1,5] do
for i in PrimeResidues(2^(ld-3) / 2) do
for j in [0,1] do
rho := SL2IrrepR(2, ld, 1, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^1(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
od;
for r in [1,3] do
for t in [3,7] do
for i in PrimeResidues(2^(ld-3) / 2) do
for j in [0,1] do
rho := SL2IrrepR(2, ld, 1, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^1(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
od;
for r in [1,3] do
for t in [1,3,5,7] do
for i in PrimeResidues(2^(ld-4) / 2) do
for j in [0,1] do
rho := SL2IrrepR(2, ld, 2, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^2(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
od;
fi;
if 3*2^(ld-4) = degree then
# R_ld^si(r,t,chi), for chi primitive, si in {3, ..., ld-3}, and r,t in {1,3,5,7}.
# ord(alpha) = 2^(ld-si-1), ord(zeta) = 2.
# A character is primitive iff injective on <alpha>.
for si in [3 .. (ld-3)] do
for r in [1,3,5,7] do
for t in [1,3,5,7] do
for i in PrimeResidues(2^(ld-si-1) / 2) do
for j in [0,1] do
rho := SL2IrrepR(2, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
od;
od;
# R_ld^(ld-2)(r,t,chi), for chi primitive, r in {1,3,5,7}, t in {1,3}.
# A = <alpha> x <-1>, with ord(alpha) = 2.
# A character is primitive iff injective on alpha (but note alternate def.
# of primitive; see NW p. 496). Two such exist, indexed by [1,0] and [1,1].
for r in [1,3,5,7] do
for t in [1,3] do
rho := SL2IrrepR(2, ld, ld-2, r, t, [1,0])[1];
name := Concatenation("R_", String(ld), "^", String(ld-2), "(", String(r), ",", String(t), ",[1,0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepR(2, ld, ld-2, r, t, [1,1])[1];
name := Concatenation("R_", String(ld), "^", String(ld-2), "(", String(r), ",", String(t), ",[1,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
if ld = 6 then
# R_6^4(r,t,nu)_1 and C_2 tensor R_6^4(r,t,nu)_1, for r in {1,3,5,7}, t in {1,3}.
for r in [1,3,5,7] do
for t in [1,3] do
rho := SL2IrrepR(2,6,4,r,t,[0,0])[1];
name := Concatenation("R_6^4(", String(r), ",", String(t), ",nu)_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [-1 * rho[1], -1 * rho[2]];
name := Concatenation("Xi_6 tensor R_6^4(", String(r), ",", String(t), ",nu)_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
else
# R_ld^(ld-3)(r,t,chi)_1, for chi in {[0,0],[2,0]} (which both square to 1),
# r in {1,3,5,7}, t in {1,3}.
for r in [1,3,5,7] do
for t in [1,3] do
rho := SL2IrrepR(2,ld,ld-3,r,t,[0,0])[1];
name := Concatenation("R_", String(ld), "^", String(ld-3), "(", String(r), ",", String(t), ",nu)_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepR(2,ld,ld-3,r,t,[2,0])[1];
name := Concatenation("R_", String(ld), "^", String(ld-3), "(", String(r), ",", String(t), ",[2,0])_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
fi;
od;
Info(InfoSL2Reps, 1, "SL2Reps : ", Length(irrep_list), " irreps of degree ", degree, " found.");
return irrep_list;
end );
InstallGlobalFunction( _SL2IrrepsPPLOfMaxDegree,
function(max_degree)
local output, degree, count;
if not max_degree in PositiveIntegers then
Error("max_degree must be a positive integer.");
fi;
output := [];
count := 0;
for degree in [1..max_degree] do
Info(InfoSL2Reps, 1, "SL2Reps : Degree ", degree, ":");
output[degree] := _SL2IrrepsPPLOfDegree(degree);
count := count + Length(output[degree]);
od;
Info(InfoSL2Reps, 1, "SL2Reps : ", count, " total irreps found.");
return output;
end );
InstallGlobalFunction( _SL2IrrepsPPLOfLevel,
function(p, ld)
local irrep_list, l, si, r, t, u, w, x, i, j, name, rho;
if not IsPrime(p) then
Error("p must be a prime.");
elif (not ld in Integers) or (ld < 0) then
Error("ld must be a non-negative integer.");
fi;
l := p^ld;
irrep_list := [];
if ld = 0 then
# The trivial irrep Xi_0 = C_1.
_SL2RecordIrrep(irrep_list, "Xi_0", [[[1]], [[1]]], 1);
elif p > 2 then
if ld = 1 then
# D_1(chi), for chi primitive, chi^2 != 1.
# Defined for p >= 3.
# A = <beta> (alpha is trivial) with ord(beta) = p-1.
# All non-trivial characters are primitive.
# Relevant character indices: [0, (1..(p-3)/2)].
for i in [1 .. (p-3)/2] do
rho := SL2IrrepD(p, 1, [0, i])[1];
name := Concatenation("D_1([0,", String(i), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# N_1(chi), for chi primitive.
# A = <zeta>, ord(zeta) = p+1.
# Relevant character indices: [0, (1..(p-1)/2)].
for j in [1 .. (p-1)/2] do
rho := SL2IrrepN(p, 1, [0, j])[1];
name := Concatenation("N_1([0,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_1(1)+- and R_1(u)+-, for u a non-residue.
# SL2IrrepRUnary gives a list containing two reps, + and - .
# For p=3, R_1(1)- = Xi_4 and R_1(2)- = Xi_8, the two linear reps. of level 3.
rho := SL2IrrepRUnary(p, 1, 1);
name := "R_1(1)+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "R_1(1)-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
u := _SL2QuadNonRes(p);
rho := SL2IrrepRUnary(p, 1, u);
name := Concatenation("R_1(", String(u), ")+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_1(", String(u), ")-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
# N_1(nu), the Steinberg representation.
rho := SL2IrrepN(p, 1, [0, 0])[1];
name := "N_1(nu)";
_SL2RecordIrrep(irrep_list, name, rho, l);
else
# ld >= 2.
# D_ld(chi), for chi primitive, chi^2 != 1.
# A = <alpha> x <beta>, with ord(alpha) = p^(ld-1) and ord(beta) = p-1.
# chi is primitive iff it is injective on <alpha>.
# Remember chi and bar(chi) give same rep; for j = 0 or (p-1)/2,
# bar(chi(i,j)) = chi(-i, j).
# We handle that case first:
for i in PrimeResidues(p^(ld-1)) do
if i > p^(ld-1) / 2 then
break;
fi;
rho := SL2IrrepD(p, ld, [i, 0])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepD(p, ld, [i, (p-1)/2])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",", String((p-1)/2), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# Then the rest:
for i in PrimeResidues(p^(ld-1)) do
for j in [1 .. (p-3)/2] do
if Gcd(i, p) = 1 then
rho := SL2IrrepD(p, ld, [i, j])[1];
name := Concatenation("D_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
fi;
od;
od;
# N_ld(chi), for chi primitive.
# A = <alpha> x <zeta>; ord(alpha) = p^(ld-1), ord(zeta) = p+1.
# chi is primitive if injective on <alpha>.
# Remember chi and bar(chi) give same rep; for j = 0 or (p+1)/2,
# bar(chi(i,j)) = chi(-i, j).
for i in PrimeResidues(p^(ld-1)) do
if i > p^(ld-1) / 2 then
break;
fi;
rho := SL2IrrepN(p, ld, [i, 0])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepN(p, ld, [i, (p+1)/2])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",", String((p+1)/2), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
for i in PrimeResidues(p^(ld-1)) do
for j in [1 .. (p-1)/2] do
rho := SL2IrrepN(p, ld, [i, j])[1];
name := Concatenation("N_", String(ld), "([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# R_ld^si(r,t,chi), for 1 <= si <= ld-1, r,t either 1 or a non-residue, and chi primitive
for si in [1 .. ld-1] do
u := _SL2QuadNonRes(p);
for r in [1,u] do
for t in [1,u] do
if p = 3 and ld >= 3 and si = 1 and t = 1 then
# Special case, see RepRs.
# A = <alpha> x <zeta> where ord(alpha) = 3^(ld-2) and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
# Remember chi and bar(chi) give same rep; for j = 0 or 3,
# bar(chi(i,j)) = chi(-i, j).
for i in PrimeResidues(3^(ld-2)) do
if i > 3^(ld-2) / 2 then
break;
fi;
for j in [0,3] do
rho := SL2IrrepR(p, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for i in PrimeResidues(3^(ld-2)) do
for j in [1,2] do
rho := SL2IrrepR(p, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
else
# A is cyclic; A = <alpha> x <-1> where Ord(alpha) = p^(ld-si).
# A character is primitive iff it is injective on <alpha>.
for i in PrimeResidues(p^(ld-si)) do
if i > p^(ld-si) / 2 then
break;
fi;
for j in [0,1] do
rho := SL2IrrepR(p, ld, si, r, t, [i,j])[1];
name := Concatenation("R_", String(ld), "^", String(si), "(", String(r), ",", String(t), ",[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
fi;
od;
od;
od;
# (R_ld(1)+-)_1 and (R_ld(u)+-)_1, for u a non-residue
rho := SL2IrrepRUnary(p, ld, 1);
name := Concatenation("(R_", String(ld), "(1)+)_1");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("(R_", String(ld), "(1)-)_1");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
u := _SL2QuadNonRes(p);
rho := SL2IrrepRUnary(p, ld, u);
name := Concatenation("(R_", String(ld), "(", String(u), ")+)_1");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("(R_", String(ld), "(", String(u), ")-)_1");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
fi;
else
# p = 2
if ld = 1 then
# Xi_6 = C_2, with s = t = -1.
rho := [
[[-1]],
[[-1]]
];
name := "Xi_6";
_SL2RecordIrrep(irrep_list, name, rho, l);
# N_1(nu), the Steinberg representation.
rho := SL2IrrepN(2, 1, [0, 0])[1];
name := "N_1(nu)";
_SL2RecordIrrep(irrep_list, name, rho, l);
elif ld = 2 then
# D_2(chi)+-, for chi != 1. Note that there is only one non-trivial character,
# indexed by [1,0]. SL2IrrepD returns a list of the two subreps, + and - .
rho := SL2IrrepD(2, 2, [1, 0]);
name := "D_2([1,0])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "D_2([1,0])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
# R_2^0(1,3)_1 and C_2 tensor R_2^0(1,3)_1 (exceptional).
# Matrix given in notes sec. 1.6.2.
w := Sqrt(2);
rho := [
1/2 * [
[-1, 1, w],
[ 1, -1, w],
[ w, w, 0]
],
DiagonalMat([E(4), -E(4), 1])
];
name := "R_2^0(1,3)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [-1*rho[1], -1*rho[2]];
name := "Xi_6 tensor R_2^0(1,3)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
# N_2(chi), for chi primitive, chi^2 != 1.
# A = <zeta> with ord(zeta) = 6.
# For this specific case, chi is primitive iff chi(-1) = -1, which leaves only
# a single relevant character, indexed by [0,1].
rho := SL2IrrepN(2, 2, [0, 1])[1];
name := "N_2([0,1])";
_SL2RecordIrrep(irrep_list, name, rho, l);
# Xi_3 = C_4, with s = -1, t = i.
rho := [
[[-E(4)]],
[[E(4)]]
];
name := "Xi_3";
_SL2RecordIrrep(irrep_list, name, rho, l);
# Xi_9 = C_3, with s = i, t = -i.
rho := [
[[E(4)]],
[[-E(4)]]
];
name := "Xi_9";
_SL2RecordIrrep(irrep_list, name, rho, l);
elif ld = 3 then
# D_3(chi)+-, for chi primitive.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# This gives two characters, [1,0] and [1,1] (note that both square to 1).
# SL2IrrepD returns a list of the two subreps, + and - .
rho := SL2IrrepD(2, 3, [1, 0]);
name := "D_3([1,0])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "D_3([1,0])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepD(2, 3, [1, 1]);
name := "D_3([1,1])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "D_3([1,1])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
# R_3^0(1,3,nu)_1 and C_3 tensor R_3^0(1,3,nu)_1.
# Matrix given in notes S. 1.6.3.
rho := [
-1/2 * [
[ 0, 0, 1, 1, 1, 1],
[ 0, 0, -1, -1, 1, 1],
[ 1, -1, 0, 0, 1, -1],
[ 1, -1, 0, 0, -1, 1],
[ 1, 1, 1, -1, 0, 0],
[ 1, 1, -1, 1, 0, 0],
],
DiagonalMat([1, -1, E(8), E(8)^5, E(8)^3, E(8)^7])
];
name := "R_3^0(1,3,nu)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [E(4) * rho[1], -E(4) * rho[2]];
name := "Xi_9 tensor R_3^0(1,3,nu)_1";
_SL2RecordIrrep(irrep_list, name, rho, l);
# N_3(chi), for chi primitive, chi^2 != 1.
# A = <alpha> x <zeta> where ord(alpha) = 2 and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
# This gives two relevant characters, [1,1] and [1,2].
rho := SL2IrrepN(2, 3, [1, 1])[1];
name := "N_3([1,1])";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepN(2, 3, [1, 2])[1];
name := "N_3([1,2])";
_SL2RecordIrrep(irrep_list, name, rho, l);
# N_3(chi)+-, for chi primitive, chi^2 = 1.
# As above; relevant characters are those which square to 1: [1,0] and [1,3].
# SL2IrrepN returns a list of the two subreps, + and - .
rho := SL2IrrepN(2, 3, [1, 0]);
name := "N_3([1,0])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "N_3([1,0])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepN(2, 3, [1, 3]);
name := "N_3([1,3])+";
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := "N_3([1,3])-";
_SL2RecordIrrep(irrep_list, name, rho[2], l);
# R_3^0(r,t,chi), for chi(zeta) = i and r in {1,3} and t in {1,5}.
# A = <zeta> with ord(zeta) = 4.
# Specifically, zeta = (0,1) when t = 1, and zeta = (2,1) when t = 5.
# The given character is indexed by [0,1].
for r in [1,3] do
for t in [1,5] do
rho := SL2IrrepR(2, 3, 0, r, t, [0,1])[1];
name := Concatenation("R_3^0(", String(r), ",", String(t), ",[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# R_3^0(1, t, chi)_+-, for chi != 1 and t in {3,7}.
# |A| = 2, so there's only one non-trivial chi, indexed by [0,1].
# chi squares to 1, giving two subreps.
# SL2IrrepR returns a list with the two subreps, + and -.
for t in [3,7] do
rho := SL2IrrepR(2,3,0,1,t,[0,1]);
name := Concatenation("R_3^0(1,", String(t), ",[0,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_3^0(1,", String(t), ",[0,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
elif ld = 4 then
# D_4(chi), for chi primitive, chi^2 != 1.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# Note that 5 has order 4.
# This gives two relevant characters, [1,0] and [1,1].
rho := SL2IrrepD(2, 4, [1, 0])[1];
name := "D_4([1,0])";
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepD(2, 4, [1, 1])[1];
name := "D_4([1,1])";
_SL2RecordIrrep(irrep_list, name, rho, l);
# N_4(chi), for chi primitive, chi^2 != 1.
# A = <alpha> x <zeta> where ord(alpha) = 4 and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
# This gives six relevant characters: [1,0],[1,3],[1,1],[1,2],[3,1],[3,2].
for x in [[1,0],[1,3],[1,1],[1,2],[3,1],[3,2]] do
rho := SL2IrrepN(2, 4, x)[1];
name := Concatenation("N_4([", String(x[1]), ",", String(x[2]), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_4^0(r,t,chi), for chi primitive with chi^2 != 1, r in {1,3}, t in {1,5}.
# For t = 1, A = <alpha> x <zeta>, with ord(alpha) = 2 and ord(zeta) = 4,
# and a character is primitive iff injective on alpha, so the only relevant
# character is [1,1].
# For t = 5, A = <alpha> x <-1>, with ord(alpha) = 4; in this case a character
# is primitive iff injective on <-alpha^2> (see NW p. 496), which means [1,0].
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 1, [1, 1])[1];
name := Concatenation("R_4^0(", String(r), ",1,[1,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 5, [1, 0])[1];
name := Concatenation("R_4^0(", String(r), ",5,[1,0])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_4^0(1,t,chi)+-, for chi primitive, t in {3,7}.
# A = <alpha> x <-1>, with ord(alpha) = 2. There are therefore two primitive chars,
# indexed by [1,0] and [1,1]. Both square to 1, giving two subreps.
# SL2IrrepR returns a list of the two subreps, + and - .
for t in [3,7] do
rho := SL2IrrepR(2, 4, 0, 1, t, [1,0]);
name := Concatenation("R_4^0(1,", String(t), ",[1,0])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(1,", String(t), ",[1,0])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepR(2, 4, 0, 1, t, [1,1]);
name := Concatenation("R_4^0(1,", String(t), ",[1,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(1,", String(t), ",[1,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
# R_4^2(r,t,chi) and C_2 tensor R_4^2(r,t,chi), for chi != 1, r,t in {1,3}.
# A = {+-1}, so there is a single non-trivial character, indexed by [0,1].
# NOTE: C_2 tensor R_4^2(1,1,[0,1]) is iso to R_4^2(1,3,nu)_1, and
# C_2 tensor R_4^2(3,1,[0,1]) is iso to R_4^2(3,3,nu)_1.
# NW lists them under the latter name, so this is what we do here; see below.
for r in [1,3] do
rho := SL2IrrepR(2,4,2,r,1,[0,1])[1];
name := Concatenation("R_4^2(", String(r), ",1,[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := SL2IrrepR(2,4,2,r,3,[0,1])[1];
name := Concatenation("R_4^2(", String(r), ",3,[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [-1 * rho[1], -1 * rho[2]];
name := Concatenation("Xi_6 tensor R_4^2(", String(r), ",3,[0,1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_4^2(r,3,nu)_1, for r in {1,3}.
# Basis is given on NW p. 524.
# See above.
for r in [1,3] do
rho := SL2IrrepR(2,4,2,r,3,[0,0])[1];
name := Concatenation("R_4^2(", String(r), ",3,nu)_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
# R_4^0(r,t,chi)+-, for chi primitive, chi^2 = 1, r in {1,3}, t in {1,5}.
# See previous. For t = 1, the relevant chars. are [1,0] and [1,2].
# For t = 5, the relevant chars. are [0,1] and [2,1].
# SL2IrrepR returns a list with the two supreps, + and -.
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 1, [1,0]);
name := Concatenation("R_4^0(", String(r), ",1,[1,0])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",1,[1,0])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepR(2, 4, 0, r, 1, [1,2]);
name := Concatenation("R_4^0(", String(r), ",1,[1,2])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",1,[1,2])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
for r in [1,3] do
rho := SL2IrrepR(2, 4, 0, r, 5, [0,1]);
name := Concatenation("R_4^0(", String(r), ",5,[0,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",5,[0,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
rho := SL2IrrepR(2, 4, 0, r, 5, [2,1]);
name := Concatenation("R_4^0(", String(r), ",5,[2,1])+");
_SL2RecordIrrep(irrep_list, name, rho[1], l);
name := Concatenation("R_4^0(", String(r), ",5,[2,1])-");
_SL2RecordIrrep(irrep_list, name, rho[2], l);
od;
# N_3(chi)+ tensor R_4^0(1,7,psi)+, for psi(alpha) = -1, psi(-1) = 1,
# chi primitive and chi^2 = 1.
# Calculated via Kronecker product.
# For the N part, chars. are [1,0] and [1,3] (see the ld=3 section earlier).
#
# First construct R_4^0(1,7,psi)+. Char is [1,1]. SL2IrrepR gives a list with + and then -.
x := SL2IrrepR(2, 4, 0, 1, 7, [1, 1]);
for j in [0,3] do
# Construct N_3(chi)+. SL2IrrepR again returns a list.
rho := SL2IrrepN(2, 3, [1, j]);
rho := [
KroneckerProduct(rho[1][1], x[1][1]),
KroneckerProduct(rho[1][2], x[1][2]),
12
];
name := Concatenation("N_3([1,", String(j), "])+ tensor R_4^0(1,7,[1,1])+");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
elif ld = 5 then
# D_5(chi), for chi primitive.
# A = <5> x <-1>, and a character is primitive if injective on <5>.
# Note that 5 has order 8.
# This gives four relevant characters, [1,0], [1,1], [3,0], [3,1].
for i in [1,3] do
for j in [0,1] do
rho := SL2IrrepD(2, 5, [i, j])[1];
name := Concatenation("D_5([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# N_5(chi), for chi primitive.
# A = <alpha> x <zeta> where ord(alpha) = 8 and ord(zeta) = 6.
# chi is primitive if injective on <alpha>.
for i in [1,3] do
for j in [0,3] do
rho := SL2IrrepN(2, 5, [i,j])[1];
name := Concatenation("N_5([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for i in [1,3,5,7] do
for j in [1,2] do
rho := SL2IrrepN(2, 5, [i,j])[1];
name := Concatenation("N_5([", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# R_5^0(r,t,chi), for chi primitive, r in {1,3}, t in {1,5}.
# For t = 1, A = <alpha> x <zeta>, with ord(alpha) = 4 and ord(zeta) = 4.
# For t = 5, A = <alpha> x <-1>, with ord(alpha) = 8.
# In both cases, a character is primitive iff injective on alpha.
for r in [1,3] do
for j in [0,2] do
rho := SL2IrrepR(2, 5, 0, r, 1, [1,j])[1];
name := Concatenation("R_5^0(", String(r), ",1,[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
for i in [1,3] do
rho := SL2IrrepR(2, 5, 0, r, 1, [i,1])[1];
name := Concatenation("R_5^0(", String(r), ",1,[", String(i), ",1])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
for r in [1,3] do
for i in [1,3] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 0, r, 5, [i,j])[1];
name := Concatenation("R_5^0(", String(r), ",5,[", String(i), ",", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
# R_5^1(r,t,chi), for chi primitive and:
# r in {1,5}, t in {1,5}, or
# r in {1,3}, t in {3,7}.
# A = <alpha> x <-1>; ord(alpha) = 4. Prim. iff injective on alpha.
# Chars are therefore [0,1] and [1,1].
for r in [1,5] do
for t in [1,5] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 1, r, t, [1,j])[1];
name := Concatenation("R_5^1(", String(r), ",", String(t), ",[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
for r in [1,3] do
for t in [3,7] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 1, r, t, [1,j])[1];
name := Concatenation("R_5^1(", String(r), ",", String(t), ",[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
od;
# R_5^2(r,1,chi)_1 and C_3 tensor R_5^2(r,1,chi)_1,
# for chi NOT primitive and r in {1,3}.
# A = <alpha> x <-1>, so non-primitive characters are indexed by [0,0] and [0,1].
for r in [1,3] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 2, r, 1, [0,j])[1];
name := Concatenation("R_5^2(", String(r), ",1,[0,", String(j), "])_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
rho := [E(4) * rho[1], -E(4) * rho[2], 12];
name := Concatenation("Xi_9 tensor R_5^2(", String(r), ",1,[0,", String(j), "])_1");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# R_5^0(1,t,chi), for chi primitive and t in {3,7}.
# A = <alpha> x <-1> with ord(alpha) = 4.
# A character is primitive iff injective on <alpha>.
# Relevant chars. are therefore [1,0] and [1,1].
for t in [3,7] do
for j in [0,1] do
rho := SL2IrrepR(2, 5, 0, 1, t, [1,j])[1];
name := Concatenation("R_5^0(1,", String(t), ",[1,", String(j), "])");
_SL2RecordIrrep(irrep_list, name, rho, l);
od;
od;
# R_5^2(r,t,chi)+-, for chi primitive, r in {1,3}, and t in {1,3,5,7}.
# A = <alpha> x <-1>, with ord(alpha) = 2.
# Relevant chars are therefore [1,0] and [1,1], both of which square to 1.
# SL2IrrepR returns a list of the two resulting subreps, + and - .
for r in [1,3] do
for t in [1,3,5,7] do
for j in [0,1] do
--> --------------------
--> maximum size reached
--> --------------------
[ zur Elbe Produktseite wechseln0.66Quellennavigators
Analyse erneut starten
]
|