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


Quelle  Testing.gi   Sprache: unbekannt

 
Spracherkennung für: .gi vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

#
# SL2Reps: Constructing symmetric representations of SL(2,Z).
#
# Testing functions.
#
# Implementations
#


InstallGlobalFunction( SL2WithConjClasses,
function(p, ld)
    local l, CC, o, s, t, G, C1, c, ccl;

    if not IsPrime(p) then
        Error("p must be a prime.");
    elif not ld in PositiveIntegers then
        Error("ld must be a positive integer.");
    fi;

    l := p^ld;
    CC := _SL2ConjClasses(l);
    o := ZmodnZObj(1, l);
    s := [[0,1],[-1,0]] * o;
    t := [[1,1],[0,1]] * o;
    G := Group([s,t]);

    C1 := [];
    if p > 2 then
        for c in CC[1] do
            if Length(c[1]) = 1 then
                Add(C1, t^(c[1][1]) * s * (-1)^(c[2]));
            elif (Length(c[1]) = 4 and c[1][1] <> 1) or Length(c[1]) = 2 then
                Add(C1, Product(c[1], m -> t^m * s) * (-1)^(c[2]));
            fi;
        od;
    else
        for c in CC[1] do
            if Length(c[1])=4 and c[1][1]<>1 then
                Add(C1, Product(c[1], m -> t^m * s) * (-1)^(c[2]));
            elif Length(c[1])=2 then
                Add(C1, Product(c[1], m -> t^m * s) * (-1)^(c[2]));
            elif Length(c[1])=3 then
                Add(C1, Product(c[1], m -> t^m * s) * (-1)^(c[2]));
            elif Length(c[1])=5 then
                Add(C1, Product(c[1], m -> t^m * s) * (-1)^(c[2]));
            elif Length(c[1])=1 then
                Add(C1, Product(c[1], m -> t^m * s) * (-1)^(c[2]));
            fi;
        od;
    fi;

    ccl := List(C1, x -> ConjugacyClass(G, x));
    if Sum(ccl, x -> Size(x)) <> Size(G) then
        Error("Conjugacy class size mismatch.");
    fi;

    SetConjugacyClasses( G, ccl );

    return G;
end );

InstallGlobalFunction( SL2ChiST,
function(S, T, p, ld)
    local l, ordT, dim, CC, Ssq, TS, i, ProdTrace,
            C1, Du, c,
            Dh, h, e1, e1inv, e2, e2inv, j, jinv, Dhmap;

    dim := DimensionsMat(S);
    if dim = fail or dim[1] <> dim[2] then
        Error("S must be a square matrix.");
    fi;
    dim := DimensionsMat(T);
    if dim = fail or dim[1] <> dim[2] then
        Error("T must be a square matrix.");
    fi;
    ordT := Order(T);
    if (not IsPrimePowerInt(ordT)) or (p^ld mod ordT <> 0) then
        Error("T must have prime power order dividing p^ld.");
    fi;

    l := p^ld;

    CC := _SL2ConjClasses(l);

    Ssq := S^2;
    Ssq := Ssq[1][1]; # assuming S^2 = +-1
    TS := [S];
    for i in [1 .. l-1] do
        Add(TS, T * TS[i]);
    od;

    ProdTrace := function(A, B)
        # assumes they are both square matrices of same size
        return Sum([1..Length(A)], x -> Sum([1..Length(A)], y -> A[x][y]*B[y][x]));
    end;

    C1:=[];
    if p > 2 then
        Du := TS[CC[2]+1] * TS[CC[3]+1] * TS[CC[2]+1];
        for c in CC[1] do
            if Length(c[1]) = 1 then
                Add(C1, Trace(TS[(c[1][1] mod l) +1] * Ssq^(c[2])));
            elif Length(c[1]) = 4 and c[1][1]<>1 then
                Add(C1, ProdTrace(Du,TS[(c[1][4] mod l) +1]) * Ssq^(c[2]));
            elif Length(c[1]) = 2 then
                Add(C1, ProdTrace(TS[(c[1][1] mod l)+1], TS[(c[1][2] mod l)+1]) * Ssq^(c[2]));
            fi;
        od;
    else
        Dh:=[];

        for h in [3..ld] do
            e1 := 1+2^(h-1);
            e1inv := e1^-1 mod l;
            Add(Dh, [e1inv,TS[e1inv+1] * TS[e1+1] * TS[e1inv+1]]);
            e2 := (-e1) mod l;
            e2inv := (-e1inv) mod l;
            Add(Dh, [e2inv, TS[e2inv+1] * TS[e2+1] * TS[e2inv+1]]);
        od;

        for i in [3,5,7] do
            j := i mod l;
            jinv:=j^-1 mod l;
            Add(Dh, [jinv,TS[jinv+1] * TS[j+1] * TS[jinv+1]]);
        od;
        Dh := AsSet(Dh);

        Dhmap:=function(uinv)
            local x;
            x := First(Dh, y -> y[1] = uinv);
            return x[2];
        end;

        for c in CC[1] do
            if Length(c[1])=4 and c[1][1]<>1 then
                Add(C1, ProdTrace(Dhmap(c[1][1]), TS[(c[1][4] mod l) +1]) * Ssq^(c[2]));
            elif Length(c[1])=2 then
                Add(C1, ProdTrace(TS[(c[1][1] mod l)+1], TS[(c[1][2] mod l)+1]) * Ssq^(c[2]));
            elif Length(c[1])=3 then
                Add(C1, Trace(Dhmap(c[1][1] mod l)) * Ssq^(c[2]));
            elif Length(c[1])=5 then
                Add(C1, ProdTrace((TS[(c[1][1] mod l)+1] * Dhmap(c[1][2] mod l)), TS[(c[1][5] mod l)+1]) * Ssq^(c[2]));
            elif Length(c[1])=1 then
                Add(C1, Trace(TS[(c[1][1] mod l)+1]) * Ssq^(c[2]));
            fi;
        od;
    fi;

    return C1;
end );

InstallGlobalFunction( SL2TestPositions,
function(p, ld)
    local NW_irreps, i, G, GAP_irreps, PositionTest, pos_list, rho;

    if not IsPrime(p) then
        Error("p must be a prime.");
    elif not ld in PositiveIntegers then
        Error("ld must be a positive integer.");
    fi;

    Info(InfoSL2Reps, 1, "SL2Reps : Constructing irreps of SL(2,Z/", p^ld, "Z) via Nobs-Wolfart.");
    NW_irreps := [];
    for i in [1 .. ld] do
        Info(InfoSL2Reps, 1, "SL2Reps : Level ", p^i, ":");
        Append(NW_irreps, _SL2IrrepsPPLOfLevel(p, i));
    od;
    Info(InfoSL2Reps, 1, "SL2Reps : In total, ", Length(NW_irreps), " non-trivial irreps of level dividing ", p^ld, " found.");

    Info(InfoSL2Reps, 1, "SL2Reps : Constructing irreps of G=SL2WithConjClasses(", p, ",", ld, ") by using Irr(G).");
    G := SL2WithConjClasses(p, ld);
    GAP_irreps := Irr(G);
    # This always includes the trivial irrep, so we ignore it.
    Info(InfoSL2Reps, 1, "SL2Reps : ", Length(GAP_irreps)-1, " non-trivial irreps of level dividing ", p^ld, " found.");

    PositionTest := function(rho, pos_list)
        local pos;

        pos := Position(GAP_irreps, SL2ChiST(rho.S, rho.T, p, ld));
        if pos = fail then
            Info(InfoSL2Reps, 1, "SL2Reps : ", rho.name, " not found!");
        else
            Info(InfoSL2Reps, 1, "SL2Reps : ", rho.name, ": ", pos);
            Add(pos_list, pos);
        fi;
    end;

    pos_list := [];

    Info(InfoSL2Reps, 1, "SL2Reps : Performing position test:");
    for rho in NW_irreps do
        PositionTest(rho, pos_list);
    od;

    if Length(pos_list) <> Length(AsSet(pos_list)) then
        Info(InfoSL2Reps, 1, "SL2Reps : WARNING: duplicates found:\n", pos_list);
        return false;
    elif Length(pos_list) <> Length(GAP_irreps)-1 then
        Info(InfoSL2Reps, 1, "SL2Reps : WARNING: mismatched number of irreps:\n", pos_list);
        return false;
    else
        Info(InfoSL2Reps, 1, "SL2Reps : 1-to-1 correspondence confirmed.");
        return true;
    fi;
end );

InstallGlobalFunction( SL2TestSymmetry,
function(p, ld)
    local NW_irreps, rho, output;

    if not IsPrime(p) then
        Error("p must be a prime.");
    elif not ld in PositiveIntegers then
        Error("ld must be a positive integer.");
    fi;

    Info(InfoSL2Reps, 1, "SL2Reps : Constructing irreps of SL(2,Z/", p^ld, "Z) with level ", p^ld, " via Nobs-Wolfart.");
    NW_irreps := _SL2IrrepsPPLOfLevel(p, ld);

    Info(InfoSL2Reps, 1, "SL2Reps : Testing that S-matrices are symmetrical and unitary and T-matrices are diagonal.");

    output := true;

    for rho in NW_irreps do
        if rho.S - TransposedMat(rho.S) <> NullMat(Length(rho.S), Length(rho.S)) then
            Info(InfoSL2Reps, 1, "SL2Reps : Warning: S-matrix of ", rho.name, " is not symmetric.");
            output := false;
        fi;

        if (rho.S)^(-1) <> TransposedMat(ComplexConjugate(rho.S)) then
            Info(InfoSL2Reps, 1, "SL2Reps : Warning: S-matrix of ", rho.name, " is not unitary.");
            output := false;
        fi;

        if not IsDiagonalMat(rho.T) then
            Info(InfoSL2Reps, 1, "SL2Reps : Warning: T-matrix of ", rho.name, " is not diagonal.");
            output := false;
        fi;
    od;

    if output = true then
        Info(InfoSL2Reps, 1, "SL2Reps : All properties confirmed.");
    fi;

    return output;
end );

[ Dauer der Verarbeitung: 0.36 Sekunden  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


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