Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/GAP/pkg/twistedconjugacy/lib/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 12.9.2025 mit Größe 9 kB image not shown  

Quelle  reidemeisterspectrum.gi   Sprache: unbekannt

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

###############################################################################
##
## ReidemeisterSpectrum( G )
##
##  INPUT:
##      G:          group G
##
##  OUTPUT:
##      Spec:       Reidemeister spectrum of G
##
BindGlobal(
    "ReidemeisterSpectrum",
    function( G )
        IsFinite( G );
        IsAbelian( G );
        return ReidemeisterSpectrumOp( G );
    end
);

###############################################################################
##
## ExtendedReidemeisterSpectrum( G )
##
##  INPUT:
##      G:          group G
##
##  OUTPUT:
##      Spec:       extended Reidemeister spectrum of G
##
BindGlobal(
    "ExtendedReidemeisterSpectrum",
    function( G )
        IsFinite( G );
        IsAbelian( G );
        return ExtendedReidemeisterSpectrumOp( G );
    end
);

###############################################################################
##
## CoincidenceReidemeisterSpectrum( H, G )
##
##  INPUT:
##      H:          group H
##      G:          group G (optional)
##
##  OUTPUT:
##      Spec:       coincidence Reidemeister spectrum of the pair (H,G)
##
##  REMARKS:
##      If G is omitted, it is assumed to be equal to H.
##
BindGlobal(
    "CoincidenceReidemeisterSpectrum",
    function( H, arg... )
        local G;
        IsFinite( H );
        IsAbelian( H );
        if Length( arg ) = 0 then
            return CoincidenceReidemeisterSpectrumOp( H );
        else
            G := arg[1];
            IsFinite( G );
            IsAbelian( G );
            return CoincidenceReidemeisterSpectrumOp( H, G );
        fi;
    end
);

###############################################################################
##
## TotalReidemeisterSpectrum( G )
##
##  INPUT:
##      G:          group G
##
##  OUTPUT:
##      Spec:       total Reidemeister spectrum of G
##
BindGlobal(
    "TotalReidemeisterSpectrum",
    function( G )
        IsFinite( G );
        IsAbelian( G );
        return TotalReidemeisterSpectrumOp( G );
    end
);

###############################################################################
##
## ReidemeisterSpectrumOp( G )
##
##  INPUT:
##      G:          group G
##
##  OUTPUT:
##      Spec:       Reidemeister spectrum of G
##
InstallMethod(
    ReidemeisterSpectrumOp,
    "for finite abelian groups of odd order",
    [ IsGroup and IsFinite and IsAbelian ],
    3,
    function( G )
        local ord;
        ord := Size( G );
        if IsEvenInt( ord ) then TryNextMethod(); fi;
        return DivisorsInt( ord );
    end
);

InstallMethod(
    ReidemeisterSpectrumOp,
    "for finite abelian 2-groups",
    [ IsGroup and IsFinite and IsAbelian ],
    2,
    function( G )
        local ord, pow, inv, m, fac;
        ord := Size( G );
        pow := Log2Int( ord );
        if ord <> 2 ^ pow then TryNextMethod(); fi;
        inv := Collected( AbelianInvariants( G ) );
        inv := ListX( inv, x -> x[2] = 1, y -> y[1] );
        m := 0;
        while not IsEmpty( inv ) do
            fac := Remove( inv, 1 );
            if not IsEmpty( inv ) and fac * 2 = inv[1] then
                Remove( inv, 1 );
            fi;
            m := m + 1;
        od;
        return List( [ m .. pow ], x -> 2 ^ x );
    end
);

InstallMethod(
    ReidemeisterSpectrumOp,
    "for finite abelian groups",
    [ IsGroup and IsFinite and IsAbelian ],
    1,
    function( G )
        local inv, invE, invO, GE, GO, specE, specO;
        inv := AbelianInvariants( G );
        invE := Filtered( inv, IsEvenInt );
        invO := Filtered( inv, IsOddInt );
        GE := AbelianGroupCons( IsPcGroup, invE );
        GO := AbelianGroupCons( IsPcGroup, invO );
        specE := ReidemeisterSpectrumOp( GE );
        specO := ReidemeisterSpectrumOp( GO );
        return SetX( specE, specO, \* );
    end
);

InstallMethod(
    ReidemeisterSpectrumOp,
    "for finite groups",
    [ IsGroup and IsFinite ],
    0,
    function( G )
        local Aut, gens, conjG, kG, pool, i, id, look, aut, img, cur, p, todo,
              g, j, S, SpecR, s;
        Aut := AutomorphismGroup( G );
        gens := [];
        conjG := ConjugacyClasses( G );
        kG := Length( conjG );
        # Split up conjugacy classes
        pool := DictionaryBySort( true );
        for i in [ 2 .. kG ] do
            id := [ Size( conjG[i] ), Order( Representative( conjG[i] ) ) ];
            look := LookupDictionary( pool, id );
            if look = fail then
                AddDictionary( pool, id, [i] );
            else
                Add( look, i );
            fi;
        od;
        # Calculate induced permutation
        for aut in GeneratorsOfGroup( Aut ) do
            # Skip if automorphism is known to be inner
            if (
                HasIsInnerAutomorphism( aut ) and
                IsInnerAutomorphism( aut )
            ) then
                continue;
            fi;
            img := [];
            cur := 0;
            for p in pool do
                # If small enough, this is more efficient time-wise
                if Size( conjG[p[1]] ) < 1000 then
                    Perform( p, i -> AsSSortedList( conjG[i] ) );
                fi;
                todo := [ 1 .. Length( p ) ];
                for i in [ 1 .. Length( p ) - 1 ] do
                    g := ImagesRepresentative(
                        aut,
                        Representative( conjG[p[i]] )
                    );
                    for j in todo do
                        if g in conjG[p[j]] then
                            Add( img, j + cur );
                            RemoveSet( todo, j );
                            break;
                        fi;
                    od;
                od;
                # Final class is now uniquely determined
                Add( img, todo[1] + cur );
                cur := cur + Length( p );
            od;
            AddSet( gens, PermList( img ) );
        od;
        # Group of permutations on conjugacy classes
        S := Group( gens, () );
        SpecR := [];
        for s in ConjugacyClasses( S ) do
            AddSet( SpecR, kG - NrMovedPoints( Representative( s ) ) );
        od;
        return SpecR;
    end
);

###############################################################################
##
## ExtendedReidemeisterSpectrumOp( G )
##
##  INPUT:
##      G:          group G
##
##  OUTPUT:
##      Spec:       extended Reidemeister spectrum of G
##
InstallMethod(
    ExtendedReidemeisterSpectrumOp,
    "for finite abelian groups",
    [ IsGroup and IsFinite and IsAbelian ],
    G -> DivisorsInt( Size( G ) )
);

InstallMethod(
    ExtendedReidemeisterSpectrumOp,
    "for finite groups",
    [ IsGroup and IsFinite ],
    function( G )
        return Set(
            RepresentativesEndomorphismClasses( G ),
            ReidemeisterNumberOp
        );
    end
);

###############################################################################
##
## CoincidenceReidemeisterSpectrum( H, G )
##
##  INPUT:
##      H:          group H
##      G:          group G (optional)
##
##  OUTPUT:
##      Spec:       coincidence Reidemeister spectrum of the pair (H,G)
##
##  REMARKS:
##      If G is omitted, it is assumed to be equal to H.
##
InstallMethod(
    CoincidenceReidemeisterSpectrumOp,
    "for finite abelian range",
    [ IsGroup and IsFinite, IsGroup and IsFinite and IsAbelian ],
    function( H, G )
        local Hom_reps, hom1;
        Hom_reps := RepresentativesHomomorphismClasses( H, G );
        hom1 := Hom_reps[1];
        return Set( Hom_reps, hom2 -> ReidemeisterNumberOp( hom1, hom2 ) );
    end
);

InstallMethod(
    CoincidenceReidemeisterSpectrumOp,
    "for distinct finite groups",
    [ IsGroup and IsFinite, IsGroup and IsFinite ],
    function( H, G )
        local Hom_reps, SpecR, n, i, j;
        Hom_reps := RepresentativesHomomorphismClasses( H, G );
        SpecR := [];
        n := Length( Hom_reps );
        for i in [ 1 .. n ] do
            for j in [ i .. n ] do
                AddSet(
                    SpecR,
                    ReidemeisterNumberOp( Hom_reps[i], Hom_reps[j] )
                );
            od;
        od;
        return SpecR;
    end
);

InstallOtherMethod(
    CoincidenceReidemeisterSpectrumOp,
    "for finite abelian group to itself",
    [ IsGroup and IsFinite and IsAbelian ],
    ExtendedReidemeisterSpectrumOp
);

InstallOtherMethod(
    CoincidenceReidemeisterSpectrumOp,
    "for finite group to itself",
    [ IsGroup and IsFinite ],
    function( G )
        local Hom_reps, SpecR, n, i, j;
        Hom_reps := RepresentativesEndomorphismClasses( G );
        SpecR := [];
        n := Length( Hom_reps );
        for i in [ 1 .. n ] do
            for j in [ i .. n ] do
                AddSet(
                    SpecR,
                    ReidemeisterNumberOp( Hom_reps[i], Hom_reps[j] )
                );
            od;
        od;
        return SpecR;
    end
);

###############################################################################
##
## TotalReidemeisterSpectrumOp( G )
##
##  INPUT:
##      G:          group G
##
##  OUTPUT:
##      Spec:       total Reidemeister spectrum of G
##
InstallMethod(
    TotalReidemeisterSpectrumOp,
    "for finite abelian groups",
    [ IsGroup and IsFinite and IsAbelian ],
    G -> DivisorsInt( Size( G ) )
);

InstallMethod(
    TotalReidemeisterSpectrumOp,
    "for finite groups",
    [ IsGroup and IsFinite ],
    function( G )
        local GxG, l, r, Spec, H, hom1, hom2;
        GxG := DirectProduct( G, G );
        l := Projection( GxG, 1 );
        r := Projection( GxG, 2 );
        Spec := [];
        for H in List( ConjugacyClassesSubgroups( GxG ), Representative ) do
            hom1 := RestrictedHomomorphism( l, H, G );
            hom2 := RestrictedHomomorphism( r, H, G );
            AddSet( Spec, ReidemeisterNumber( hom1, hom2 ) );
        od;
        return Spec;
    end
);

[ Dauer der Verarbeitung: 0.38 Sekunden  ]