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


Quelle  orbstab.gi   Sprache: unbekannt

 
#############################################################################
##
#A  orbstab.gi                Cryst library                      Bettina Eick
#A                                                              Franz G"ahler
#A                                                              Werner Nickel
##
#Y  Copyright 1997-1999  by  Bettina Eick,  Franz G"ahler  and  Werner Nickel
##

#############################################################################
##
#M  Orbit( G, H, gens, oprs, opr ) . . . . . . . . . .for an AffineCrystGroup
##
InstallOtherMethod( OrbitOp,
        "G, H, gens, oprs, opr for AffineCrystGroups", true,
        [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, 
          IsList, IsList, IsFunction ], 10,
function( G, H, gens, oprs, opr )
    local  orb, grp, gen, img;

    if opr = OnPoints then
        orb := [ H ];
        for grp in orb do
            for gen in oprs do
                img := List( GeneratorsOfGroup( grp ), x -> x^gen );
                if not ForAny( orb, g -> ForAll( img, x -> x in g ) ) then
                    Add( orb, ConjugateGroup( grp, gen ) );
                fi;
            od;
        od;
        return orb;
    else
        TryNextMethod();
    fi;

end );

InstallOtherMethod( OrbitOp,
        "G, H, gens, oprs, opr for AffineCrystGroups", true,
        [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, 
          IsList, IsList, IsFunction ], 10,
function( G, H, gens, oprs, opr )
    local  orb, grp, gen, img;

    if opr = OnPoints then
        orb := [ H ];
        for grp in orb do
            for gen in oprs do
                img := List( GeneratorsOfGroup( grp ), x -> x^gen );
                if not ForAny( orb, g -> ForAll( img, x -> x in g ) ) then
                    Add( orb, ConjugateGroup( grp, gen ) );
                fi;
            od;
        od;
        return orb;
    else
        TryNextMethod();
    fi;

end );

#############################################################################
##
#M  OrbitStabilizer( G, H, gens, oprs, opr ) . . . . .for an AffineCrystGroup
##
InstallOtherMethod( OrbitStabilizerOp,
        "G, H, gens, oprs, opr for AffineCrystGroups", true,
        [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, 
          IsList, IsList, IsFunction ], 0,
function( G, H, gens, oprs, opr )
    local orb, rep, stb, grp, k, img, i, sch;

    if opr = OnPoints then

        orb := [ H ];
        rep := [ One( G ) ];
        if IsSubgroup( G, H ) then
            stb := H;
        else
            stb := Intersection2( G, H );
        fi;

        for grp in orb do
            for k in [1..Length(gens)] do
                img := List( GeneratorsOfGroup( grp ), x -> x^oprs[k] );
                i   := PositionProperty( orb, 
                              g -> ForAll( img, x -> x in g ) );
                if i = fail then
                    Add( orb, ConjugateGroup( grp, oprs[k] ) );
                    Add( rep, rep[Position(orb,grp)] * oprs[k] );
                else
                    sch := rep[Position(orb,grp)] * gens[k] / rep[i];
                    if not sch in stb then
                        stb := ClosureGroup( stb, sch );
                    fi;
                fi;
            od;
        od;
        return Immutable( rec( orbit := orb, stabilizer := stb ) );
    else
        TryNextMethod();
    fi;

end );

InstallOtherMethod( OrbitStabilizerOp,
        "G, H, gens, oprs, opr for AffineCrystGroups", true,
        [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, 
          IsList, IsList, IsFunction ], 0,
function( G, H, gens, oprs, opr )
    local orb, rep, stb, grp, k, img, i, sch;

    if opr = OnPoints then

        orb := [ H ];
        rep := [ One( G ) ];
        if IsSubgroup( G, H ) then
            stb := H;
        else
            stb := Intersection2( G, H );
        fi;

        for grp in orb do
            for k in [1..Length(gens)] do
                img := List( GeneratorsOfGroup( grp ), x -> x^oprs[k] );
                i   := PositionProperty( orb, 
                              g -> ForAll( img, x -> x in g ) );
                if i = fail then
                    Add( orb, ConjugateGroup( grp, oprs[k] ) );
                    Add( rep, rep[Position(orb,grp)] * oprs[k] );
                else
                    sch := rep[Position(orb,grp)] * gens[k] / rep[i];
                    if not sch in stb then
                        stb := ClosureGroup( stb, sch );
                    fi;
                fi;
            od;
        od;
        return Immutable( rec( orbit := orb, stabilizer := stb ) );
    else
        TryNextMethod();
    fi;

end );

#############################################################################
##
#M  RepresentativeAction( G, d, e, opr ) . . . . . .  for an AffineCrystGroup
##
InstallOtherMethod( RepresentativeActionOp,
        "G, d, e, opr for AffineCrystGroups", true,
        [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight, 
          IsAffineCrystGroupOnRight, IsFunction ], 0,
function( G, d, e, opr )

    local Td, Te, PG, f, r, n, Pd, Pe, r2, R, dim, gP, M, i, TG, tr1, tr2,
          tt, res, gN, orb, rep, x, g, dd, redtrans;

    if opr <> OnPoints then
        TryNextMethod();
    fi;

    redtrans := function( TG, tr1, tr2, t2, P, U )
      local dim, gen, t1, sol;
      dim := DimensionOfMatrixGroup( P );
      gen := List( GeneratorsOfGroup( P ), 
                 x -> PreImagesRepresentativeNC( PointHomomorphism( U ), x ) );
      t1  := Concatenation( List( gen, x -> x[dim+1]{[1..dim]} ) ) - t2;
      sol := IntSolutionMat( tr1, -t1 );
      if sol = fail then
          return VectorModL( t2, tr2 );
      else
          return AugmentedMatrix( One( P ), sol{[1..Length(TG)]} * TG );
      fi;
    end;

    # have the translation basis the same length?
    Td := TranslationBasis( d );
    Te := TranslationBasis( e );
    if Length( Td ) <> Length( Te ) then
        return fail;
    fi;

    # map translation basis onto each other
    PG := PointGroup( G );
    if Length( Td ) > 0 then
        f := function(x,g) return ReducedLatticeBasis( x*g ); end;
        r := RepresentativeAction( PG, Td, Te, f );
        if r = fail then
            return fail;
        fi;
        n := Stabilizer( PG, Te, f );
    else
        n := PG;
        r := One( PG );
    fi;

    # map point groups onto each other
    Pd := PointGroup( d );
    Pe := PointGroup( e );
    r2 := RepresentativeAction( n, Pd^r, Pe );
    if r2 = fail then
        return fail;
    fi;
    r := r*r2;
    R := PreImagesRepresentativeNC( PointHomomorphism( G ), r );

    dim := DimensionOfMatrixGroup( PG );
    gP := GeneratorsOfGroup( Pe );
    M  := NullMat( Length(gP) * Length(Te), dim * Length(gP) );
    if not IsEmpty( Te ) then
        for i in [1..Length(gP)] do
            M{[1..Length(Te)]+(i-1)*Length(Te)}{[1..dim]+(i-1)*dim} := Te;
        od;
    fi;

    TG  := TranslationBasis( G );
    tr1 := List( TG, t -> Concatenation( List( gP, x -> t * ( One(Pe)-x ) ) ) );
    tr1 := Concatenation( tr1, M );
    tr2 := ReducedLatticeBasis( tr1 );
    tt  := List( gP, x -> PreImagesRepresentativeNC( PointHomomorphism(e), x ));
    tt  := Concatenation( List( tt, x -> x[dim+1]{[1..dim]} ) );

    # is there a conjugating translation?
    res := redtrans( TG, tr1, tr2, tt, Pe, d^R );
    if IsMatrix( res ) then
        return R * res;
    fi;

    # now we have to try the normalizer
    gN := Filtered( GeneratorsOfGroup( Normalizer(n, Pe) ), x -> not x in Pe );
    gN := List( gN, x -> PreImagesRepresentativeNC( PointHomomorphism(G), x ) );

    orb := [ res ];
    rep := [ R ];
    for x in rep do
        for g in gN do
            dd := d ^ (x * g);
            res := redtrans( TG, tr1, tr2, tt, Pe, dd );
            if IsMatrix( res ) then
                return x * g * res;
            fi;
            if not res in orb then
                Add( orb, res );
                Add( rep, x * g );
            fi;
        od;
    od;
    return fail;

end );

InstallOtherMethod( RepresentativeActionOp,
        "G, d, e, opr for AffineCrystGroups", true,
        [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft, 
          IsAffineCrystGroupOnLeft, IsFunction ], 0,
function( G, d, e, opr )
    local C;
    C := RepresentativeAction( TransposedMatrixGroup( G ),
             TransposedMatrixGroup( d ), TransposedMatrixGroup( e ), opr );
    if C = fail then
        return fail;
    else
        return TransposedMat( C );
    fi;
end );


#############################################################################
##
#F  ConjugatingTranslation( G, gen, T)
##
##  returns a translation t from the Z-span of T such that the elements
##  of gen conjugated with t are in G (or fail if no such t exists)
##
ConjugatingTranslation := function( G, gen, T )

    local d, b, TG, lt, lg, M, I, i, g, m, sol, t;

    d  := DimensionOfMatrixGroup( G ) - 1;
    TG := TranslationBasis( G );
    lt := Length( T  );
    lg := Length( TG );
    b  := [];
    M  := NullMat( lt + lg * Length(gen), d * Length(gen) );
    I  := IdentityMat( d );
    for i in [1..Length(gen)] do
        g := gen[i]{[1..d]}{[1..d]};
        if not g in PointGroup( G ) then
            return fail;
        fi;
        m := PreImagesRepresentativeNC( PointHomomorphism( G ), g );
        Append( b, -gen[i][d+1]{[1..d]} +  m[d+1]{[1..d]} );
        M{[1..lt]}{[1..d]+(i-1)*d} := T * (I - g);
        if lg > 0 then
            M{[1..lg]+lt+(i-1)*lg}{[1..d]+(i-1)*d} := TG;
        fi;
    od;
    sol := IntSolutionMat( M, b );
    if IsList( sol ) then
        sol := sol{[1..lt]} * T;
#        t   := AugmentedMatrix( I, sol );
#        for g in gen do
#            Assert( 0, g^t in G );
#        od;
        return sol;
    else
        return fail;
    fi;

end;


#############################################################################
##
#M  Normalizer( G, H ) . . . . . . . . . . . . . . . . . . . . . . normalizer
##
InstallMethod( NormalizerOp, "two AffineCrystGroupsOnRight", IsIdenticalObj, 
    [ IsAffineCrystGroupOnRight, IsAffineCrystGroupOnRight ], 0,
function( G, H )

    local P, TH, TG, d, I, gens, T, t, trn, orb, rep, stb, 
          grp, gen, img, i, sch, g, b, M, m, sol, Q, N;

    # we must normalize the point group and the translation subgroup
    P  := Normalizer( PointGroup( G ), PointGroup( H ) );
    TH := TranslationBasis( H );
    if TH <> [] then
        P := Stabilizer( P, TH, function( x, g ) 
                                  return ReducedLatticeBasis( x * g );
                                end );
    fi;

    # lift P to G
    d := DimensionOfMatrixGroup( P );
    I := IdentityMat( d );
    gens := List( GeneratorsOfGroup( P ), 
                  x -> PreImagesRepresentativeNC( PointHomomorphism( G ), x ) );

    # stabilizer of translation conjugacy class of H
    TG  := TranslationBasis( G );
    orb := [ H ];
    rep := [ One( G ) ];
    stb := TrivialSubgroup( G );
    for grp in orb do
        for gen in gens do
            img := List( GeneratorsOfGroup( grp ), x -> x^gen );
            i   := PositionProperty( orb, 
                      g -> ConjugatingTranslation( g, img, TG ) <> fail );
            if i = fail then
                Add( orb, ConjugateGroup( grp, gen ) );
                Add( rep, rep[Position(orb,grp)] * gen );
            else
                sch := rep[Position(orb,grp)] * gen / rep[i];
                stb := ClosureGroup( stb, sch );
            fi;
        od;
    od;
    gens := List( GeneratorsOfGroup( stb ), MutableMatrix );

    # fix the translations
    for gen in gens do
        img := List( GeneratorsOfGroup( H ), x -> x^gen );
        trn := ConjugatingTranslation( H, img, TG );
        gen[d+1]{[1..d]} := gen[d+1]{[1..d]} + trn;
    od;
    gens := Set( gens );

    # construct the pure translations
    T := TG;
    for g in GeneratorsOfGroup( PointGroup( H ) ) do
        if  T <> [] then
            M := Concatenation( T * (g-I), TH );
            M := M * Lcm( List( Flat( M ), DenominatorRat ) );
            Q := IdentityMat( Length( M ) );
            M := RowEchelonFormT( M, Q );
            T := Q{[Length(M)+1..Length(Q)]}{[1..Length(T)]} * T;
            T := ReducedLatticeBasis( T );
        fi;
    od;
    for t in T do
        Add( gens, AugmentedMatrix( I, t ) );
    od;

#    for g in gens do
#        Assert( 0, H^g = H );
#    od;

    # construct the normalizer
    N := AffineCrystGroupOnRight( gens, One( G ) );
    AddTranslationBasis( N, T );

    return N;

end );

InstallMethod( NormalizerOp, "two AffineCrystGroupsOnLeft", IsIdenticalObj, 
    [ IsAffineCrystGroupOnLeft, IsAffineCrystGroupOnLeft ], 0,
function( G, H )
    return TransposedMatrixGroup(
      Normalizer( TransposedMatrixGroup(G), TransposedMatrixGroup(H) ) );
end );

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