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

Quelle  glasby.gi   Sprache: unbekannt

 
##############################################################################
##
#W  glasby.gi           Cubefree                               Heiko Dietrich
##
##

##############################################################################
## 
#F  RewriteAbsolutelyIrreducibleMatrixGroup( G ) 
## 
## G has to be an absolutely irreducible subgroup of GL(d,q). The output
## is a group H such that H is conjugate to G in GL(d,q) and H is a subgroup
## of GL(d, r) where GF(r) is the subfield of GF(q) generated by the traces 
## of the elements in G. This implementation is based on an algorithm of 
## Howlett and Glasby.
##
InstallGlobalFunction( RewriteAbsolutelyIrreducibleMatrixGroup, function( G )
    local aMat, d, K, q, p, m, gen, k, a, Ga, el, v, H, HH, A, x, C, 
          i, t, n, min, size, solv;

    # check
    if not IsMatrixGroup( G )
       or not IsFinite( FieldOfMatrixGroup( G ) )
       or not MTX.IsAbsolutelyIrreducible(GModuleByMats( GeneratorsOfGroup( G ),
             FieldOfMatrixGroup( G ) ) ) then
        Error("<G> must be an absolutely irreducible matrix group over a finite field");
    fi;

    # auxiliary function computes M^(a^i) for M\in GL(d,K)
    # and an automorphism a: K \to K 
    aMat := function( M, d, i, a )
        local x,y,z,H,j;

        H := MutableCopyMat( M );
        for x in [1..d] do
            for y in [1..d] do
                z := H[x,y];
                for j in [1..i] do
                    z := a(z);
                od;
                H[x,y] := z;
            od;
        od;
        return H;
    end;

    # set up  
    K   := FieldOfMatrixGroup(G);
    d   := DimensionOfMatrixGroup(G);
    q   := Size(K);
    p   := Characteristic(K);
    m   := DegreeOverPrimeField(K);
    gen := GeneratorsOfGroup(G);

    size := 0;
    solv := 0;
    if HasSize(G) then size := Size(G); fi;
    if HasIsSolvableGroup(G) then solv := IsSolvableGroup(G); fi;

    # check if there are subfields of K
    if IsPrime(Size(K)) then
        return G;
    fi;

    # the subfield generated by the traces of the elements of G has to contain
    # the subfield generated by the traces of the generators of G
    min := DegreeOverPrimeField(Field(List(gen,TraceMat)));

    # check all possible subfields
    for n in Filtered( DivisorsInt( m ),x -> x<m and x>=min ) do
     
        k := GF( p^n );
        t := m/n;
        a := x -> x^(p^n);

        Info(InfoCF,4,"        Test subfield ",k," of ", K);

        # find isomorphism between G and G^a
        Ga := GModuleByMats( List( gen, x -> aMat(x,d,1,a) ), K);
        C  := GModuleByMats( gen, K );
        MTX.IsIrreducible( Ga );
        C  := SMTX.Isomorphism( C, Ga );
 
        # only if rewritting is possible over GF(p^n)
        if IsMatrix( C ) then
              
            # normalize C
            for v in K do
                if not IsZero( v ) then
                    H  := v^-1*C;
                    HH := H;
                    for i in [1..t-1] do
                        HH := HH * aMat( H, d, i, a );
                    od;
                    if HH = HH^0 then
                        C := H;
                        break;
                    fi;
                fi;
             od;
            
            # compute A
            A := 0;
            while not A in GL(d,q) do
                x := RandomMat( d, d, K );
                A := x;
                for i in [1..t-1] do
                    A := x + C * aMat(A,d,1,a);
                od;
            od;
            G := G^A;
            if not size=0 then SetSize(G,size); fi;
            if not solv=0 then SetIsSolvableGroup(G,solv); fi;
            return G;
        fi;
    od;

    # the case if no rewriting occurs
    return G;
end);



[ Dauer der Verarbeitung: 0.28 Sekunden  (vorverarbeitet)  ]