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


Quelle  setup.gi   Sprache: unbekannt

 
#############################################################################
##
#W setup.gi               GUARANA package                     Bjoern Assmann
##
## Methods for the setup of the Malcev correspondence between the 
## radicable hull of a T-group and its corresponding Lie algebra. 
## For this setup we use the Bch formula (and not a unitriangular
## matrix representation). 
## We assume that certain informations about the T-group are given;
## in particular we assume that the pcp is given with respect to 
## a Mal'cev basis. These information about the T-group are stored
## in a record named recTGroup. 
##
#H  @(#)$Id$
##
#Y 2006
##
##

GUARANA.MultMethodIsStar := "Star";
GUARANA.MultMethodIsCollection := "Collec";

############################################################################
##
#F GUARANA.TGroupRec( args )
#F GUARANA.TGroupRec_GEN( N )
## 
## IN
## rgs[1]=N ................ a T-group given by a pcp
## args[2] .................  an optional string, that determines
##                            how the Mal'cev basis should be obtained.
##                            "gen" means that the Malcev basis is 
##                            assumed to be given. 
##                            "ucs" means that a Mal'cev basis going
##                            through the upper central series is computed
##
## OUT
## a record containing some information about N.
## For example weights of the elms of a Mal'cev basis of N.
## 
## Example of usage
## gap> ll:= GUARANA.SomePolyMalcevExams( 2 );
## gap> R := GUARANA.SetupCollecRecord( ll );
## gap> GUARANA.TGroupRec_GEN( R.T );
##
GUARANA.TGroupRec_GEN := function( N )
  local coll, weights, max_weight;

    # get weights 
    coll := Collector( N );
    if FromTheLeftCollector_SetWeights( coll ) <> fail then 
 weights := coll![PC_WEIGHTS];
    else
 Error( "Can not compute weights of Malcev basis of N" );
    fi;
    max_weight := Maximum( weights );

    return rec( T := N, weights := weights, 
                max_weight := max_weight,
                malcevBasisInfo := "gen" );
end;

GUARANA.TGroupRec := function( args )
    local N,malcevBasisInfo;

    N := args[1];
    
    # make choice how the record is set up.
    if IsBound( args[2] ) then 
 malcevBasisInfo := args[2];
    else
 #use default, i.e. the general method
 malcevBasisInfo := "gen";
    fi;

    if malcevBasisInfo = "gen" then
 return GUARANA.TGroupRec_GEN( N );
    elif malcevBasisInfo = "ucs" then 
        return GUARANA.TGroupRec_UCS( N );
    else
 Error( "wrong malcevBasisInfo specified" );
    fi;
end;

InstallGlobalFunction( MalcevObjectConstruction, 
function( recTGroup ) 
    local hl, T, L, malcevBasisInfo, lie_fam, lie_elms_type, grp_fam, 
          grp_elms_type, obj, gen_fam, gen_elms_type;
    
    # get dimension of algebra
    hl := HirschLength( recTGroup.T );

    # get prototype for structure constant table and Lie algebra 
    T:= EmptySCTable( hl, 0, "antisymmetric" );
    L:= LieAlgebraByStructureConstants( Rationals, T );

    # get information about Mal'cev basis.
    # This entry has influence how the Structure constants and Exp
    # are computed. 
    malcevBasisInfo := StructuralCopy( recTGroup.malcevBasisInfo );

    # create family and types for elements of Lie algebra and group
    gen_fam := NewFamily( "MalcevGenFamily",
                          IsMalcevGenElement,
                          IsMalcevGenElement );
    gen_elms_type := NewType( gen_fam, IsMalcevGenElementRep );
    lie_fam := NewFamily( "MalcevLieFamily", 
                           IsMalcevLieElement, 
      IsMalcevLieElement );
    lie_elms_type := NewType( lie_fam, IsMalcevLieElementRep );
    grp_fam := NewFamily( "MalcevGrpFamily", 
                           IsMalcevGrpElement, 
      IsMalcevGrpElement );
    grp_elms_type := NewType( grp_fam, IsMalcevGrpElementRep );

    obj := rec( L := L, 
                dim := hl,
                recTGroup := recTGroup, 
  scTable := T,
         lieAlgebraType := "structureConstants", 
         weights := recTGroup.weights,
  max_weight := recTGroup.max_weight,
         malcevBasisInfo := malcevBasisInfo,
         log_method := "simple",
  exp_method := "simple",
  star_method := "simple",
        mult_method := GUARANA.MultMethodIsStar,
        gen_fam := gen_fam,
        gen_elms_type := gen_elms_type,
  lie_fam := lie_fam,
  lie_elms_type := lie_elms_type,
  grp_fam := grp_fam,
  grp_elms_type := grp_elms_type );

    # compute structure constants
    obj :=  Objectify( NewType( MalcevObjectFamily, 
                               IsMalcevObjectRep and
          IsMutable ),
        obj );
    GUARANA.MO_ComputeStructureConstants(  obj );
    return obj;
end );

##
## some checks whether the input pcp group is defined with respect to 
## a Mal'cev basis
## 
GUARANA.IsGivenWithRespectToMalcevBasis := function( N )
    local C, rels, n, r, i, j, conj;

    if not IsPcpGroup( N ) then
        return fail;
    fi;

    C := Collector( N );

    # check wheter all relative orders are infinite
    rels := RelativeOrders( C );
    for r in rels do
        if r <> 0 then 
            return false;
        fi;
    od;

    # check whether nilpotent presentation
    n := NumberOfGenerators( C );
    for i in [1..n] do
        for j in [i+1..n] do
            conj := GetConjugate( C, j, i );
            if conj[1] <> j then
                return false;
            fi;
            if conj[2] <> 1 then 
                return false;
            fi;
        od;
    od;

    return true;
end;


## IN N ..................... T-group that is given by a pcp with respect 
##                            to Malcev basis.
##
InstallGlobalFunction( MalcevObjectByTGroup, 
function( N ) 
    local recT;
    if not GUARANA.IsGivenWithRespectToMalcevBasis( N ) then 
        return fail;
    fi;
    recT := GUARANA.TGroupRec( [N] );
    return MalcevObjectConstruction( recT );
end);

#############################################################################
##
##
InstallOtherMethod( UnderlyingLieAlgebra, "for Malcev objects", 
[ IsMalcevObjectRep ],
function( malObj )
    return malObj!.L;
end );

#############################################################################
##
##
InstallOtherMethod( UnderlyingGroup, "for Malcev objects", 
[ IsMalcevObjectRep ],
function( malObj )
    return malObj!.recTGroup.T;
end );

#############################################################################
##
##
InstallOtherMethod( Dimension, "for Malcev objects", 
[ IsMalcevObjectRep ],
function( malObj )
    return malObj!.dim;
end );

#############################################################################
##
## Funtions to view and print a Malcev object.
##
InstallMethod( ViewObj, "for Malcev object", [ IsMalcevObjectRep ],
function( malObj )
    Print( "<<Malcev object of dimension ",
           malObj!.dim,
    ">>" );
end );

InstallMethod( PrintObj, "for Malcev object", [IsMalcevObjectRep ],
function( malObj )
    Print( "<<Malcev object of dimension ",
           malObj!.dim,
    ">>" );
end );

#############################################################################
##
#F GUARANA.EvaluateGroupCommutator( g, h, com )
##
## IN
## g,h ................................... group elements
## com ..................................  list containing 1,2
##                                         g corresponds to 1
##                                         h corresponds to 2 
##
## OUT
## com(g,h)
##
GUARANA.EvaluateGroupCommutator := function( g, h, com )
    local tmp,r,l,i;
    tmp := [g,h];
    r := tmp[com[1]];

    l := Length( com );
    for i in [2..l] do
        r := Comm( r, tmp[com[i]] );
    od;
    return r;
end;

#############################################################################
##
#F GUARANA.WeightOfCommutator( com, wx, wy )
## 
## IN 
## com ................. commutator in x,y
## wx .................. weight of x
## wy .................  weight of y 
## 
## OUT
## Weight of com(x,y).
##
GUARANA.WeightOfCommutator := function( com, wx, wy )
    local weight,a;
    weight := 0;
    for a in com do
        if a = 1 then
            weight := weight + wx;
        elif a = 2 then
            weight := weight + wy;
        else
            Error( "Wrong input\n" );
        fi;
    od;
    return weight;
end;

#############################################################################
##
##
GUARANA.CheckWeightOfCommutator := function( com, wx, wy, max_weight )
    local w;
    w := GUARANA.WeightOfCommutator( com, wx, wy );
    if w > max_weight then
        return false;
    else
        return true;
    fi;
end;

GUARANA.CheckWeightOfMalcevCommutator := function( x, y, com )
    local wx, wy, max_weight, w;

    wx := Weight( x );
    wy := Weight( y );
    max_weight := x!.malcevObject!.max_weight;

    w := GUARANA.WeightOfCommutator( com, wx, wy );
    if w > max_weight then
        return false;
    else
        return true;
    fi;
end;

if false then 
    malObjs := GUARANA.Get_FNG_MalcevObjects( 2, 4 );
    malObj := malObjs[3];
    x := MalcevLieElementByCoefficients( malObj, [1,2,3,4,5] );
    y := MalcevLieElementByCoefficients( malObj, [1,2,3,4,5] );
    LieBracket( x, y );

    g := MalcevGrpElementByExponents( malObj, [1,2,3,4,5] );
    h := MalcevGrpElementByExponents( malObj, [1,2,3,4,5] );

    n := 5;
    vars_x := GUARANA.RationalVariableList( n, "x" );
    vars_y := GUARANA.RationalVariableList( n, "y" );
    z := MalcevSymbolicLieElementByCoefficients( malObj, vars_x );
    o := MalcevSymbolicLieElementByCoefficients( malObj, vars_y );

    gg := MalcevSymbolicGrpElementByExponents( malObj, vars_x );

fi;

#############################################################################
##
#M Log  ............................................. for Malcev grp elments 
##
GUARANA.LogByStar := function( g )
    local exp, malcevObject, r, e, x, y, i;

    exp := Exponents( g );
    malcevObject := g!.malcevObject;

    # get zero element of lie algebra of correct type (symbolic/not symbolic)
    if IsSymbolicElement( g ) then 
 r := MalcevSymbolicLieElementByWord( malcevObject,  [[],[]] );
    else
 r := MalcevLieElementByWord( malcevObject, [[],[]] );
    fi;
 
    # go backwards through exponents
    for i in Reversed([1..Length( exp )] ) do
        e := exp[i];
        if e <> 0 then 
     x := GUARANA.MalcevBasisLieElement( malcevObject, i, e );
            y := r;
     r := BCHStar( x, y );
        fi;
    od;
    return r;
end;

InstallOtherMethod( Log, 
               "for Malcev group elments (Guarana)",
        true,
         [IsMalcevGrpElement ],
  0, 
function( g )
    if g!.malcevObject!.log_method = "pols" then 
 return GUARANA.LogByPols( g );
    else 
 return GUARANA.LogByStar( g );
    fi;
end);

#############################################################################
##
#F  GUARANA.MO_EvaluateLieBracketsInTermsOfLogarithmsSers 
##
## IN
## g,h .................................................. Malcev grp elments
##
## OUT 
## [Log g, Log h] 
## This is computed by using an  identity that expresses
## Lie brackets as a linear combination of logarithms of group
## commutators. 
##
GUARANA.MO_EvaluateLieBracketsInTermsOfLogarithmsSers 
                            := function(  g,h )
    local malcevObject, bchLBITOL, r, tree, max_weight, wg, wh, max,  
          min, bound, com, a, log_a, i, term;

    # catch trivial case
    malcevObject := g!.malcevObject;
    if Exponents( g ) = [] then 
 return MalcevLieElementByCoefficients( malcevObject, [] );
    fi;

    bchLBITOL := GUARANA.recBCH.bchLBITOL;
 
    # get zero elment of Lie algebra
    r := 0*GUARANA.MalcevBasisLieElement( malcevObject, 1, 0 );

    # set up tree 
    tree := [h];

    # compute upper bound for the Length of commutators, which 
    # can be involved
    max_weight := malcevObject!.max_weight;
    wg := Weight( g );
    wh := Weight( h );
    max := Maximum( wg,wh );
    min := Minimum( wg,wh );
    # max + min* (bound-1 ) <= max_weight
    bound := Int( (max_weight-max)/min + 1 );

    # up to bound  compute the commutators and add them.
    # Note that the list contains commutators of length i at position i-1.
    for i in [1..bound-1] do
        for term in bchLBITOL[i] do
            com := term[2];
            # check if weight of commutator is not to big
            if GUARANA.CheckWeightOfCommutator( com, wg, wh, max_weight ) then
                # evaluate commutator in the group
  a := Comm( g, h, com, tree );
                # map to the Lie algebra
  log_a := Log( a ); 
                r := r + term[1]*log_a; 
            fi;
        od;
    od;
    return r;
end;

#############################################################################
##
#F GUARANA.MO_LieAlgElm2CoeffGenList( x )
##
## IN
## x .............. malcev lie element
##
## OUT 
## a list, as required for SetEntrySCTable
##
GUARANA.MO_LieAlgElm2CoeffGenList := function( x )
    local coeffs, ll, i;
    coeffs := Coefficients(  x );
    ll := [];
    for i in [1..Length(coeffs)] do
        if coeffs[i] <> 0 then
            Append( ll, [coeffs[i],i] );
 fi;
    od;
    return ll;
end;

#############################################################################
##
#F GUARANA.MO_ComputeStructureConstants( malcevObject )
##
##
## This function computes the structure constants of the Lie algebra.
##
GUARANA.MO_ComputeStructureConstants := function( malcevObject )
    local dim, T, g, h, lie_elm, ll, index_y, index_x;

    # setup 
    dim := malcevObject!.dim;
    T := malcevObject!.scTable;

    # go through generators backwards and compute the 
    # structure constants.  
    for index_y in Reversed( [1..dim-1] ) do 
 for index_x in [1..index_y-1]  do
     g := GUARANA.MalcevBasisGrpElement( malcevObject, index_x, 1 );
     h := GUARANA.MalcevBasisGrpElement( malcevObject, index_y, 1 );

            # compute [log(g),log(h)]
            lie_elm := GUARANA.MO_EvaluateLieBracketsInTermsOfLogarithmsSers( 
                                                                       g,h );
            # if non trivial, then set entry in structure constant table 
     if lie_elm <> 0*lie_elm then 
                ll := GUARANA.MO_LieAlgElm2CoeffGenList( lie_elm );
                SetEntrySCTable( T, index_x, index_y, ll );
            fi;
 od;
        # update Lie algebra with new structure constant table
        malcevObject!.L:= LieAlgebraByStructureConstants( Rationals, T );
    od;
    return 0;
end;

#############################################################################
##
#M Exp  ............................................. for Malcev lie elments 
##
GUARANA.ExpByStar := function( x )
    local malcevObject, coeffs, tail, largestAbelian, exp_x, divider, 
          l, exp_x_2ndPart, exp, j;

    # catch trivial case
    malcevObject := x!.malcevObject;
    coeffs := Coefficients( x );

    tail := x;
    # get smallest index i such that n_i,...,n_l generate an abelian group
    # TODO This can be done better. 
    largestAbelian := malcevObject!.dim -1 ; 

    exp_x := [];
    for j in [1..largestAbelian-1] do
        # get element to divide of
 divider := GUARANA.MalcevBasisLieElement( malcevObject, j, -coeffs[j]);

        # save exponent of divider
        Add( exp_x, coeffs[j] );

        # divide off
 tail := BCHStar( divider, tail );
        
        # set up coefficient vector
        coeffs := Coefficients( tail );
    od;

    # test intermediate result
    l := Length( exp_x );
    if not coeffs{[1..l]} = 0 *  coeffs{[1..l]} then
        Error( "Failure in the computation of Exp \n" );
    fi;

    # get the remaining coefficients 
    exp_x_2ndPart := coeffs{[l+1..Length(coeffs)]};
    
    exp := Concatenation( exp_x, exp_x_2ndPart );
    if IsSymbolicElement( x ) then 
 return MalcevSymbolicGrpElementByExponents( malcevObject, exp );
    else
        return MalcevGrpElementByExponents( malcevObject, exp );
    fi;
end;

InstallMethod( Exp,
               "for Malcev lie elments (Guarana)",
        true,
         [IsMalcevLieElement ],
  0, 
function( x )
    if x!.malcevObject!.exp_method = "pols" then 
 return GUARANA.ExpByPols( x );
    else
 return GUARANA.ExpByStar( x );
    fi;
end);


#############################################################################
##
#E 

[ 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