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


Quelle  findPQuotients.gi   Sprache: unbekannt

 
#############################################################################
##  findPQuotients.gi
#############################################################################
##
##  This file is part of the LINS package.
##
##  This file's authors include Friedrich Rober.
##
##  Please refer to the COPYRIGHT file for details.
##
##  SPDX-License-Identifier: GPL-2.0-or-later
##
#############################################################################


#############################################################################
##  LINS_IsPowerOf
#############################################################################
##  Description:
##
##  For positive integers `a` and `b`
##  returns true if `a` is some power of `b`;
#############################################################################
BindGlobal("LINS_IsPowerOf", function(a, b)
    local c;

    c := a;
    while c > 1 do
        if c mod b = 0 then
            c := QuoInt(c, b);
        else
            return false;
        fi;
    od;

    return true;
end);


#############################################################################
##  LINS_OGL
#############################################################################
##  Description:
##
##  For a positive integer `s` and a prime `p`,
##  returns the size of the group $GL(s, p)$.
#############################################################################

BindGlobal("LINS_OGL", function(s, p)
    local i, j;

    i := 1;
    for j in [0 .. (s - 1)] do
        i := i * (p ^ s - p ^ j);
    od;

    return i;
end);


#############################################################################
##  LINS_MustCheckP
#############################################################################
##  Input:
##
##  - rH :      LINS node in a LINS graph gr
##  - n  :      index bound
##  - p  :      prime
#############################################################################
##  Usage:
##
##  The function `LINS_FindPQuotients` calls this function in the main loop.
#############################################################################
##  Description:
##
##  Returns true if `p`-quotients need to be computed explicitly.
##  Otherwise the groups can be expressed as intersections of larger groups.
#############################################################################

InstallGlobalFunction(LINS_MustCheckP, function(rH, n, p)
    local index, minSubSizes, i, j, ordersToCheck, s;

    # Let the group $G$ be located in the root node of the LINS graph `gr`.
    # Let the group $H$ be located in the node `rH`.

    # $[G : H]$
    index := Index(rH);

    # sizes of minimal normal subgroups of $G/H$
    minSubSizes := List(LinsNodeMinimalSupergroups(rH), rK -> Index(rH) / Index(rK));

    # Has the quotient G/H a non-trivial normal `p`-subgroup?
    # If yes, then do not compute `p`-quotients under $H$.
    for i in minSubSizes do
        if LINS_IsPowerOf(i, p) then
            return false;
        fi;
    od;

    # orders of characteristically simple groups,
    # where `p` is a divisor of the order of the schur multiplier.
    ordersToCheck := List(Filtered(LINS_TargetsCharSimple, Q -> p in Q[2]), Q -> Q[1]);

    # Has the quotient $G/H$ a minimal normal subgroup isomorphic to $T ^ d$,
    # where $T$ is non abelian simple and `p` divides $|Mult(T)|$?
    # If yes, then compute p-quotients under $H$.
    for i in minSubSizes do
        for j in ordersToCheck do
            if i = j then
                return true;
            fi;
        od;
    od;

    # maximal integer $s$ such that $[G : H] * p ^ s <= n$
    s := 1;
    while p ^ (s + 1) <= n / index do
        s := s + 1;
    od;

    # Does $[G : H]$ divide $|GL(s, p)|$?
    # If yes, then compute `p`-quotients under $H$.
    if LINS_OGL(s, p) mod index = 0 then
        return true;
    fi;

    # All above questions were answered with no.
    # Do not compute `p`-quotients under $H$.
    return false;
end);


#############################################################################
##  LINS_ExponentSum
#############################################################################
##  Description:
##
##  Compute the exponent sum `n`-size vector of `word` in GF(`p`)
#############################################################################

BindGlobal("LINS_ExponentSum", function(n, p, word)
    local
    rep,    # [(letter, pos-int)]:  exponent representaton of word, i.e.
            #                       a tuple $(a, b)$ represents the subword
            #                       $a ^ b$ of `word`
    i,      # pos-int:              loop variable
    res;    # [int]:                exponent sum `n`-size vector of `word`

    i := 1;
    res := List([1 .. n], x -> 0);
    rep := ExtRepOfObj(word);
    while Length(rep) >= 2 * i do
        res[rep[2 * i - 1]] := rep[2 * i];
        i := i + 1;
    od;

    return List(res, x -> x * MultiplicativeNeutralElement(FiniteField(p)));
end);


#############################################################################
##  LINS_PullBackH
#############################################################################
##  Description:
##
##  Compute the group homomorphism into the symmetric group
##  representing the action of H on H/K by multiplication
#############################################################################

BindGlobal("LINS_PullBackH", function(GenM, p, Gens, O, Mu, Psi)
    return List(
        [1 .. Length(Gens)],
        i -> PermList(List(
            [1 .. Length(O)],
            j -> Position(O, O[j] + (LINS_ExponentSum(Length(GenM), p, Gens[i] ^ Mu)) ^ Psi))));
end);


#############################################################################
## maximal generators of a p-quotient.
#############################################################################

BindGlobal("LINS_MaxPGenerators", 1000);


#############################################################################
##  LINS_FindPModules
#############################################################################
##  Input:
##
##  - gr :      LINS graph
##  - rH :      LINS node in gr
##  - p :       prime
##  - opts :    LINS options (see documentation)
#############################################################################
##  Usage:
##
##  The function `LINS_FindPQuotients` calls this function in the main loop.
#############################################################################
##  Description:
##
##  Let the group $G$ be located in the root node of the LINS graph `gr`.
##  Let the group $H$ be located in the node `rH`.
##  Let $n$ be the index bound of the LINS graph `gr`.
##
##  Compute every normal subgroup $K$ of $G$,
##  such that $[G:K] <= n$ and the quotient $H/K$ is a `p`-group.
##
##  We construct a module over the groupring $GF(p) G$ and compute maximal submodules of this module.
##  These submodules can be translated into subgroups of $H$,
##  which turn out to be exactly all elementary abelian `p`-quotients under $H$.
##  Then we call this function on the found subgroups again.
##  Thus, after these iterative calls, we have computed
##  all `p`-quotients under $H$ and not only the elementary abelian ones.
##
##  Returns a tuple [doTerminate, nrSubgroups].
##  - doTerminate is true if the search in `gr` can be terminated.
##  - nrSubgroups is the number of newly found normal subgroups.
#############################################################################

InstallGlobalFunction(LINS_FindPModules, function(gr, rH, p, opts)
    local
    G,      # group:        located in the root node of LINS graph `gr`.
    H,      # group:        located in the node `rH`.
    n,      # pos-int:      index bound of LINS graph `gr`.
    Iso,    # isomorphism:  from `H` into fp-group
    IH,     # fp-group:     image under `Iso`, isomorphic to `H`
    P,      # quotsys:      p-quotient of `IH` of class 1
    Mu,     # epimorphism:  from `IH` into `P`
    M,      # pc-group:     image under `Mu`
    GenM,   # [elm]:        generators of `M`, basis of $GF(p) G$ module `M`
    gens,   # [matrix]:     matrices, action of generators of `G` on `M`
    x,      # elm:          loop var, generator of `G`
    y,      # elm:          loop var, elm of `H` with maps
            #               under `Mu` and `Iso` to a generator of `M`
    word,   # elm:          word in `M`, $y ^ x$ via a
            #               "conjugation" action of `G` on `M`
    gen,    # matrix:       over $GF(p)$, encoding action of `x` on `M`
    GM,     # module:       from MeatAxe, representation of
            #               $GF(p) G$ module `M` by `gens`
    MM,     # [module]:     from MeatAxe, all maximal modules of `GM`
    m,      # module:       loop variable, maximal module in `MM`
    V,      # vectorspace:  $GF(p) ^ d$, where $d$ is the dimension of `GM`
    s,      # pos-int:      index of `m` in `V`, which equals index $[H : K]$
    PsiHom, # epimorphism:  from `V` to $V/m$
    Q,      # vectorspace:  image under `PsiHom`
    O,      # [elm]:        all elements of Q, in bijection with
            #               elements of $H/K$
    GenIH,  # [elm]:        generators of `IH`
    PhiHom, # epimorphism:  from `H` into `p`-quotient $H/K$, identification
            #               of `Q` as a quotient of `H` via `Mu`
    K,      # group:        subgroup of `H` with `p`-quotient, normal in `G`
    rK,     # LINS node:    containing `K`
    isNew,  # boolean:      whether the group `K` is new in `gr`
    nrFound,# pos-int:      number of newly found normal subgroups
    data;   # tuple:        [`rK`, `isNew`]

    # Check if `p`-quotients have been computed already from this group
    if p in LinsNodeTriedPrimes(rH) then
        return [false, 0];
    fi;
    AddSet(LinsNodeTriedPrimes(rH), p);

    # Initialize data
    n := IndexBound(gr);
    G :=Grp(LinsRoot(gr));
    H := Grp(rH);
    nrFound := 0;

    # Isomorphism onto the fp-group of `H`
    Iso := IsomorphismFpGroup(H);
    IH := Image(Iso);

    # Create the Isomorphism to the group structure of the `p`-Module `M`
    P := PQuotient(IH, p, 1, LINS_MaxPGenerators);
    Mu := EpimorphismQuotientSystem(P);
    M := Image(Mu);
    GenM := GeneratorsOfGroup(M);

    # If `M` is trivial we skip this prime
    if IsEmpty(GenM) then
        return [false, 0];
    fi;

    # Define the group action of `G` on the `p`-Module `M`
    # For every generator in `G` we store the action on `M` in form of a matrix
    gens := [];
    for x in GeneratorsOfGroup(G) do
        gen := [];
        for y in GenM do
            y := PreImagesRepresentative(Iso, PreImagesRepresentative(Mu, y));
            word := Image(Mu, Image(Iso, x * y * x ^ (-1) ));
            Add(gen, LINS_ExponentSum(Length(GenM), p, word));
        od;
        Add(gens, gen);
    od;

    # Compute the maximal submodules of `M`
    GM := GModuleByMats(gens, FiniteField(p));
    MM := MTX.BasesMaximalSubmodules(GM);
    V := FiniteField(p) ^ (Length(GenM));

    # Translate every submodule of `M` into a normal subgroup of `H`
    # with elementary abelian `p`-quotient
    for m in MM do

        # Check wether the index will be greater than `n`
        m := Subspace(V, m);
        s := p ^ ( Dimension(V) - Dimension(m) );
        if s > n / Index(G, H) then
            continue;
        fi;

        if not opts.DoPModule(gr, rH, p, s * rH!.Index) then
            continue;
        fi;

        # Compute the natural homomorphism from `V` to $V/m$
        PsiHom := NaturalHomomorphismBySubspace(V, m);
        Q := Image(PsiHom);
        O := Elements(Q);
        GenIH := GeneratorsOfGroup(IH);

        # Compute the subgroup `K` with $H/K$ being an
        # elementary abelian `p`-group
        PhiHom :=  GroupHomomorphismByImagesNC(H, SymmetricGroup(Length(O)),
            LINS_PullBackH(GenM, p, List(GeneratorsOfGroup(H), x->Image(Iso, x)), O, Mu, PsiHom));

        K := Kernel(PhiHom);
        if opts.DoSetParent then
            LINS_SetParent(K, G);
        fi;

        # Add the subgroup `K` to LINS graph `gr`
        if Index(G, K) <= n then
            data := LINS_AddGroup(gr, K, [rH], true, opts);
            rK := data[1];
            isNew := data[2];
            if isNew then
                nrFound := nrFound + 1;
                Info(InfoLINS, 3, LINS_tab3,
                    "Prime ", LINS_red, "p = ", p, LINS_reset, ". ",
                    "Found new normal subgroup ", LINS_red, "K = ", K, LINS_reset,
                    " of index ", LINS_red, Index(G, K), LINS_reset, ".");
            fi;
            if isNew and opts.DoTerminate(gr, rH, rK) then
                gr!.TerminatedUnder := rH;
                gr!.TerminatedAt := rK;
                return [true, nrFound];
            fi;
            # If the index is sufficient small,
            # compute `p`-quotients under the subgroup `K`
            if p <= n / Index(G, K) then
                LINS_FindPModules(gr, rK, p, opts);
            fi;
        fi;
    od;

    return [false, nrFound];
end);


#############################################################################
##  LINS_FindPQuotients
#############################################################################
##  Input:
##
##  - gr :      LINS graph
##  - rH :      LINS node in gr
##  - primes :  set containing all primes up to `IndexBound(gr)`
##  - opts :    LINS options (see documentation)
#############################################################################
##  Usage:
##
##  The main function `LowIndexNormalSubgroupsSearch` calls this function
##  in the main loop.
#############################################################################
##  Description:
##
##  Let the group $G$ be located in the root node of the LINS graph `gr`.
##  Let the group $H$ be located in the node `rH`.
##  Let $n$ be the index bound of the LINS graph `gr`.
##
##  Compute every normal subgroup $K$ of $G$, such that $[G:K] <= n$
##  and $H/K$ is a $p$-group for a prime $p$ contained in `primes`,
##  if `LINS_MustCheckP` says that $p$ needs to be explicitly considered.
##
##  Returns a tuple [doTerminate, nrSubgroups].
##  - doTerminate is true if the search in `gr` can be terminated.
##  - nrSubgroups is the number of newly found normal subgroups.
#############################################################################

InstallGlobalFunction(LINS_FindPQuotients, function(gr, rH, primes, opts)
    local
    G,      # group:        located in the root node of LINS graph `gr`
    H,      # group:        located in the node `rH`
    n,      # pos-int:      index bound of LINS graph `gr`
    p,      # pos-int:      loop variable, prime in `primes`
    nrFound,# pos-int:      number of newly found normal subgroups
    res,    # boolean:      whether the search in `gr` can be terminated
    data;   # tuple:        return value of LINS_FindPModules

    # Initialize data from input
    G := Grp(LinsRoot(gr));
    n := IndexBound(gr);
    H := Grp(rH);
    res := false;
    nrFound := 0;

    # Search for p-quotients for every prime small enough.
    for p in primes do
        if p > n / Index(rH) then
            break;
        fi;
        # Check according to some rules whether the p-quotients
        # will be computed by intersections.
        if opts.DoPQuotient(gr, rH, p) and LINS_MustCheckP(rH, n, p) then
            # Compute all p-quotients under H.
            data := LINS_FindPModules(gr, rH, p, opts);
            res := data[1];
            nrFound := nrFound + data[2];
        fi;
        if res then
            break;
        fi;
    od;

    return [res, nrFound];
end);

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