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


Quelle  examples.gi   Sprache: unbekannt

 
############################################################################
##
#W examples.gi   LPRES    René Hartung
##

############################################################################
##
#F  ExamplesOfLPresentations ( <int> )
##
## returns some important examples of L-presented groups (e.g. Grigorchuk).
##
InstallGlobalFunction(ExamplesOfLPresentations,
  function( n )
  local F,F2,  # free group
        rels,  # fixed relators
        sigma,tau, # endomorphism
        endos,  # set of endomorphisms
        itrels,  # iterated relators
        a,b,c,d, # free group generators
        t,r,u,v,  # free group generators
        T,U,V,   # free group generators
        G,  # L-presented group
 e,f,g,h,i, # for abbreviation in the Hanoi tower group
 IL;  # info level of InfoLPRES


  if n=1 then 
    # The Grigorchuk group on 4 generators
    Info(InfoLPRES,1,"The Grigorchuk group on 4 generators from [Lys85]");
    F:=FreeGroup("a","b","c","d");
    a:=F.1;;b:=F.2;;c:=F.3;;d:=F.4;;
    rels:=[a^2,b^2,c^2,d^2,b*c*d];
    sigma:=GroupHomomorphismByImagesNC(F,F,[a,b,c,d],[c^a,d,b,c]);
    endos:=[sigma];
    itrels:=[Comm(d,d^a),Comm(d,d^(a*c*a*c*a))];
    
    G:=LPresentedGroup(F,rels,endos,itrels);
    SetIsInvariantLPresentation(G,true);
    SetSize( G, infinity );
  elif n=2 then
    # The Grigorchuk group on 3 generators
    Info(InfoLPRES,1,"The Grigorchuk group on 3 generators");
    F:=FreeGroup("a","c","d");
    a:=F.1;;c:=F.2;;d:=F.3;;
    rels:=[];
    sigma:=GroupHomomorphismByImagesNC(F,F,[a,c,d],[c^a,c*d,c]);
    endos:=[sigma];
    itrels:=[a^2,Comm(d,d^a),Comm(d,d^(a*c*a*c*a))];
  
    G:=LPresentedGroup(F,rels,endos,itrels);
    SetSize( G, infinity );
  elif n=3 then 
    # The lamplighter group \Z_2 \wr \Z
    Info(InfoLPRES,1,"The lamplighter group on two lamp states");
    IL := InfoLevel( InfoLPRES );
    SetInfoLevel( InfoLPRES, 0 );
    G := LamplighterGroup( IsLpGroup, 2 );
    SetInfoLevel( InfoLPRES, IL );
    SetSize( G, infinity );
  elif n=4 then 
    # Brunner-Sidki-Vieira group
    Info(InfoLPRES,1,"The Brunner-Sidki-Vieira group");
    F:=FreeGroup("a","b");
    a:=F.1;;b:=F.2;;
    rels:=[];
    sigma:=GroupHomomorphismByImagesNC(F,F,[a,b],[b^2*a^(-1)*b^2,b^2]);
    endos:=[sigma];
    itrels:=[Comm(a,a^b),Comm(a,a^(b^3))];
  
    G:=LPresentedGroup(F,rels,endos,itrels);
    SetSize( G, infinity );
  elif n=5 then 
    # The Grigorchuk supergroup
    Info(InfoLPRES,1,"The Grigorchuk supergroup");
    F:=FreeGroup("a","b","c","d");
    a:=F.1;;b:=F.2;;c:=F.3;;d:=F.4;;
    rels:=[];
    sigma:=GroupHomomorphismByImagesNC(F,F,[a,b,c,d],[a*b*a,d,b,c]);
    endos:=[sigma];
    itrels:=[a^2,Comm(b,c),Comm(c,c^a),Comm(c,d^a),Comm(d,d^a),Comm(c^(a*b),
             (c^(a*b))^a),Comm(c^(a*b),(d^(a*b))^a),Comm(d^(a*b),(d^(a*b))^a)];
  
    G:=LPresentedGroup(F,rels,endos,itrels);
    SetSize( G, infinity );
  elif n=6 then 
    # The Fabrykowski-Gupta group
    Info(InfoLPRES,1,"The Fabrykowski-Gupta group");
    G:=GeneralizedFabrykowskiGuptaLpGroup( 3 );
    SetSize( G, infinity );
  elif n=7 then 
    # The Gupta-Sidki group
    Info(InfoLPRES,1,"The Gupta-Sidki group");
    F:=FreeGroup("a","t","u","v");
    a:=F.1;;t:=F.2;;   u:=F.3;;   v:=F.4;;
            T:=F.2^-1;;U:=F.3^-1;;V:=F.4^-1;;

    rels:=[a^3,t^3,t^a/u,t^(a^2)/v];

    itrels:=[ u*T*v*T*U*V*t*v*U*t*U*V*T*u*T*u*v*t*U*t*V*U*v*t*u*V*u*T, 
            u*T*v*T*U*V*T*U*v*U*T*V*u*T*u*v*t*U*t*V*u, 
            u*T*v*T*U*V*t*U*T*u*v*t*U*t*V*U*t*v*u*T*u*V, 
            v*T*u*T*V*U*t*v*U*t*U*V*T*u*t*U*v*t*u*V*u*T, 
            v*T*u*T*V*U*T*U*v*U*T*V*u*t*u, v*T*u*T*V*U*t*U*t*U*t*v*u*T*u*V, 
            T*v*U*t*U*V*T*u*T*v*u*t*V*t*u*v*t*u*V*u*T, U*v*U*T*V*u*T*v*u*t*V*t, 
      T*U*T*v*u*t*V*t*u*t*v*u*T*u*V, u*T*v*T*U*V*T*V*u*V*T*U*v*t*v, 
            u*T*v*T*U*V*t*u*V*t*V*U*T*v*t*V*u*t*v*U*v*T, 
            u*T*v*T*U*V*t*V*t*V*t*u*v*T*v*U,
            v*T*u*T*V*U*T*V*u*V*T*U*v*T*v*u*t*V*t*U*v, 
            v*T*u*T*V*U*t*u*V*t*V*U*T*v*T*v*u*t*V*t*U*V*u*t*v*U*v*T, 
            v*T*u*T*V*U*t*V*T*v*u*t*V*t*U*V*t*u*v*T*v*U, 
            V*u*V*T*U*v*T*u*v*t*U*t, T*V*T*u*v*t*U*t*v*t*u*v*T*v*U, 
            T*u*V*t*V*U*T*v*T*u*v*t*U*t*v*u*t*v*U*v*T, 
            t*U*v*U*T*V*u*v*T*u*T*V*U*t*U*t*v*u*T*u*V*T*v*u*t*V*t*U, 
            t*U*v*U*T*V*u*T*U*t*v*u*T*u*V*T*u*v*t*U*t*V, 
            t*U*v*U*T*V*U*T*v*T*U*V*t*U*t*v*u*T*u*V*t, 
            U*v*T*u*T*V*U*t*U*v*t*u*V*u*t*v*u*t*V*t*U,
            U*T*U*v*t*u*V*u*t*u*v*t*U*t*V, T*v*T*U*V*t*U*v*t*u*V*u,
            v*U*t*U*V*T*u*v*T*u*T*V*U*t*u*T*v*u*t*V*t*U, 
            v*U*t*U*V*T*u*T*u*T*u*v*t*U*t*V, v*U*t*U*V*T*U*T*v*T*U*V*t*u*t, 
            t*U*v*U*T*V*U*V*t*V*U*T*v*u*v, t*U*v*U*T*V*u*V*u*V*u*t*v*U*v*T,
            t*U*v*U*T*V*u*t*V*u*V*T*U*v*u*V*t*u*v*T*v*U, 
            V*t*V*U*T*v*U*t*v*u*T*u, U*V*U*t*v*u*T*u*v*u*t*v*U*v*T,
            U*t*V*u*V*T*U*v*U*t*v*u*T*u*v*t*u*v*T*v*U, 
            v*U*t*U*V*T*U*V*t*V*U*T*v*U*v*t*u*V*u*T*v, 
            v*U*t*U*V*T*u*V*U*v*t*u*V*u*T*V*u*t*v*U*v*T, 
            v*U*t*U*V*T*u*t*V*u*V*T*U*v*U*v*t*u*V*u*T*V*t*u*v*T*v*U, 
            V*T*V*u*t*v*U*v*t*v*u*t*V*t*U, 
            V*u*T*v*T*U*V*t*V*u*t*v*U*v*t*u*v*t*U*t*V, T*u*T*V*U*t*V*u*t*v*U*v, 
            t*V*u*V*T*U*v*T*V*t*u*v*T*v*U*T*v*u*t*V*t*U, 
            t*V*u*V*T*U*v*u*T*v*T*U*V*t*V*t*u*v*T*v*U*T*u*v*t*U*t*V, 
            t*V*u*V*T*U*V*T*u*T*V*U*t*V*t*u*v*T*v*U*t, 
            u*V*t*V*U*T*v*T*v*T*v*u*t*V*t*U,  u*V*t*V*U*T*V*T*u*T*V*U*t*v*t, 
            u*V*t*V*U*T*v*u*T*v*T*U*V*t*v*T*u*v*t*U*t*V, 
            V*U*V*t*u*v*T*v*u*v*t*u*V*u*T, U*t*U*V*T*u*V*t*u*v*T*v, 
            V*t*U*v*U*T*V*u*V*t*u*v*T*v*u*t*v*u*T*u*V, 
            t*V*u*V*T*U*v*U*v*U*v*t*u*V*u*T, t*V*u*V*T*U*V*U*t*U*V*T*u*v*u,
            t*V*u*V*T*U*v*t*U*v*U*T*V*u*v*U*t*v*u*T*u*V, 
            u*V*t*V*U*T*v*U*V*u*t*v*U*v*T*U*v*t*u*V*u*T, 
            u*V*t*V*U*T*V*U*t*U*V*T*u*V*u*t*v*U*v*T*u, 
            u*V*t*V*U*T*v*t*U*v*U*T*V*u*V*u*t*v*U*v*T*U*t*v*u*T*u*V ];

    endos:=[ GroupHomomorphismByImagesNC( F, F, [a,t,u,v],
                                          [a,t,T*v*u*t*V*t*U,T*u*v*t*U*t*V]) ];
    G:=LPresentedGroup(F,rels,endos,itrels);
  
    SetUnderlyingInvariantLPresentation(G,
           LPresentedGroup(F,[a^3],endos,itrels));
    SetSize( G, infinity );
  elif n=8 then 
    # An index-3 subgroups of the Gupta-Sidki group
    Info(InfoLPRES,1,"An index-3 subgroup of the Gupta-Sidki group");
    F:=FreeGroup("t","u","v");
    t:=F.1;    u:=F.2;    v:=F.3; 
    T:=F.1^-1; U:=F.2^-1; V:=F.3^-1; 
    rels:=[];
    endos:=[GroupHomomorphismByImagesNC(F,F,[t,u,v],
                                            [t,T*v*u*t*V*t*U,T*u*v*t*U*t*V]),
            GroupHomomorphismByImagesNC(F,F,[t,u,v],[u,v,t])];

    itrels:=[ t^3,#u^3, v^3,
            u*T*v*T*U*V*t*v*U*t*U*V*T*u*T*u*v*t*U*t*V*U*v*t*u*V*u*T, 
            u*T*v*T*U*V*T*U*v*U*T*V*u*T*u*v*t*U*t*V*u, 
            u*T*v*T*U*V*t*U*T*u*v*t*U*t*V*U*t*v*u*T*u*V, 
            v*T*u*T*V*U*t*v*U*t*U*V*T*u*t*U*v*t*u*V*u*T, 
            v*T*u*T*V*U*T*U*v*U*T*V*u*t*u, v*T*u*T*V*U*t*U*t*U*t*v*u*T*u*V, 
            T*v*U*t*U*V*T*u*T*v*u*t*V*t*u*v*t*u*V*u*T, U*v*U*T*V*u*T*v*u*t*V*t, 
      T*U*T*v*u*t*V*t*u*t*v*u*T*u*V, u*T*v*T*U*V*T*V*u*V*T*U*v*t*v, 
            u*T*v*T*U*V*t*u*V*t*V*U*T*v*t*V*u*t*v*U*v*T, 
            u*T*v*T*U*V*t*V*t*V*t*u*v*T*v*U,
            v*T*u*T*V*U*T*V*u*V*T*U*v*T*v*u*t*V*t*U*v, 
            v*T*u*T*V*U*t*u*V*t*V*U*T*v*T*v*u*t*V*t*U*V*u*t*v*U*v*T, 
            v*T*u*T*V*U*t*V*T*v*u*t*V*t*U*V*t*u*v*T*v*U, 
            V*u*V*T*U*v*T*u*v*t*U*t, T*u*V*t*V*U*T*v*T*u*v*t*U*t*v*u*t*v*U*v*T, 
            T*V*T*u*v*t*U*t*v*t*u*v*T*v*U, 
            t*U*v*U*T*V*u*v*T*u*T*V*U*t*U*t*v*u*T*u*V*T*v*u*t*V*t*U, 
            t*U*v*U*T*V*u*T*U*t*v*u*T*u*V*T*u*v*t*U*t*V, 
            t*U*v*U*T*V*U*T*v*T*U*V*t*U*t*v*u*T*u*V*t, 
            U*v*T*u*T*V*U*t*U*v*t*u*V*u*t*v*u*t*V*t*U,
            U*T*U*v*t*u*V*u*t*u*v*t*U*t*V, T*v*T*U*V*t*U*v*t*u*V*u,
            v*U*t*U*V*T*u*v*T*u*T*V*U*t*u*T*v*u*t*V*t*U, 
            v*U*t*U*V*T*u*T*u*T*u*v*t*U*t*V, v*U*t*U*V*T*U*T*v*T*U*V*t*u*t, 
            t*U*v*U*T*V*U*V*t*V*U*T*v*u*v, t*U*v*U*T*V*u*V*u*V*u*t*v*U*v*T,
            t*U*v*U*T*V*u*t*V*u*V*T*U*v*u*V*t*u*v*T*v*U, 
            V*t*V*U*T*v*U*t*v*u*T*u, U*V*U*t*v*u*T*u*v*u*t*v*U*v*T,
            U*t*V*u*V*T*U*v*U*t*v*u*T*u*v*t*u*v*T*v*U, 
            v*U*t*U*V*T*U*V*t*V*U*T*v*U*v*t*u*V*u*T*v, 
            v*U*t*U*V*T*u*V*U*v*t*u*V*u*T*V*u*t*v*U*v*T, 
            v*U*t*U*V*T*u*t*V*u*V*T*U*v*U*v*t*u*V*u*T*V*t*u*v*T*v*U, 
            V*T*V*u*t*v*U*v*t*v*u*t*V*t*U, 
            V*u*T*v*T*U*V*t*V*u*t*v*U*v*t*u*v*t*U*t*V, T*u*T*V*U*t*V*u*t*v*U*v, 
            t*V*u*V*T*U*v*T*V*t*u*v*T*v*U*T*v*u*t*V*t*U, 
            t*V*u*V*T*U*v*u*T*v*T*U*V*t*V*t*u*v*T*v*U*T*u*v*t*U*t*V, 
            t*V*u*V*T*U*V*T*u*T*V*U*t*V*t*u*v*T*v*U*t, 
            u*V*t*V*U*T*v*T*v*T*v*u*t*V*t*U,  u*V*t*V*U*T*V*T*u*T*V*U*t*v*t, 
            u*V*t*V*U*T*v*u*T*v*T*U*V*t*v*T*u*v*t*U*t*V, 
            V*U*V*t*u*v*T*v*u*v*t*u*V*u*T, U*t*U*V*T*u*V*t*u*v*T*v, 
            V*t*U*v*U*T*V*u*V*t*u*v*T*v*u*t*v*u*T*u*V, 
            t*V*u*V*T*U*v*U*v*U*v*t*u*V*u*T, t*V*u*V*T*U*V*U*t*U*V*T*u*v*u,
            t*V*u*V*T*U*v*t*U*v*U*T*V*u*v*U*t*v*u*T*u*V, 
            u*V*t*V*U*T*v*U*V*u*t*v*U*v*T*U*v*t*u*V*u*T, 
            u*V*t*V*U*T*V*U*t*U*V*T*u*V*u*t*v*U*v*T*u, 
            u*V*t*V*U*T*v*t*U*v*U*T*V*u*V*u*t*v*U*v*T*U*t*v*u*T*u*V ];
  
    G := LPresentedGroup(F,rels,endos,itrels);
    SetSize( G, infinity );
  elif n=9 then 
    # The Basilica group
    Info(InfoLPRES,1,"The Basilica group");
    F:=FreeGroup("a","b");
    a:=F.1; b:=F.2;
    rels:=[];
    endos:=[GroupHomomorphismByImagesNC(F,F,[a,b],[b^2,a])];
    itrels:=[Comm(a,a^b)];
    G := LPresentedGroup( F, rels, endos, itrels );
    SetSize( G, infinity );
  elif n=10 then 
    # Gilbert Baumslag's group
    Info(InfoLPRES,1,"Baumslag's group");
    F:=FreeGroup("a","b","t","u");
    a:=F.1; b:= F.2; t:=F.3; u:=F.4;
    rels:=[u/b];
    endos:=[GroupHomomorphismByImagesNC(F,F,[a,b,t,u],[a,b,t,u^t]), 
            GroupHomomorphismByImagesNC(F,F,[a,b,t,u],[a,b,t,u^(t^-1)])];
    itrels:=[ a^t/a^4, (b^2)^t/b, Comm(a,u) ];
    G := LPresentedGroup( F, rels, endos, itrels );
    SetIsInvariantLPresentation( G, false );  # as proved in [Har08];
    SetSize( G, infinity );
  elif n = 11 then 
    Info( InfoLPRES, 1, "The modified L-presentation of the Basilica Group" );
    F := FreeGroup( "a", "b" );;
    a := F.1; b := F.2;;
    rels := [];;
    endos := [ GroupHomomorphismByImagesNC( F, F, [a,b], [b^2,a] ),
               GroupHomomorphismByImagesNC( F, F, [a,b], [a*b,a^2] ) ];;
    itrels := [ Comm( a, a^b ) ];;
    G := LPresentedGroup( F, rels, endos, itrels );
    SetSize( G, infinity );
  elif n = 12 then 
    Info( InfoLPRES, 1, "The Hanoi-Tower group from [BSZ09]" );
    # as determined in Bartholdi, Siegenthaler, Zalesski, 2009
    F := FreeGroup( "a", "b", "c" );;
    a := F.1;; b := F.2;; c := F.3;;
    d := Comm( a, b );
    e := Comm( b, c );
    f := Comm( c, a );
    g := d ^ c;;
    h := e ^ a;;
    i := f ^ b;;
    rels := [ a^2, b^2, c^2 ];
    endos := [ GroupHomomorphismByImagesNC( F, F, [a,b,c], [a,b^c,c^b] ) ];
    itrels := [ d^-1*e*f*i^-1*g*e, h*e^-1*d^-1*f*d*i^-1, e^-1*g^-1*f^-1*e*g*f,
                e^-1*d*h*e^-2*d^-1*h^2, h*g*d^-2*f^-1*g*f*e^-1 ];
    G := LPresentedGroup( F, rels, endos, itrels );
    SetIsInvariantLPresentation( G, true );
    SetSize( G, infinity );
  else
    Error("<n> must be an integer less than 12");
  fi;

  return(G);
  end);


############################################################################
##
#O  FreeEngelGroup ( <num>, <n> )
##
## returns an L-presentation for the Free n-th Engel Group on <num> 
## generators; see Section~2.4 of [Har08].
##
InstallMethod( FreeEngelGroup, 
  "for positive integers", 
  true,
  [IsPosInt,IsPosInt], 0,
  function( n, c )
  local L, # L-presented Group
        F, # free group
 gens, # generators of the free group
 itrel, # commutators/iterated relator
    i, # loop variable
 imgs, # loop variable to build Endos
        Endos; # the endomorphism of the free group F 

  Info(InfoLPRES,1,"Free ",c,"-Engel group on ",n," generators");
  
  # construct an L-presentation by introducing two "stable letters"
  F:=FreeGroup( n + 2 );

  # generators of the free group
  gens:=GeneratorsOfGroup(F);

  # build the iterated relator ( [u,[u,..[u,v]]] )
  itrel:=Comm(gens[n+1],gens[n+2]);
  for i in [1..c-1] do
    itrel:=Comm(itrel,gens[n+2]);
  od;
  
  # build the endomorphisms
  Endos:=[];
  for i in [1..n] do
    imgs:=ShallowCopy(gens{[1..n]});
    Append(imgs,[gens[i]*gens[n+1],gens[n+2]]);
    Add(Endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));

    imgs:=ShallowCopy(gens{[1..n]});
    Append(imgs,[gens[n+1],gens[i]*gens[n+2]]);
    Add(Endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));

    imgs:=ShallowCopy(gens{[1..n]});
    Append(imgs,[gens[i]^-1*gens[n+1],gens[n+2]]);
    Add(Endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));

    imgs:=ShallowCopy(gens{[1..n]});
    Append(imgs,[gens[n+1],gens[i]^-1*gens[n+2]]);
    Add(Endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));
  od;
  
  return(LPresentedGroup(F,[gens[n+1],gens[n+2]],Endos,[itrel]));
  end);


############################################################################
##
#O  FreeBurnsideGroup( <num>, <exp> )
##
## returns an $L$-presentation for the free Burnside group B(m,n) on
## <num> generators with exponent <exp>; see Section~2.4 of [Har08].
##
InstallMethod( FreeBurnsideGroup,
  "for positive integers",
  true,
  [IsPosInt,IsPosInt], 0,
  function(m,n)
  local F, # underlying free group  
 gens, # generators of the free group F
 rels, # fixed relators
 itrels, # iterated relators
 endos, # substitutions of the $L$-presentations
 imgs, # generators images of a substitution
 j; # loop variable

  Info(InfoLPRES,1,"The Free Burnside Group B(",m,",",n,")\n");

  # introduce a "stable letter"
  F:=FreeGroup(m+1);

  gens:=GeneratorsOfGroup(F);
  rels:=[gens[m+1]];
  itrels:=[gens[m+1]^n];
  endos:=[];
  for j in [1..m] do 
    imgs:=ShallowCopy(gens);
    imgs[m+1]:=imgs[m+1]*gens[j];
    Add(endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));

    imgs:=ShallowCopy(gens);
    imgs[m+1]:=imgs[m+1]*gens[j]^-1;
    Add(endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));
  od;
   
  return(LPresentedGroup(F,rels,endos,itrels));
  end);

############################################################################
##
#O  FreeNilpotentGroup( <num>, <c> )
##
## returns an L-presentation for the free nilpotent group of class <c> 
## on <num> generators; see Section~2.4 of [Har08].
##
InstallMethod(FreeNilpotentGroup,
  "for positive integers",
  true,
  [ IsPosInt, IsPosInt ], 0,
  function(n,c)
  local F,  # underlying free group
 gens,  # free generators
 i,j, # loop variables
 rels, # fixed relators
 itrels, # iterated relators
 imgs, # images under the epimorphism
 endos, # endomorphisms
 L; # L presented group

   Info(InfoLPRES,1,"Free nilpotent group on ",n," generators of class ",c);

   # underlying free group <n> gens + <c+1> gens for the iterated rels
   F:=FreeGroup(n+c+1);

   # free generators
   gens:=GeneratorsOfGroup(F);
   
   rels:=gens{[n+1..n+c+1]};
   itrels:=[LeftNormedComm(gens{[n+1..n+c+1]})];
   endos:=[];
   for i in [n+1..n+c+1] do
     for j in [1..n] do 
       imgs:=ShallowCopy(gens);
       imgs[i]:=imgs[i]*gens[j];
       Add(endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));

       imgs:=ShallowCopy(gens);
       imgs[i]:=imgs[i]*gens[j]^-1;
       Add(endos,GroupHomomorphismByImagesNC(F,F,gens,imgs));
     od;
   od;
   
   return(LPresentedGroup(F,rels,endos,itrels));
  end);

############################################################################
##
#O  GeneralizedFabrykowskiGuptaLpGroup ( <n> )
##
## returns an L-presentation for the generalized Fabrykowski-Gupta group for
## a positive integer <n>; for details on the L-presentation see [BEH].
##
InstallMethod( GeneralizedFabrykowskiGuptaLpGroup,
  "for a positive integer", true,
  [ IsPosInt ], 0,
  function( p )
  local F, # underlying free group
 a,r, # free group generators
 itrels, # iterated relators
 endos, # set of endomorphisms
 s, # list of r^(a^i)'s
 i,j,m,n;# loop variables
 
  F:=FreeGroup("a","r");
  a:=F.1;; r:=F.2;
  s:=List([0..p-1],i-> r^(a^i));;
  Append(s,s);

  itrels:=[a^p];

  for m in [0..p-1] do 
    for n in [0..p-1] do 
      for i in [1..p] do 
        for j in [1..p] do 
          if AbsInt(i-j) in [2..p-2] then
           Add(itrels,Comm( s[i+1]^(s[i]^n), 
                            s[j+1]^(s[j]^m)));
          fi;
        od;   
        Add(itrels,
            s[i+1]^(s[i]^(n+1))/(s[i+1]^(s[i]^n*s[i]^((a^1*s[i]*a^-1)^m))));
      od;
    od;
  od;
  endos:=[ GroupHomomorphismByImagesNC( F, F, [a,r], [ r^(a^-1), r ]) ];
  return( LPresentedGroup( F, [], endos, itrels ) );
  end);

############################################################################
##
#M  LamplighterGroup( <fil>, <int> )
#M  LamplighterGroup( <fil>, <PcGroup> )
##
## returns an L-presentation for the lamplighter group Z_<int> \wr Z
##
InstallMethod( LamplighterGroup,
  "for the filter IsLpGroup and a positive integer",
  [ IsLpGroup, IsPosInt ], 0,
  function( filter, c )
  local F, # underlying free group
 a,t,u, # free group generators
 rels, # fixed relators
 itrels, # iterated relators
 endos, # set of endomorphisms
 G; # the LpGroup 

  Info(InfoLPRES,1,"The lamplighter group on ",c," lamp states");
  F:=FreeGroup( "a", "t", "u" );
  a:=F.1;;t:=F.2;;u:=F.3;;
  rels:=[ a^-1*u ];
  endos:=[ GroupHomomorphismByImagesNC(F,F,[a,t,u],[a,t,u^t]) ];
  itrels:=[a^c,Comm(a,u)];
  
  G:=LPresentedGroup( F, rels, endos, itrels );
  SetUnderlyingInvariantLPresentation(G, UnderlyingAscendingLPresentation( G ));
  return( G );
  end);

############################################################################
##
#M  LamplighterGroup( <fil>, <PcGroup> )
##
## returns an L-presentation for the lamplighter group <PcGroup> \wr Z
##
InstallMethod( LamplighterGroup,
  "for the filter IsLpGroup and a cyclic PcGroup",
  [ IsLpGroup, IsPcGroup ], 0, 
  function( filter, C )
  if not IsCyclic(C) then 
    TryNextMethod();
  else 
     return( LamplighterGroup(IsLpGroup,Size(C)) );
  fi;
  end);

############################################################################
##
#M SymmetricGroupCons
##
## `economical' L-presentations for the symmetric groups by L. Bartholdi.
##
############################################################################
InstallMethod( SymmetricGroupCons,
  "for an LpGroup and a positive integer", true,
  [ IsLpGroup, IsPosInt ], 0,
  function( filter, n )
  local F, rels, map, PHI, gens;

  if n < 3 then return( fail ); fi;

  F    := FreeGroup( n-1 );
  rels := [ F.1^2, (F.1*F.2)^3, (F.1*F.3)^2 ];

  gens := GeneratorsOfGroup( F );

  # for p = (1..n)
  PHI :=[ GroupHomomorphismByImagesNC( F, F, gens,
          Concatenation( gens{[2..n-1]}, [ F.1^Product( gens{[2..n-1]} ) ] ) ),

  # for p = (1,2)
          GroupHomomorphismByImagesNC( F, F, gens,
          Concatenation( [ F.1, F.2^F.1 ], gens{[3..n-1]} ) ),

  # for p = (3..n)
          GroupHomomorphismByImagesNC( F, F, gens,
          Concatenation( [ F.1, F.2^F.3 ], gens{[4..n-1]}, 
                         [ F.3^Product( gens{[4..n-1]} ) ] ) ) ];;

  return( LPresentedGroup( F, [], PHI, rels ) );
  end);
  
############################################################################
##
#M IA group
##
############################################################################
InstallMethod( EmbeddingOfIASubgroup, "for a free group automorphism group",
        [ IsAutomorphismGroupOfFreeGroup ],
        function(A)
# conventions on generators:
# M[i][j][k] is M_{x_i,[x_j,x_k]} if all variables i,j,k are <= n. x_i^-1 is represented as i+n.
# M[i][j][k] is a variable only if j<k. If j>k, it is stored as M[i][k][j]^-1.
# C[i][j] is C_{x_i,x_j} if i,j <= n. If j>n, then it is C_{x_i,x_{j-n}}^-1.
#
# Beware that GAP composes maps left-to-right, while the article composes maps right-to-left.
# GAP's commutator is [g,h] = g^-1h^-1gh, while the article's commutator is ghg^-1h^-1.
# Therefore, in converting an article formula to a GAP formula, multiplication order must be reversed,
# and commutators must be switched from [g,h] to [h,g].
#
    local n, F, G, C, M, i, p, q, r, s, t, u, v, rels, endos, Gendos, epi, alpha;
    
    G := Source(One(A)); # the free group
    n := RankOfFreeGroup(G);
    
    C := List(Arrangements([1..n],2),p->Concatenation("C(",String(p[1]),",",String(p[2]),")"));
    M := [];
    for p in Arrangements([1..n],3) do
        if p[2]>p[3] then continue; fi;
        Add(M,Concatenation("M(",String(p[1]),",[",String(p[2]),",",String(p[3]),"])"));
    od;
    F := FreeGroup(Concatenation(C,M));
    i := 1;
    epi := [];
    C := List([1..n],i->[]);
    for p in Arrangements([1..n],2) do
        C[p[1]][p[2]] := F.(i);
        C[p[1]][p[2]+n] := F.(i)^-1;
        q := ShallowCopy(GeneratorsOfGroup(G));
        q[p[1]] := q[p[2]]*q[p[1]]/q[p[2]];
        Add(epi,GroupHomomorphismByImages(G,q));
        i := i+1;
    od;
    M := List([1..2*n],i->List([1..2*n],j->[]));
    for p in Arrangements([1..n],3) do
        if p[2]>p[3] then continue; fi;
        M[p[1]][p[2]][p[3]] := F.(i);
        M[p[1]][p[3]][p[2]] := F.(i)^-1;
        q := ShallowCopy(GeneratorsOfGroup(G));
        q[p[1]] := Comm(q[p[2]]^-1,q[p[3]]^-1)*q[p[1]];
        Add(epi,GroupHomomorphismByImages(G,q));
        i := i+1;
            
        M[p[1]][p[3]][p[2]+n] := M[p[1]][p[2]][p[3]]^C[p[1]][p[2]];
        M[p[1]][p[2]][p[3]+n] := M[p[1]][p[3]][p[2]]^C[p[1]][p[3]];
            
        M[p[1]][p[3]+n][p[2]+n] := M[p[1]][p[2]][p[3]+n]^C[p[1]][p[2]];
        M[p[1]][p[2]+n][p[3]+n] := M[p[1]][p[3]][p[2]+n]^C[p[1]][p[3]];
            
        M[p[1]][p[3]+n][p[2]] := M[p[1]][p[2]][p[3]]^C[p[1]][p[3]];
        M[p[1]][p[2]+n][p[3]] := M[p[1]][p[3]][p[2]]^C[p[1]][p[2]];
        
        for s in [0,n] do for t in [0,n] do
            M[p[1]+n][p[2]+s][p[3]+t] := Comm(C[p[1]][p[2]+s]^-1,C[p[1]][p[3]+t]^-1) / M[p[1]][p[2]+s][p[3]+t];            
            M[p[1]+n][p[3]+s][p[2]+t] := Comm(C[p[1]][p[3]+s]^-1,C[p[1]][p[2]+t]^-1) / M[p[1]][p[3]+s][p[2]+t];            
        od; od;
    od;
    
    rels := [];
    
    # R0: M(x_a^alpha,[x_b^beta,x_c^gamma]) * M(x_a^alpha,[x_c^gamma,x_b^beta])
    # not necessary anymore, since we put only half the generators
    if true then
    for p in Arrangements([1..n],3) do
        for s in Tuples([0,n],3) do
            Add(rels,M[p[1]+s[1]][p[2]+s[2]][p[3]+s[3]]*M[p[1]+s[1]][p[3]+s[3]][p[2]+s[2]]);
        od;
    od;
    fi;
    
    # R1: [C(x_a,x_b),C(x_c,x_d)]
    for p in Arrangements([1..n],2) do
        if p<>[1,2] then continue; fi;
        for q in Arrangements([1..n],2) do
            if p[1]<>q[1] and p[1]<>q[2] and p[2]<>q[1] then
                Add(rels,Comm(C[p[1]][p[2]],C[q[1]][q[2]]));
            fi;
        od;
    od;
    
    # R2: [M(x_a^alpha,[x_b^beta,x_c^gamma]),M(x_d^delta,[x_e^epsilon,x_f^zeta])]
    for p in Arrangements([1..n],3) do for s in Tuples([0,n],3) do
        if p{[1,2]}<>[1,2] then continue; fi;
        for q in Arrangements([1..n],3) do for t in Tuples([0,n],3) do
            if q[2]>q[3] then continue; fi;
            if p[1]+s[1]<>q[1]+t[1] and not p[1] in q{[2,3]} and not q[1] in p{[2,3]} then
                Add(rels,Comm(M[p[1]+s[1]][p[2]+s[2]][p[3]+s[3]],M[q[1]+t[1]][q[2]+t[2]][q[3]+t[3]]));
            fi;    
        od; od;
    od; od;
    
    # R3: [C(x_a,x_b),M(x_c^gamma,[x_d^delta,x_e^epsilon])]
    for p in Arrangements([1..n],2) do
        if p<>[1,2] then continue; fi;
        for q in Arrangements([1..n],3) do for t in Tuples([0,n],3) do
            if not p[1] in q and not q[1] in p then
                Add(rels,Comm(C[p[1]][p[2]],M[q[1]+t[1]][q[2]+t[2]][q[3]+t[3]]));
            fi;
        od; od;
    od;
    
    # R4: [C(x_c,x_b)*C(x_a,x_b),C(x_c,x_a)]
    for p in Arrangements([1..n],3) do
        if p{[1,2]}<>[1,2] then continue; fi;
        Add(rels,Comm(C[p[3]][p[2]]*C[p[1]][p[2]],C[p[3]][p[1]]));
    od;
    
    # R5: M(x_a^alpha,[x_b^beta,x_c^gamma])^C(x_a,x_b^beta) / M(x_a^alpha,[x_c^gamma,x_b^-beta])
    # not necessary anymore, since we put only a quarter of the generators
    if true then
    for p in Arrangements([1..n],3) do for s in Tuples([0,n],3) do
        if p{[1,2]}<>[1,2] then continue; fi;
        Add(rels,M[p[1]+s[1]][p[2]+s[2]][p[3]+s[3]]^C[p[1]][p[2]+s[2]]/M[p[1]+s[1]][p[3]+s[3]][p[2]+n-s[2]]);
    od; od;
    fi;

    # R6: M(x_a^-alpha,[x_b^beta,x_c^gamma])*M(x_a^alpha,[x_b^beta,x_c^gamma]) / [C(x_a,x_c^gamma)^-1,C(x_a,x_b^beta)^-1]
    for p in Arrangements([1..n],3) do for s in Tuples([0,n],3) do
        if p{[1,2]}<>[1,2] then continue; fi;
        Add(rels,M[p[1]+n-s[1]][p[2]+s[2]][p[3]+s[3]]*M[p[1]+s[1]][p[2]+s[2]][p[3]+s[3]]/Comm(C[p[1]][p[2]+s[2]]^-1,C[p[1]][p[3]+s[3]]^-1));
    od; od;
    
    # R7: [C(x_a,x_b^beta)^-1,M(x_a^-alpha,[x_b^beta,x_c^gamma])] / [C(x_a,x_d^delta)^-1,C(x_a,x_c^gamma)^-1]
    for p in Arrangements([1..n],4) do for s in Tuples([0,n],4) do
        if p{[1,2]}<>[1,2] then continue; fi;
        Add(rels,Comm(C[p[1]][p[2]+s[2]]^-1,M[p[2]+s[2]][p[3]+s[3]][p[4]+s[4]]^-1)/Comm(C[p[1]][p[3]+s[3]]^-1,C[p[1]][p[4]+s[4]]^-1));
    od; od;
    
    # R8: M(x_a^alpha,[x_c^gamma,x_b^beta])*M(x_d^delta,[x_a^alpha,x_e^epsilon])*M(x_a^alpha,[x_b^beta,x_c^gamma])/M(x_d^delta,[x_c^gamma,x_b^beta])^C(x_d,x_e^-epsilon)/M(x_d^delta,[x_a^alpha,x_e^epsilon])/M(x_d^delta,[x_b^beta,x_c^gamma])
    for p in Arrangements([1..n],4) do for q in [1..n] do for s in Tuples([0,n],5) do p[5] := q;
        if p{[1,2]}<>[1,2] then continue; fi;
        if p[5] in p{[1,4]} then continue; fi;
        t := C[p[4]][p[5]]; if s[5]=n then t := t^-1; fi;
        Add(rels,M[p[1]+s[1]][p[3]+s[3]][p[2]+s[2]]*M[p[4]+s[4]][p[1]+s[1]][p[5]+s[5]]*
            M[p[1]+s[1]][p[2]+s[2]][p[3]+s[3]]/M[p[4]+s[4]][p[3]+s[3]][p[2]+s[2]]^C[p[4]][p[5]+n-s[5]]/M[p[4]+s[4]][p[1]+s[1]][p[5]+s[5]]/M[p[4]+s[4]][p[2]+s[2]][p[3]+s[3]]);
    od; od; od;
    
    # R9: M(x_c^gamma,[x_a^alpha,x_b^beta])^-C(x_a,x_b^beta) * M(x_c^gamma,[x_b^beta,x_a^alpha])*M(x_c^gamma,x[x_a^alpha,x_d^delta])*M(x_c^gamma,[x_a^alpha,x_b^beta])^-C(x_c,x_d^delta)
    for p in Arrangements([1..n],3) do for q in [1..n] do for s in Tuples([0,n],4) do p[4] := q;
        if p{[1,2]}<>[1,2] then continue; fi;
        if p[4] in p{[1,3]} then continue; fi;
        Add(rels,M[p[3]+s[3]][p[2]+s[2]][p[1]+s[1]]*M[p[3]+s[3]][p[1]+s[1]][p[4]+s[4]]*
            M[p[3]+s[3]][p[1]+s[1]][p[2]+s[2]]^C[p[3]][p[4]+n-s[4]]/M[p[3]+s[3]][p[1]+s[1]][p[4]+s[4]]^C[p[1]][p[2]+s[2]]);
    od; od; od;
    
    endos := [];
    Gendos := [];
    # I_1
    t := []; u := [];
    for q in Arrangements([1..n],2) do
        Add(t,C[q[1]][q[2]]);
        if 1=q[2] then Add(u,C[q[1]][q[2]]^-1); else Add(u,C[q[1]][q[2]]); fi;
    od;
    for q in Arrangements([1..n],3) do for s in Tuples([0,n],3) do
        if q[2]>q[3] or s<>[0,0,0] then continue; fi;
        Add(t,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]);
        if 1 in q then s[Position(q,1)] := n-s[Position(q,1)]; fi;
        Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]);
    od; od;
    Add(endos,GroupHomomorphismByImages(F,t,u));
    t := ShallowCopy(GeneratorsOfGroup(G));
    t[1] := t[1]^-1;
    Add(Gendos,GroupHomomorphismByImages(G,t));
    
    # P_s for all permutations s on {1..n}
    for p in GeneratorsOfGroup(SymmetricGroup(n)) do
        t := []; u := [];
        for q in Arrangements([1..n],2) do
            Add(t,C[q[1]][q[2]]);
            Add(u,C[q[1]^p][q[2]^p]);
        od;
        for q in Arrangements([1..n],3) do for s in Tuples([0,n],3) do
            if q[2]>q[3] then continue; fi;
            Add(t,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]);
            Add(u,M[q[1]^p+s[1]][q[2]^p+s[2]][q[3]^p+s[3]]);
        od; od;
        Add(endos,GroupHomomorphismByImages(F,t,u));
        Add(Gendos,GroupHomomorphismByImages(G,Permuted(GeneratorsOfGroup(G),p^-1)));
    od;
    
    # M_{x_1^alpha,x_2^beta}
    for p in Tuples([0,n],2) do
        if p[1]=0 then alpha := 1; else alpha := -1; fi;
        t := []; u := [];
        for q in Arrangements([1..n],2) do
            Add(t,C[q[1]][q[2]]);
            if q[2]=1 and q[1]<>2 then # C(x_c,x_a)
                Add(u,(C[q[1]][2+p[2]]*C[q[1]][1+p[1]])^alpha);
            elif q[1]=1 and q[2]<>2 then # C(x_a,x_c)
                Add(u,M[1+p[1]][2+n-p[2]][q[2]]*C[1][q[2]]);
            elif q[1]=2 and q[2]<>1 then # C(x_b,x_c)
                Add(u,M[1+p[1]][2+n-p[2]][q[2]+n]*C[2][q[2]]);
            elif q=[2,1] then # C(x_b,x_a)
                Add(u,(C[2][1+p[1]]*C[1][2+p[2]])^alpha);
            else
                Add(u,C[q[1]][q[2]]);
            fi;
        od;
        for q in Arrangements([1..n],3) do for s in Tuples([0,n],3) do
            if q[2]>q[3] or s<>[0,0,0] then continue; fi;
            Add(t,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]);
            if q[1]+s[1]=1+p[1] and not 2 in q then # M(x_a^alpha,[x_c^gamma,x_d^delta])
                Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]^C[1][2+p[2]]);
            elif q[2]+s[2]=1+p[1] and not 2 in q then # M(x_c^gamma,[x_a^alpha,x_d^delta])
                Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]^C[q[1]][2+n-p[2]]*M[q[1]+s[1]][2+p[2]][q[3]+s[3]]);
            elif q[2]+s[2]=1+n-p[1] and not 2 in q then # M(x_c^gamma,[x_a^-alpha,x_d^delta])
                Add(u,M[q[1]+s[1]][2+n-p[2]][q[3]+s[3]]^(C[q[1]][1]^alpha)*M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]);
            elif q[1]+s[1]=2+p[2] and not 1 in q then # M(x_b^beta,[x_c^gamma,x_d^delta])
                Add(u,(M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]*M[1+n-p[1]][q[2]+s[2]][q[3]+s[3]])^C[1][2+p[2]]);
            elif q[1]+s[1]=2+n-p[2] and not 1 in q then # M(x_b^-beta,[x_c^gamma,x_d^delta])
                Add(u,M[2+n-p[2]][q[2]+s[2]][q[3]+s[3]]*M[1+p[1]][q[2]+s[2]][q[3]+s[3]]);
            elif q[1]+s[1]=1+p[1] and q[2]+s[2]=2+p[2] then # M(x_a^alpha,[x_b^beta,x_c^gamma])
                Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]^C[1][2+p[2]]);
            elif q[1]+s[1]=1+p[1] and q[2]+s[2]=2+n-p[2] then # M(x_a^alpha,[x_b^-beta,x_c^gamma])
                Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]^C[1][2+p[2]]);
            elif q[1]+s[1]=2+p[2] and q[2]+s[2]=1+p[1] then # M(x_b^beta,[x_a^alpha,x_c^gamma])
                Add(u,M[q[1]+n-s[1]][q[2]+s[2]][q[3]+n-s[3]]*C[2][q[3]+n-s[3]]*M[q[2]+s[2]][q[1]+n-s[1]][q[3]+s[3]]*C[1][q[3]+s[3]]);
            elif q[1]+s[1]=2+p[2] and q[2]+s[2]=1+n-p[1] then # M(x_b^beta,[x_a^-alpha,x_c^gamma])
                Add(u,(C[1][q[3]+n-s[3]]*M[1+p[1]][q[3]+s[3]][2+n-p[2]]*C[2][q[3]+s[3]]*M[2+n-p[2]][q[3]+n-s[3]][1+p[1]])^(C[q[3]][1+n-p[1]]*C[q[3]][2+n-p[2]]));
            elif q[1]+s[1]=2+n-p[2] and q[2]+s[2]=1+p[1] then # M(x_b^-beta,[x_a^alpha,x_c^gamma])
                Add(u,((C[2][q[3]+s[3]]*M[q[2]+s[2]][q[3]+s[3]][q[1]+s[1]])^C[q[3]][2+p[2]]*M[q[1]+s[1]][q[3]+s[3]][q[2]+n-s[2]])^C[q[3]][1+p[1]]*C[1][q[3]+n-s[3]]);
            elif q[1]+s[1]=2+n-p[2] and q[2]+s[2]=1+n-p[1] then # M(x_b^-beta,[x_a^-alpha,x_c^gamma])
                Add(u,(C[1][q[3]+s[3]]^C[q[3]][1+n-p[1]]*M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]])^C[q[3]][2+n-p[2]]*M[1+p[1]][q[1]+s[1]][q[3]+s[3]]*C[2][q[3]+n-s[3]]);
            elif q[2]+s[2]=1+p[1] and q[3]+s[3]=2+p[2] then # M(x_c^gamma,[x_a^alpha,x_b^beta])
                Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]^C[1][2+p[2]]);
            elif q[2]+s[2]=1+p[1] and q[3]+s[3]=2+n-p[2] then # M(x_c^gamma,[x_a^alpha,x_b^-beta])
                Add(u,M[q[1]+s[1]][q[3]+n-s[3]][q[2]+s[2]]);
            else
                Add(u,M[q[1]+s[1]][q[2]+s[2]][q[3]+s[3]]);
            fi;
        od; od;
        Add(endos,GroupHomomorphismByImages(F,t,u));
        u := ShallowCopy(GeneratorsOfGroup(G));
        v := ShallowCopy(GeneratorsOfGroup(G));
        if p[2]=0 then
            u[1] := (u[2]*u[1]^alpha)^alpha;
        else
            u[1] := (u[2]^-1*u[1]^alpha)^alpha;
        fi;
        Add(Gendos,GroupHomomorphismByImages(G,u));
    od;
    F := LPresentedGroup(F,[],endos,rels);
    F!.C := C; # hack: provide access to C and M generators as convenient tables
    F!.M := M;
    F!.Gendos := Gendos; # automorphisms of G such that endos[i] acts on Aut(G) by conjugation by Gendos[i]
    return GroupHomomorphismByImagesNC(F,A,epi);
end);

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