Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  IrrepLists.gi   Sprache: unbekannt

 
#
# 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

--> --------------------

[ Dauer der Verarbeitung: 0.44 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge