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

Quelle  sl.gi   Sprache: unbekannt

 
#  File converted from Magma code -- requires editing and checking
#  Magma -> GAP converter, version 0.5, 11/5/18 by AH

InstallGlobalFunction(SLGenerators@,function(d,q)
local MA,S,V,e,f,i,p;
  if d=2 then
    #p:=PrimeBase(q);
    p:=Factors(q)[1];
    e:=LogInt(q,p);
    if q<>p^e then Error("<q> is not a prime power");fi;
    return SL2Generators@(p,e);
  fi;
  S:=ShallowCopy(ClassicalStandardGenerators("SL",d,q:
    PresentationGenerators:=false));
  f:=GF(q);
  V:=NullMat(d,d,f);
  for i in [1..d-1] do
    V[i][i+1]:=One(f);
  od;
  V[d][1]:=(-One(f))^(d-1);
  V:=ImmutableMatrix(f,V);
  S[2]:=V;
  S[4]:=S[4]^-1;
  return S;
end);

#   presentation for extension of direct product of
#   d - 1 copies of Z_{q - 1} by a copy of Sym (d)
BindGlobal("PresentationForN@",function(d,q)
local F,OMIT,R,Rels,S,U,V,delta,tau;
  F:=FreeGroup("U","V","delta");
  F:=Group(StraightLineProgGens(GeneratorsOfGroup(F)));
  U:=F.1;
  V:=F.2;
  delta:=F.3;
  if IsEvenInt(q) then
    R:=PresentationForSn@(d);
    S:=FreeGroupOfFpGroup(R);
    R:=RelatorsOfFpGroup(R);
  else
    R:=SignedPermutations@(d);
    S:=FreeGroupOfFpGroup(R);
    R:=RelatorsOfFpGroup(R);
  fi;
  tau:=GroupHomomorphismByImages(S,F,GeneratorsOfGroup(S),[U,V]);
  R:=List(R,r->ImagesRepresentative(tau,r));
  Rels:=[];
  if d > 3 then
    Add(Rels,Comm(delta,U^(V^2)));
  fi;
  if d > 4 then
    Add(Rels,Comm(delta,V*U*U^V));
  fi;
  Add(Rels,delta*delta^V/delta^(V*U));
  Add(Rels,Comm(delta,delta^V));
  if d > 3 then
    Add(Rels,Comm(delta,delta^(V^2)));
  fi;
  OMIT:=true;
  if not OMIT then
    Add(Rels,delta^U/delta^-1);
    if IsEvenInt(q) then
      Add(Rels,delta^(q-1));
    else
      Add(Rels,delta^(QuoInt((q-1),2))/U^2);
    fi;
  fi;
  Rels:=Concatenation(Rels,R);
  return F/Rels;
end);

#SL_Order_NSubgroup:=function(d,q)
#  return (q-1)^(d-1)*Factorial(d);
#end;

#   return presentation for SL(d, q)
BindGlobal("SLPresentation@",function(d,q)
local F,I,R1,R2,Rels,S,U,V,a,b,delta,e,f,p,phi,tau,w,wm1;
  Assert(1,d > 2);
  #p:=PrimeBase(q);
  p:=Factors(q)[1];
  e:=LogInt(q,p);
  if q<>p^e then Error("<q> is not a prime power");fi;
  F:=FreeGroup("U","V","tau","delta");
  F:=Group(StraightLineProgGens(GeneratorsOfGroup(F)));
  U:=F.1;
  V:=F.2;
  tau:=F.3;
  delta:=F.4;
  Rels:=[];
  #   we don't need delta if e = 1 but it makes presentation consistent for all
  #  q
  if e=1 then
    w:=PrimitiveElement(GF(p));
    a:=Int(w-w^2);
    b:=Int(w-1);
    wm1:=Int(w^-1);
    Add(Rels,delta^-1*(tau^a)^U*tau^(wm1)*(tau^b)^U*tau^-1);
  fi;
  if IsPrimeInt(q) then
    if q=2 then
      R1:=PresentationForSn@(d);
      S:=FreeGroupOfFpGroup(R1);
      R1:=RelatorsOfFpGroup(R1);
    else
      R1:=SignedPermutations@(d);
      S:=FreeGroupOfFpGroup(R1);
      R1:=RelatorsOfFpGroup(R1);
    fi;
    phi:=GroupHomomorphismByImages(S,F,GeneratorsOfGroup(S),[U,V]);
  else
    R1:=PresentationForN@(d,q);
    S:=FreeGroupOfFpGroup(R1);
    R1:=RelatorsOfFpGroup(R1);
    phi:=GroupHomomorphismByImages(S,F,GeneratorsOfGroup(S),[U,V,delta]);
  fi;
  R1:=List(R1,r->ImagesRepresentative(phi,r));
  R2:=PresentationForSL2@(p,e:Projective:=false);
  S:=FreeGroupOfFpGroup(R2);
  R2:=RelatorsOfFpGroup(R2);
  if e=1 then
    phi:=GroupHomomorphismByImages(S,F,GeneratorsOfGroup(S),[tau,U]);
  else
    phi:=GroupHomomorphismByImages(S,F,GeneratorsOfGroup(S),[delta,tau,U]);
  fi;
  R2:=List(R2,r->ImagesRepresentative(phi,r));
  #   centraliser of tau
  if d > 3 then
    Add(Rels,Comm(tau,U^(V^2)));
  fi;
  if d > 4 then
    if e > 1 then
      Add(Rels,Comm(tau,V*U*U^V));
    else
      Add(Rels,Comm(tau,V*U^-1*(U^-1)^V));
    fi;
  fi;
  if e > 1 then
    Add(Rels,Comm(tau,delta*(delta^2)^V));
    if d > 3 then
      Add(Rels,Comm(tau,delta^(V^2)));
    fi;
  fi;
  #   Steinberg relations
  Add(Rels,Comm(tau,tau^V)/tau^(U^V));
  Add(Rels,Comm(tau,tau^(U^V)));
  Add(Rels,Comm(tau,tau^(U*V)));
  if d > 3 then
    Add(Rels,Comm(tau,tau^(V^2)));
  fi;
  #   one additional relation needed for this special case
  if d=3 and q=4 then
    Add(Rels,Comm(tau,tau^(delta*V))/tau^(delta*U^V));
    #   Append (~Rels, (tau, tau^(delta * U^V)) = 1);
    #   Append (~Rels, (tau, tau^(delta * U * V)) = 1);
  fi;
  Rels:=Concatenation(Rels,R1,R2);
  return F/Rels;
end);

#  ///////////////////////////////////////////////////////////////////////
#     Short presentation for SL(d, q)                                   //
#                                                                       //
#     Input two parameters to compute this presentation of SL(d, q)     //
#       d = dimension                                                   //
#       q = field order                                                 //

#     November 2017
#  ///////////////////////////////////////////////////////////////////////

#   construct generator of centre as SLP in presentation generators
BindGlobal("SLGeneratorOfCentre@",
function(d,q,W)
local U,V,delta,m,z;
  Assert(1,d > 2);
  m:=QuoInt((d-1)*(q-1),Gcd(d,q-1));
  U:=W.1;
  V:=W.2;
  delta:=W.4;
  z:=(delta*U*V^-1)^m;
  return z;
end);

#   express presentation generators as words in standard generators 
BindGlobal("SLStandardToPresentation@",
function(d,q)
local P,S,U,V,V_p,delta,tau;
  S:=FreeGroup("U","V","tau","delta");
  S:=Group(StraightLineProgGens(GeneratorsOfGroup(S)));
  if d=2 then
    if IsPrimeInt(q) then
      P:=[S.3,S.2,One(S),One(S)];
    else
      P:=[S.4^-1,S.3,S.2,One(S)];
    fi;
    return P;
  fi;
  U:=S.1;
  V:=S.2;
  tau:=S.3;
  delta:=S.4;
  if IsOddInt(d) and IsOddInt(q) then
    V_p:=V^-1*(U^-1*V)^(d-1);
  else
    V_p:=V^(d-1);
  fi;
  return [U,V_p,tau,delta^-1];
end);

#   express standard generators as words in presentation generators 
BindGlobal("SLPresentationToStandard@",
function(d,q)
local I,P,S,U,V,V_s,delta,tau,w,x,y;
  if d=2 then
    if IsPrimeInt(q) then
      P:=FreeGroup(2);
      P:=Group(StraightLineProgGens(GeneratorsOfGroup(P)));
      w:=PrimitiveElement(GF(q));
      x:=Int(w^-1)-1;
      y:=Int(w^-2-w^-1);
      U:=P.2;
      tau:=P.1;
      delta:=(tau^-1*(tau^x)^U*tau^(Int(w))*(tau^-y)^U)^-1;
      S:=[P.2,P.2,P.1,delta];
    else
      P:=FreeGroup(3);
      P:=Group(StraightLineProgGens(GeneratorsOfGroup(P)));
      S:=[P.3,P.3,P.2,P.1^-1];
    fi;
    return S;
  fi;
  P:=FreeGroup(4);
  P:=Group(StraightLineProgGens(GeneratorsOfGroup(P)));
  U:=P.1;
  V:=P.2;
  tau:=P.3;
  delta:=P.4;
  if IsOddInt(d) and IsOddInt(q) then
    V_s:=(V*U^-1)^(d-1)*V^-1;
  else
    V_s:=V^(d-1);
  fi;
  return [U,V_s,tau,delta^-1];
end);

#   relations are on presentation generators;
#  convert to relations on 4 standard generators 
BindGlobal("SLConvertToStandard@",
function(d,q,Rels)
local A,B,C,T,U,W,tau,gens;
  A:=SLStandardToPresentation@(d,q);
  # was "Rels:=Evaluate(Rels,A);"
  gens:=GeneratorsOfGroup(FamilyObj(Rels)!.wholeGroup);
  Rels:=List(Rels, w -> MappedWord(w, gens, A));
  B:=SLPresentationToStandard@(d,q);
  # was "C:=Evaluate(B,A);"
  gens:=GeneratorsOfGroup(FamilyObj(B)!.wholeGroup);
  C:=List(B, w -> MappedWord(w, gens, A));
  U:=FamilyObj(C)!.wholeGroup;
  W:=FamilyObj(Rels)!.wholeGroup;
  tau:=GroupHomomorphismByImages(U,W,
    GeneratorsOfGroup(U),GeneratorsOfGroup(W));
  T:=List([1..Length(GeneratorsOfGroup(W))],
    i->W.(i)^-1*ImagesRepresentative(tau,C[i]));
  Rels:=Concatenation(Rels,T);
  return W/Rels;
end);

InstallGlobalFunction(Internal_StandardPresentationForSL@,function(d,K)
#  -> ,GrpSLP ,[ ,]  return standard presentation for SL ( d , K ) ; if
#  projective , then return standard presentation for PSL ( d , K )
local P,Presentation,Projective,R,Rels,S,e,p,q,z;
  Presentation:=ValueOption("Presentation");
  if Presentation=fail then
    Presentation:=false;
  fi;
  Projective:=ValueOption("Projective");
  if Projective=fail then
    Projective:=false;
  fi;
  if not d > 1 then
    Error("Degree must be at least 2");
  fi;

  if IsInt(K) then
    if not IsPrimePowerInt(K) then
      Error("<q> must be a prime power");
    fi;
    q:=K;
    K:=GF(q);
  else
    if not IsField(K) and IsFinite(K) then 
      Error("<K> must be a finite field");
    fi;
    q:=Size(K);
  fi;

  p:=Characteristic(K);
  e:=LogInt(Size(K),p);
  if d=2 then
    R:=PresentationForSL2@(p,e:Projective:=Projective);
    P:=FreeGroupOfFpGroup(R);
    R:=RelatorsOfFpGroup(R);
  else
    R:=SLPresentation@(d,q);
    P:=FreeGroupOfFpGroup(R);
    R:=RelatorsOfFpGroup(R);
    if Projective and Gcd(d,q-1) > 1 then
      z:=SLGeneratorOfCentre@(d,q,P);
      R:=Concatenation(R,[z]);
    fi;
  fi;
  if Presentation then
    return P/R;
  fi;
  Rels:=SLConvertToStandard@(d,q,R);
  P:=FreeGroupOfFpGroup(Rels);
  Rels:=RelatorsOfFpGroup(Rels);
  Rels:=Filtered(Rels,w->w<>w^0);
  return P/Rels;
end);


[ Dauer der Verarbeitung: 0.25 Sekunden  (vorverarbeitet)  ]