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

SSL TerritoryDecomposition.gi   Sprache: unbekannt

 
# `O(blockTopLength * nrOfBlocks)` many K-conjugacy problems.
BindGlobal( "WPE_PartitionDataOfBlockTopByYadeClass",
function(K, wDecompYade, blockTopStart, blockTopLength)
    local blockMapping, blockConjugator, blockPartition, blockRepresentativePos, i, j, zYade, rPos, rYade, c, x;
    # Maps each wreath cycle onto a block
    blockMapping := EmptyPlist(blockTopLength);
    # Stores the conjugating element from the representative onto the wreath cycle
    blockConjugator := EmptyPlist(blockTopLength);
    # Stores the size of each block
    blockPartition := EmptyPlist(blockTopLength); # list can be smaller
    # Stores for each block the position of the representative wreath cycle
    # relative to the block.
    blockRepresentativePos := EmptyPlist(blockTopLength); # list can be smaller
    for i in [1 .. blockTopLength] do
        zYade := wDecompYade[blockTopStart + i - 1];
        # Compare yade with existing block representatives
        for j in [1 .. Length(blockRepresentativePos)] do
            rPos := blockRepresentativePos[j];
            rYade := wDecompYade[blockTopStart + rPos - 1];
            x := RepresentativeAction(K, rYade, zYade);
            if x <> fail then
                blockMapping[i] := j;
                blockConjugator[i] := x;
                blockPartition[j] := blockPartition[j] + 1;
                break;
            fi;
        od;
        # We found a new block
        if not IsBound(blockMapping[i]) then
            j := Length(blockPartition) + 1;
            x := One(K);
            blockMapping[i] := j;
            blockConjugator[i] := x;
            Add(blockPartition, 1);
            Add(blockRepresentativePos, i);
        fi;
    od;
    return rec( blockPartition  := blockPartition,
                blockMapping    := blockMapping,
                blockConjugator := blockConjugator );
end);

# Partition a decomposition of w by load, i.e. by top cycle type and yade class.
BindGlobal( "WPE_PartitionDataOfWreathCycleDecompositionByLoad",
function(W, w, conjToSparse)
    local grps, K, wDecomp, l, wDecompTopType, wSortByTopType, wDecompYade, partition, wBlockConjugator, blockTopStart, blockTopEnd, pos, blockTopLength, wBlockTopPartitionData, wBlockTopPartition, wBlockTopMapping, wBlockTopConjugator, wSortByLoad;
    # Initilize Wreath Product Info
    # Let m be the degree of the Top Group
    grps := ComponentsOfWreathProduct(W);
    K := grps[1];
    # Compute wreath cycles `C(w) = {w_1 ... w_l}`.
    # `O(m)`
    wDecomp := ShallowCopy(WreathCycleDecomposition(w));
    l := Length(wDecomp);
    # Sort decomposition by top cycle type `o`.
    # `O(l log l)`
    wDecompTopType := List(wDecomp, z -> Order(WPE_TopComponent(z)));
    wSortByTopType := Sortex(wDecompTopType);
    wDecomp := Permuted(wDecomp, wSortByTopType);
    conjToSparse := Permuted(conjToSparse, wSortByTopType);
    # Compute Yade for each wreath cycle `w_i`.
    # `O(m)`
    wDecompYade := List(wDecomp, Yade);
    # We denote by `C(L, w)` the block of all wreath cycles in `w` with the same load `L`.
    # `partition` stores the sizes of each block `|C(L, w)|`.
    # We denote by `R(L, w)` the yade representative of the block `C(L, w)`,
    # i.e. the default yade of the first element of this block.
    partition := EmptyPlist(l);
    # This stores for each element `w_i` of a block `C(L, w)` an element `x_i` in `K`,
    # such that `R(L, w) ^ (x_i) = Yade(w_i)`.
    wBlockConjugator := EmptyPlist(l);
    # Sort decomposition by load.
    # For this we iterate over the top cycle types `o` and refine the block
    # `C(o, w) = {z = (f, h) in C(w) : |h| = o}` into a partition by Yade class.
    # `O(l * |L(w)|)` many K-conjugacy problems.
    blockTopStart := 1;
    while blockTopStart <= l do
        # Construct for fixed top cycle type
        blockTopEnd := l;
        for pos in [blockTopStart + 1 .. l] do
            if wDecompTopType[blockTopStart] <> wDecompTopType[pos] then
                blockTopEnd := pos - 1;
                break;
            fi;
        od;
        blockTopLength := blockTopEnd - blockTopStart + 1;
        # Refine blockTop into blocks by yade class,
        # i.e. we map each wreath cycle $w_i$ to a block `C(L, w)`.
        wBlockTopPartitionData := WPE_PartitionDataOfBlockTopByYadeClass(K, wDecompYade, blockTopStart, blockTopLength);
        wBlockTopPartition := wBlockTopPartitionData.blockPartition;
        wBlockTopMapping := wBlockTopPartitionData.blockMapping;
        wBlockTopConjugator := wBlockTopPartitionData.blockConjugator;
        # Partition blockTop of wDecomp
        wSortByLoad := Sortex(wBlockTopMapping);
        wDecomp{[blockTopStart .. blockTopEnd]} := Permuted(
            wDecomp{[blockTopStart .. blockTopEnd]}, wSortByLoad);
        wDecompYade{[blockTopStart .. blockTopEnd]} := Permuted(
            wDecompYade{[blockTopStart .. blockTopEnd]}, wSortByLoad);
        wBlockTopConjugator := Permuted(wBlockTopConjugator, wSortByLoad);
        conjToSparse{[blockTopStart .. blockTopEnd]} := Permuted(
            conjToSparse{[blockTopStart .. blockTopEnd]}, wSortByLoad);
        # Fill main data
        Append(partition, wBlockTopPartition);
        wBlockConjugator{[blockTopStart .. blockTopEnd]} := wBlockTopConjugator;
        blockTopStart := blockTopEnd + 1;
    od;
    return rec( partition           := partition,
                conjToSparse        := conjToSparse,
                wDecomp             := wDecomp,
                wDecompYade         := wDecompYade,
                wBlockConjugator    := wBlockConjugator );
end);

[ Verzeichnis aufwärts0.54unsichere Verbindung  Übersetzung europäischer Sprachen durch Browser  ]