########################################################################## # well restricted orbit data, as a position in Representations(G) # # for example, well_restricted.17.2 gives the position of the # # well restricted subgroup corresponding to the reflection "t" in G_17 # ########################################################################## well_restricted := rec(5:=rec(1:=4,2:=2),6:=rec(1:=4,2:=2),7:=rec(1:=10,2:=4,3:=2),9:=rec(1:=5,2:=2),10:=rec(1:=5,2:=2),11:=rec(1:=13,2:=5,3:=2),13:=rec(1:=2,2:=6),14:=rec(1:=4,2:=2),15:=rec(1:=7,2:=3,3:=2),17:=rec(1:=6,2:=2),18:=rec(1:=6,2:=2),19:=rec(1:=16,2:=6,3:=2),21:=rec(1:=4,2:=2),26:=rec(1:=2,2:=12),28:=rec(1:=7,2:=5)); ############################################################################### # Field of definition data, as given in tables D.1,D.2 of Lehrer and Taylor # # for example, field_of_def.17 indicates that G_17 is defined over Q(E(20)) # ############################################################################### field_of_def := rec(4:=3,5:=3,6:=12,7:=12,8:=4,9:=8,10:=12,11:=24,12:=8,13:=8,14:=24,15:=24,16:=5,17:=20,18:=15,19:=60,20:=15,21:=60,22:=20,23:=5,24:=7,25:=3,26:=3,27:=15,28:=1,29:=4,30:=5,31:=4,32:=3,33:=3,34:=3,35:=2,36:=2,37:=2); GeneratingFunction := function(STnum,k,z) # STnum: the Shephard-Todd number (4--37) # k: the hyperplane orbit (1 for s, 2 for t, 3 for u) # z: the Galois twist to apply local G,sum,els,ord,rep,rep2,j,i,g,gref,gres,n,m,gresrank,grefrank,twist1,twist2,s,t,q,x,Rx; if not(STnum in Integers) then x := Indeterminate(CyclotomicField(STnum[1])); x.name := "x"; G:=ComplexReflectionGroup(STnum[1],STnum[2],STnum[3]); else x := Indeterminate(CyclotomicField(field_of_def.(STnum))); x.name := "x"; G:=ComplexReflectionGroup(STnum); fi; q := Indeterminate(Rationals); q.name := "q"; Rx := PolynomialRing(Rationals); t := Indeterminate(Rx); t.name := "t"; sum:=[]; els:=ChevieClassInfo(G).classtext; ord:=ChevieClassInfo(G).classes; i:=well_restricted.(STnum).(k); rep:=Representations(G,i); for j in [1..Length(els)] do g:=els[j]; if g=[] then# hack to get identity to be a matrix of the correct size g:=List([1..Order(G,G.1)],s->1); fi; gref:=MatXPerm(G,EltWord(G,g)); gres:=Product(List(g,s->rep[s])); n:=DimensionsMat(gref)[1]; m:=DimensionsMat(gres)[1]; gresrank:=RankMat(IdentityMat(m)-gres); grefrank:=RankMat(IdentityMat(n)-gref); twist1:=DeterminantMat(IdentityMat(n)*x-gref); twist2:=Galois(twist1,z); Append(sum,[[ord[j]*q^(grefrank-gresrank)*(t)^gresrank,twist2,twist1]]); od; return sum; end; Print(GeneratingFunction(5,1,1));