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


Quelle  lieisom.gi   Sprache: unbekannt

 
#############################################################################
##
#W  lieisom.gi                Sophus package                 Csaba Schneider 
##
#W  This file contains the functions for isomorphism testing between 
#W  nilpotent Lie algebras.
##




######################################################################
##
#F  RestrictIsomorphismToLieMultiplicator( <C>, <g> )
## 

BindGlobal( "RestrictIsomorphismToLieMultiplicator", function( C, g )
    local M, BM, BC;
    
    M := LieMultiplicator( C ); 
    BM := Basis( M ); BC := NilpotentBasis( C );
    
    return List( BM, x -> Coefficients( BM, 
                   LinearCombination( BC, Coefficients( BC, x )*g )));
    
end );



######################################################################
##
#F  LiftIsomorphismToLieCover( <L>, <K>, a )

InstallMethod( 
        LiftIsomorphismToLieCover,
        "for nilpotent Lie algebras with nilpotent presentation",
        [ IsLieAlgebra, IsLieAlgebra, IsMatrix ],
        function( L, K, a )
    
    local d, CL, CK, gensCL, gensCK, imsCL, basL, basK, 
          basCL, basCK, hL, hK, newa, mat, T, i, defs;
    
    CL := LieCover( L );
    CK := LieCover( K );
    
    basL := NilpotentBasis( L ); basCL := NilpotentBasis( CL );
    basK := NilpotentBasis( K ); basCK := NilpotentBasis( CK );
    
    d := MinimalGeneratorNumber( L );
    
    hL := AlgebraHomomorphismByImagesNC( CL, L, 
                  List( [1..d], x->basCL[x] ), 
                  List( [1..d], x->basL[x] ));        
    
    hK := AlgebraHomomorphismByImagesNC( CK, K, 
                  List( [1..d], x->basCK[x] ), 
                  List( [1..d], x->basK[x] ));        
    
    gensCL := List( [1..d], x-> basCL[x]);
    
    imsCL := List( gensCL, x -> Image( hL, x ));
    imsCL := List( imsCL, x -> 
                   LinearCombination( basK, Coefficients( basL, x )^a ));
    
    imsCL := List( imsCL, x -> PreImagesRepresentative( hK, x ));
    
    mat := List( imsCL, x->Coefficients( basCK, x ));
 
    defs := LieNBDefinitions( basCK );

    for i in [d+1..Dimension( CK )] do
        Add( mat, Coefficients( basCK, 
                LinearCombination( basCK, 
                        mat[defs[i][1]])*
                LinearCombination( basCK, 
                        mat[defs[i][2]])));
    od;
    
    if Determinant( mat ) = 0*mat[1][1] then
        Error( "not an invertible matrix" );
    fi;
    
#    if not CheckAutomorphisms( [mat] ) then
#       Error( "Wrong automorphism!" );
#    fi;
    
    return mat;
end );

######################################################################
##
#F ApplyAut( <M>, <U>, <g> ) 

BindGlobal( "ApplyAut", function( M, U, g )
    local basU, basM;
    
    basU := Basis( U );
    basM:= Basis( M );
    
    return Subspace( M, List( basU, x -> LinearCombination( basM, 
                   Coefficients( basM, x )^g )));
    
end );




######################################################################
##
#O AreIsomorphicNilpotentLieAlgebras( <L>, <K> )
## 
## Decides if two nilpotent Lie algebras are isomorphic

 InstallMethod( 
         AreIsomorphicNilpotentLieAlgebras,
         "for nilpotent Lie algebras with nilpotent presentation",
         [ IsLieAlgebra, IsLieAlgebra ],
         function( L, K )

     local SL, d, SK, QL, QK, A, A1, CL, CK, fK, KK, fL, KL, Li, F, KKim,
           Q1L, Q1K, O, S, OS, r, R, newbas, bv, newiso, isoKL, i, ii, VAut, s, x, y, t, LM, ML, h, G, G1, npbas, f;

     
     VAut := function( L, x, y )
        local basL, d, S, n,  ims, T, i, defs;
        
        basL := NilpotentBasis( L );
        d := MinimalGeneratorNumber( L );
        S := LieLowerCentralSeries( L );
        n := Dimension( L/S[ Length( S ) - 1 ]);
        
        ims := List( [1..d], x->basL[x] );
        
        ims[x] := basL[x] + basL[n+y];
        
        defs := LieNBDefinitions( basL );
        
        for i in [d+1..Dimension( L )] do
            ims[i] := ims[defs[i][1]]*ims[defs[i][2]];
        od;
        
        ims := List( ims, z->Coefficients( basL, z ));
        
        return ims;
        
    end;
    
    t := Runtime();

    if not IsLieNilpotentOverFp( L ) or not IsLieNilpotentOverFp( K ) then
  TryNextMethod();
    fi;
    
    F := LeftActingDomain( L );
    SL := LieLowerCentralSeries( L );
    SK := LieLowerCentralSeries( K );
    
    d := MinimalGeneratorNumber( L );
     
    if List( SL, x->Dimension( x )) <> List( SK, x->Dimension( x )) then 
        return false;
    fi;
    
    if Length( SL ) = 2 then return true; fi;
   
    Q1L := L/SL[2]; Q1K := K/SK[2];
    
    A := GeneratorsOfGroup( GL( d, F ));
    
    for i in [2..Length( SL ) - 1] do
        
        QL := Q1L; QK := Q1K; Q1L := L/SL[i+1]; 
        
        f := NaturalHomomorphismByIdeal( K, SK[i+1] );
        Q1K := Images( f );
        
        CK := LieCover( QK ); CL := LieCover( QL ); 
        ML := LieMultiplicator( CL );
        
        fK := AlgebraHomomorphismByImagesNC( CK, Q1K, 
                      List( [1..d], x->NilpotentBasis( CK )[x] ), 
                      List( [1..d], x->NilpotentBasis( Q1K )[x] ));
        
        KK := Kernel( fK );
        
        fL := AlgebraHomomorphismByImagesNC( CL, Q1L, 
                      List( [1..d], x->NilpotentBasis( CL )[x] ), 
                      List( [1..d], x->NilpotentBasis( Q1L )[x] ));
        
        KL := Subspace( ML, Basis( Kernel( fL ))); 
        
        KKim := Subspace( ML, List( Basis( KK ), 
                        x->LinearCombination( Basis( CL ),
                                Coefficients( Basis( CK ), x ))));
        
        A := List( A, x->LiftIsomorphismToLieCover( QL, QL, x ));
        
#        if not CheckAutomorphisms( A ) then
#            Error( "Wrong Automorphisms!!!" );
#        fi;
        
        Info( LieInfo, 1, "Time to set up computation: ", Runtime() - t );
        t := Runtime();
        
        A := Group( A );
        Size(A); # ensure size is known, speeds up the OrbitStabilizer compputation
        OS := OrbitStabilizer( A, KL, function( U, g )
            return ApplyAut( ML, U, RestrictIsomorphismToLieMultiplicator( CL, g )); end); 
            
        O := OS.orbit; 
        S := GeneratorsOfGroup( OS.stabilizer );
            
        
        Info( LieInfo, 1, "Time to compute orbit and stabiliser: ", 
              Runtime() - t );
        t := Runtime();
        
        if KKim in O then
            isoKL := RepresentativeAction( A, O,
                             KL, KKim,  function( U, g ) 
                return ApplyAut( ML, U, RestrictIsomorphismToLieMultiplicator( CL, g )); end); 
        else
                return false;
        fi;
        
        newiso := [];
        
        for ii in [1..Dimension( Q1K )] do
            bv := PreImagesRepresentative( fL, NilpotentBasis( Q1L )[ii]);
            bv := LinearCombination( NilpotentBasis( CK ), 
                          Coefficients( NilpotentBasis( CL ), bv )*isoKL );
            bv := Image( fK, bv );
            Add( newiso, bv );
        od;
 
        npbas := RelativeBasisNC( Basis( Q1K ), newiso );
        npbas!.weights := LieNBWeights( NilpotentBasis( Q1L ));
        npbas!.definitions := LieNBDefinitions( NilpotentBasis( Q1L ));
        Setter( IsNilpotentBasis )( npbas, true );
        Setter( NilpotentBasis )( Q1K, npbas );
        if StructureConstantsTable( NilpotentBasis( Q1L ) ){[1..Dimension( Q1L )]} <> 
           StructureConstantsTable( NilpotentBasis( Q1K ) ){[1..Dimension( Q1K )]} then
            Error( "Structure constants do not match" );
        fi;
        
        
        Info( LieInfo, 1, "Time to find isomorphism: ", Runtime() - t );
        t := Runtime();
        
        newbas := 
          List( NilpotentBasis( Q1K ), x->PreImagesRepresentative( f, x ));
        Append( newbas, BasisVectors( Basis( SK[i+1] )));

        K := LieAlgebraByStructureConstants( F, 
                     StructureConstantsTable( Basis( K, newbas )));
        SK := LieLowerCentralSeries( K );
        
        A := List( S, x -> List( NilpotentBasis( Q1L ), 
                     y -> Coefficients( NilpotentBasis( Q1L ), 
                          Image( fL, LinearCombination( NilpotentBasis( CL ), 
                          Coefficients( NilpotentBasis( CL ), 
                          PreImagesRepresentative( fL, y ))^x )))));        
        
        Info( LieInfo, 1, "Time to lift ", Length( A ), " automorphisms: ", Runtime() - t );
        t := Runtime();
        
        s := Dimension( Q1L ) - Dimension( QL );
        
        for x in [1..d] do
            for y in [1..s] do
                Add( A, VAut( Q1L, x, y ));
            od;
        od;
        
#        if not CheckAutomorphisms( A ) then
#            Error( "Wrong Automorphisms!!" );
#        fi;
        
        Info( LieInfo, 1, "Time to finish cycle: ", Runtime() - t );
        Info( LieInfo, 1, "Size of autgroup: ", Size( Group( A )));
        t := Runtime();
    od;
    
    return true;
    
end);



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