############################################################################# ## #W basic.gi POLENTA package Bjoern Assmann ## ## Methods for the calculation of ## constructive pc-sequences for polycyclic rational matrix groups ## #Y 2003 ##
############################################################################# ## #F DetermineAdmissiblePrime(gensOfG) ## ## determines a prime number which does not divide the denominators ## of the entries of the matrices in gensOfG and which does not divide the ## the entries of the inverses of the matrices in gensOfG ## ## input is a list of generators of a rational polycyclic matrix group ##
InstallGlobalFunction( DetermineAdmissiblePrime , function(gensOfG)
local d,list1,list2,g,i,j,antiPrime,temp,temp2,p,found;
d := Length( gensOfG[1] );
list1:=[];
list2:=[];
# construct a list of all elements in gensOfG and their inverses for g in gensOfG do
Add(list1,g);
Add(list1,g^-1);
od;
# write denominators of all matrix entries in list for g in list1 do for i in [1..d] do for j in [1..d] do
Add(list2,DenominatorRat(g[i][j]));
od;
od;
od;
antiPrime:=ConsideredPrimes(list2);
# choose a small prime which is not in antiPrime
found:=false;
p:=3; while not found do if not p in antiPrime then
return p; fi;
p:=NextPrimeInt(p);
od; end );
############################################################################# ## #F POL_NormalSubgroupGeneratorsOfK_p(pcgs,gensOfRealG) ## ## pcgs is a constructive pc-Sequence for I_p(G) ## (image of G under the p-congruence hom.). ## This function calculates normal subgroup generators for K_p(G) ## (the kernel of the p-congruence hom.) ##
InstallGlobalFunction( POL_NormalSubgroupGeneratorsOfK_p , function( pcgs, gensOfRealG )
local g, relations, rightSide, leftSide, preimages, revPreimages,
preimage, genList, ftl, n, ro, i, j, exp, conj, f_i, f_j,
r_i, pcSeq;
n := Length(pcgs.gens);
preimages := [];
relations := [];
# catch the trivial case if Length(pcgs.gens)=0then
return gensOfRealG; fi;
# calcuclate all preimages of pcgs.gens for i in [1..n] do
preimage := SubsWord( pcgs.wordGens[i], gensOfRealG );
Add( preimages, preimage);
od;
# Attention: In pcgs.gens we have the pc-sequence in inverse order, # because we built up the structure bottom up
pcSeq := StructuralCopy(Reversed(pcgs.gens));
revPreimages := StructuralCopy(Reversed(preimages));
# calculate the relative orders
ro := RelativeOrdersPcgs_finite( pcgs );
# express the power relations in terms of gensOfRealG for i in [1..n] do
f_i := pcSeq[i];
r_i := ro[i];
exp := ExponentvectorPcgs_finite( pcgs, f_i^r_i );
leftSide := revPreimages[i]^r_i;
rightSide := Exp2Groupelement(revPreimages,exp);
Add(relations,leftSide*(rightSide^-1));
od;
# conjugation relations for i in [1..n] do for j in [1..(i-1)] do
f_i := pcSeq[i];
f_j := pcSeq[j];
conj := (f_j^-1)*f_i*f_j;
exp := ExponentvectorPcgs_finite( pcgs, conj);
leftSide := (revPreimages[j]^-1)*revPreimages[i]*revPreimages[j];
rightSide := Exp2Groupelement(revPreimages,exp);
Add( relations, leftSide*(rightSide^-1));
od;
od;
# Add some other relations, because we changed the generating # set of the image under the p-congruence hom. for i in [1..Length(pcgs.gensOfG)] do
exp := ExponentvectorPcgs_finite( pcgs, pcgs.gensOfG[i]);
rightSide := Exp2Groupelement( revPreimages, exp);
leftSide := gensOfRealG[i];
Add( relations, leftSide*(rightSide^-1));
od;
return relations; end );
############################################################################# ## #F Exp2Groupelement(list,exp) ##
InstallGlobalFunction( Exp2Groupelement, function(list,exp)
local g,i;
g:=list[1]^0; for i in [1..Length(list)] do
g:=g*list[i]^exp[i];
od;
return g; end );
############################################################################# ## #F CopyMatrixList(list) ##
InstallGlobalFunction( CopyMatrixList, function(list)
local i,j,k,list2;
list2:=[]; for i in [1..Length(list)] do
Add(list2,[]); for j in [1..Length(list[i])] do
Add(list2[i],[]); for k in [1..Length(list[i][j])] do
Add(list2[i][j],[]);
list2[i][j][k]:= list[i][j][k];
od;
od;
od;
return list2; end );
############################################################################# ## #F POL_CopyVectorList(list) ##
InstallGlobalFunction( POL_CopyVectorList, function(list)
local i,j,k,list2;
list2:=[]; for i in [1..Length(list)] do
Add(list2,[]); for j in [1..Length(list[i])] do
Add(list2[i],[]);
list2[i][j]:= list[i][j];
od;
od;
return list2; end );
############################################################################# ## #F POL_NormalSubgroupGeneratorsU_p( pcgs_GU, gens, gens_K_p ) ## ## pcgs_GU is a constructive pc-Sequence for G/U, ## this function calculates normal subgroup generators for U_p(G) ##
InstallGlobalFunction( POL_NormalSubgroupGeneratorsU_p , function( pcgs_GU, gens, gens_K_p )
local relations,rightSide,leftSide,preimages,revPreimages,
preimage,genList,ftl,n,ro,i,j,exp,conj,f_i,f_j,r_i,pcs, g, k;
# the elements stored in gens_K_p where found by evaluating # the pcp-relations of G/I_p. So we don't have to calculate them # again. for g in gens_K_p do
exp := ExponentVector_CPCS_FactorGU_p( pcgs_GU, g );
leftSide := g;
rightSide := Exp2Groupelement( pcs, exp );
Add( relations, leftSide*(rightSide^-1) );
od;
# Express the power relations in terms of gens for i in [ (k+1)..n ] do
f_i:=pcs[i];
r_i:=ro[i]; # we have to exclude the case r_i=0 because this means that # the order is equal to infinity if not r_i=0then
exp:=ExponentVector_CPCS_FactorGU_p(pcgs_GU,f_i^r_i);
leftSide:=f_i^r_i;
rightSide:=Exp2Groupelement(pcs,exp);
Add( relations, leftSide*(rightSide^-1) ); fi;
od;
# conjugation relations for i in [ (k+1)..n ] do for j in [1..(i-1)] do
f_i := pcs[i];
f_j := pcs[j];
conj := (f_j^-1)*f_i*f_j;
exp := ExponentVector_CPCS_FactorGU_p( pcgs_GU, conj );
leftSide := (pcs[j]^-1)*pcs[i]*pcs[j];
rightSide := Exp2Groupelement(pcs,exp);
Add( relations, leftSide*(rightSide^-1) );
od;
od;
relations := Filtered( relations,x -> not x=x^0 ); if Length( relations ) = 0then relations[1] := gens[1]^0; fi;
return relations; end );
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.