Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/modisom/gap/autiso/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 23.8.2024 mit Größe 2 kB image not shown  

Quelle  chains.gi   Sprache: unbekannt

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

BindGlobal( "BasisBySubspaces", function( bases, F, d )
    local V, C, B, new, i, c, basis, weigh;

    # initialize
    V := IdentityMat(d,F);
    C := [ V, [] ];

    # create a chain
    for B in bases do
        new := [];
        for i in [2..Length(C)] do
            if Length( C[i-1] ) > Length( C[i] ) + 1 then
                c := SumIntersectionMat( B, C[i-1] )[2];
                c := SumIntersectionMat( c, C[i] )[1];
                if Length( c ) < Length( C[i-1] ) and
                   Length( c ) > Length( C[i] ) then
                    Add( new, c );
                fi;
            fi;
        od;
        Append( C, new );
        Sort( C, function( x, y ) return Length(x)>Length(y); end );
    od;

    # determine a basis
    basis := [];
    weigh := [];
    for i in [1..Length(C)-1] do
        new := BaseSteinitzVectors(C[i], C[i+1]).factorspace;
        Append( basis, new );
        Append( weigh, List( new, x -> i ) );
    od;

    # that' it
    return rec( basis := basis, weights := weigh );
end );

BindGlobal( "ChainStabilizer", function( wgt, F )
    local d, l, p, mats, size, i, j, n, mat, G;

    # set up
    d := Length( wgt );
    l := 0;
    p := Size(F);

    # init gens and size
    mats := [];
    size  := 1;

    # loop over weights
    for i in [1..wgt[d]] do
        n := Length(Filtered(wgt, x -> x=i)); 

        # adjust size
        for j in [1..n] do
            size := size * (p^(d-l) - p^(d-l-j));
        od;

        # construct gens on diag
        if p = 2 then
            if n >= 2 then
                mat := IdentityMat(d, F);
                mat[l+1][l+n] := One( F );
                mat[l+1][l+1] := Zero( F );
                for j in [ 2 .. n ] do
                    mat[l+j][l+j-1] := One( F );
                    mat[l+j][l+j]   := Zero( F );
                od;
                Add( mats, mat );

                mat := IdentityMat(d, F);
                mat[l+1][l+2] := One( F );
                Add( mats, mat );
            fi;
        else
            mat := IdentityMat(d, F);
            mat[l+1][l+1] := PrimitiveRoot( F );
            Add( mats, mat );

            if n >= 2 then
                mat := IdentityMat(d, F);
                mat[l+1][l+1] := -One( F );
                mat[l+1][l+n] := One( F );
                for j in [ 2 .. n ] do
                    mat[l+j][l+j-1] := -One( F );
                    mat[l+j][l+j]   := Zero( F );
                od;
                Add( mats, mat );
            fi;
        fi;

        # adjust parameter
        l := l + n;

        # add gens off diag
        if l < d then
            mat := IdentityMat(d, F);
            mat[l][l+1] := One( F );
            Add( mats, mat );
        fi;
    od;

    # return group
    G := Group( mats, IdentityMat(d,F) );
    SetSize(G, size );
    return G;
end );


[ Dauer der Verarbeitung: 0.37 Sekunden  ]