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


Quelle  finiteness.gi   Sprache: unbekannt

 
#############################################################################
##
#W  finiteness.gi                   NilMat                       Alla Detinko
#W                                                               Bettina Eick
#W                                                              Dane Flannery
##
##
## This file contains methods for check whether a given f.g. nilpotent
## matrix group over Q is finite. Further, it contains methods to determine
## the order of a f.g. nilpotent matrix group over GF(q) or Q.
##
#############################################################################
##
#F IsFiniteNilpotentMatGroup( G )   . . . . . . . . . . . . decide finiteness
##
## This function takes a f.g. nilpotent matrix group G over Q and tests
## whether it is finite. The test uses results of the nilpotency test
## IsNilpotentMatGroup and hence it is particularly fast, if this test
## has been used for checking the nilpotence of G.
##
## Note that this function does not check whether G is nilpotent and it
## may return wrong results if it is not.
##
InstallGlobalFunction( IsFiniteNilpotentMatGroup, function(G)
    local n, g, d, a, p, t, pcgs, kern, F;

    # the trivial case
    F := FieldOfMatrixGroup(G);
    if IsFinite(F) then return true; fi;
    if ForAll(GeneratorsOfGroup(G), x -> x = One(G)) then return true; fi;

    # set up
    g := GeneratorsOfGroup(G);
    d := List(g, JordanDecomposition);
    n := DimensionOfMatrixGroup(G);
    a := NullMat(n,n,Rationals);

    # check whether G contains unipotent part
    if ForAny(d, x -> not x[2] = a) then return false; fi;

    # compute kernel of congruence hom
    p := DetermineAdmissiblePrime(g);
    t := InducedByField(g, GF(p));
    pcgs := CPCS_finite_word( t, n+2 );
    kern := POL_NormalSubgroupGeneratorsOfK_p( pcgs, g );

    # check whether kernel is trivial
    kern := Filtered(kern, x -> not x = One(G));
    return (Length(kern) = 0);
end );

InstallMethod( IsFinite, [IsCyclotomicMatrixGroup and IsNilpotentGroup],
function(G)
    if IsRationalMatrixGroup(G) then return IsFiniteNilpotentMatGroup(G); fi;
    TryNextMethod();
end );

###############################################################################
##
#F SizeByKnownClass(G). . . . . . . .determine the order by the nilpotency class
##
## This function takes a nilpotent matrix group over GF(q) generated by
## semisimple matrices and determines its order.

BindGlobal( "SizeByKnownClass", function(G)
    local n, F, l, C, s, c, a;

    n := DimensionOfMatrixGroup(G);
    F := FieldOfMatrixGroup(G);
    l := ClassLimit(n, F);
    C := G;
    s := 1;

    while not IsAbelian(C) do
        a := SecondCentralElement(G,C,l);
        if IsBool(a) then return fail; fi;
        C := OrbitStabGens(C, a);
        s := s * C!.index;
    od;

    return s * Size(C);
end );


#############################################################################
##
#F SizeOfNilpotentMatGroupFF( G ) . . . . . . . . . . . . determine the order
##
## This function takes a nilpotent matrix group G over GF(q) and determines
## its order. The function uses results of the nilpotency test
## IsNilpotentMatGroupFF and hence it is particularly fast, if this test
## has been used for checking the nilpotence of G.
##
## Note that this function does not check whether G is nilpotent and it
## may return wrong results if it is not.
##
## The calls to 'Size' below may need some further refinement and improve-
## ments.

BindGlobal( "SizeOfNilpotentMatGroupFF", function(G)
    local J, S, U, P, B, C, syl;

    # catch a trivial case
    if ForAll(GeneratorsOfGroup(G), x -> x = One(G)) then
        return 1;
    elif Length(Set(GeneratorsOfGroup(G))) = 1 then
        return Order(GeneratorsOfGroup(G)[1]);
    fi;

    # get available info from nilpotency testing
    J := JordanSplitting(G);
    S := J[1];
    U := J[2];

    P := PiPrimarySplitting(S);
    B := P[1];
    C := P[2];

    # now G = B x C x U
    if IsAbelian(B) then
        return Size(U) * Size(C) * Size(B);
    else
        # in this case a Sylow system for B is known from nilpotency testing
        syl := SylowSubgroupsOfNilpotentFFMatGroup(B);
        return Size(U) * Size(C) * Product(List(syl, SizeByKnownClass));
    fi;
end );

#############################################################################
##
#F SizeOfNilpotentMatGroupRN( G ) . . . . . . . . . . . . determine the order
##
## This function takes a nilpotent matrix group G over Q and determines its
## order.
##
## Note that this function does not check whether G is nilpotent and it may
## return wrong results if it is not.
##
BindGlobal( "SizeOfNilpotentMatGroupRN", function(G)
   local g, p, t, H;
   g := GeneratorsOfGroup(G);
   p := DetermineAdmissiblePrime(g);
   t := InducedByField(g, GF(p));
   H := MakeMatGroup(DimensionOfMatrixGroup(G), GF(p), t);
   return SizeOfNilpotentMatGroupFF(H);
end );

#############################################################################
##
#F SizeOfNilpotentMatGroup( G ) . . . . . . . . . . . . . determine the order
##
InstallGlobalFunction( SizeOfNilpotentMatGroup, function(G)
    if IsFFEMatrixGroup(G) then
        return SizeOfNilpotentMatGroupFF(G);
    fi;
    if IsCyclotomicMatrixGroup(G) and IsRationalMatrixGroup(G) then
        return SizeOfNilpotentMatGroupRN(G);
    fi;
    return fail;
end );

##
## we cannot install a similar method to finite field groups, as the
## algorithm for those groups uses a call to 'Size' for some smaller
## subgroups.
##

InstallMethod( Size, true, [IsCyclotomicMatrixGroup and IsNilpotentGroup], 0,
function(G)
   if IsRationalMatrixGroup(G) then
       return SizeOfNilpotentMatGroupRN(G);
   fi;
   TryNextMethod();
end);

[ Dauer der Verarbeitung: 0.24 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