/* Eichler v4 Dec. 16, 2010 Corrected bugs in IsHyperelliptic Eichler v3 David Swinarski University of Georgia Nov. 2, 2010 There are three main functions in this package: 1. SurfaceKernelGeneratorsUpToIsomorphism, 2. IsHyperelliptic, 3. Eichler. SurfaceKernelGeneratorsUpToIsomorphism: given a group G such that X/G has genus 0 and the ramification is either [m1,m2,m3] or [m1,m2,m3,m4], this function will first find all possible triangle generators or quadrangle generators, test to see whether they define isomorphic Riemann surfaces, and return one set of triangle/quadrangle generators for each Riemann surface isomorphism class. IsHyperelliptic: given a group G, the genus g of X, and a set of ramification data [m1,m2,...mr], this function tests whether there is an order 2 element in Center(G) with 2g+2 fixed points. If so, X is hyperelliptic. If not, X is not hyperelliptic. Eichler: given a group G, the genus g of X, and a set of triangle or quadrangle generators M=[Phi(c1),Phi(c2),Phi(c3)] or [Phi(c1),Phi(c2),Phi(c3),Phi(c4)], this function will compute the character of the action of G on H^0(C,K) using the Eichler trace formula. Be sure to record the order of the conjugacy classes of G, too, or else the numbers don't mean much! Magma V2.16-11 Tue Nov 2 2010 13:46:47 on dopey [Seed = 833434622] Type ? for help. Type -D to quit. > SmallGroupDatabase(); Small group database (handles layers 1 to 7) > G:=SmallGroup(36,10); > load "eichlerv3.txt"; Loading "eichlerv3.txt" > IsHyperelliptic(G,4,[2,2,2,3]); false > SKG:=SurfaceKernelGeneratorsUpToIsomorphism(G,[2,2,2,3]); > #SKG; 145 > M:=SKG[1]; > M; [ G.1 * G.2 * G.3^2, G.1 * G.4, G.2, G.3^2 * G.4^2 ] > Eichler(G,4,M); ( 4, -2, -2, 0, 1, 1, -2, 1, 1 ) > T:=CharacterTable(G); > chi:=Eichler(G,4,M); > Decomposition(T,chi); [ 0, 0, 0, 0, 1, 0, 1, 0, 0 ] ( 0, 0, 0, 0, 0, 0, 0, 0, 0 ) */ AllSurfaceKernelGenerators:=function(G,O) if #O eq 3 then L1:= { x: x in G | Order(x) eq O[1] }; L2:= { y: y in G | Order(y) eq O[2]}; triples:={@ [x,y,(x*y)^-1 ]: x in L1, y in L2 | Order(sub) eq #G and Order((x*y)^-1) eq O[3]@}; return triples; end if; if #O eq 4 then L1:= { x: x in G | Order(x) eq O[1] }; L2:= { y: y in G | Order(y) eq O[2]}; L3:= { z: z in G | Order(z) eq O[3]}; quadruples:={@ [x,y,z,(x*y*z)^-1 ]: x in L1, y in L2, z in L3 | Order(sub) eq #G and Order((x*y*z)^-1) eq O[4]@}; return quadruples; end if; end function; SurfaceKernelGeneratorsUpToIsomorphism:=function(G,O) if #O eq 3 then T:=Group; ASKG:=AllSurfaceKernelGenerators(G,O); ans:=[ASKG[1]]; K1:=Kernel(hom G | ASKG[1][1],ASKG[1][2],ASKG[1][3]>); for i:=2 to #ASKG do K:=Kernel(hom G | ASKG[i][1],ASKG[i][2],ASKG[i][3]>); if K ne K1 then ans:=Append(ans,ASKG[i]); end if; end for; return ans; end if; if #O eq 4 then T:=Group; ASKG:=AllSurfaceKernelGenerators(G,O); ans:=[ASKG[1]]; K1:=Kernel(hom G | ASKG[1][1],ASKG[1][2],ASKG[1][3],ASKG[1][4]>); for i:=2 to #ASKG do K:=Kernel(hom G | ASKG[i][1],ASKG[i][2],ASKG[i][3],ASKG[i][4]>); if K ne K1 then ans:=Append(ans,ASKG[i]); end if; end for; return ans; end if; end function; /*SurfaceKernelClasses:=function(G,O) L:=SurfaceKernelGeneratorsUpToIsomorphism(G,O); f:=ClassMap(G); if #O eq 3 then tripleclassesonly:={@ [ f(L[i][1]), f(L[i][2]), f(L[i][3]) ]: i in [1..#L] @}; return classes; if #O eq 4 then quadrupleclasses:={@ [ f(L[i][1]), f(L[i][2]), f(L[i][3], f(L[i][4]) ]: i in [1..#L] @}; return quadrupleclasses; end if; end function;*/ FixXuh:= function(G,M,u,h) m:=Order(h); O:=[ Order(M[i]) : i in [1..#M] ]; k:=Order(Centralizer(G,h)); sum:=0; for i:=1 to #M do if IsDivisibleBy(O[i],m) then if IsConjugate(G,h,M[i]^(Round(O[i]*u/m))) then sum:=sum+1/O[i]; end if; end if; end for; return k*sum; end function; //see Breuer Lemma 10.4 page 37 NumberOfFixedPoints:=function(G,M,h) N:=Normalizer(G,sub); m:=Order(h); O:=[ Order(M[i]) : i in [1..#M] ]; k:=Order(N); sum:=0; for i:=1 to #M do if IsDivisibleBy(O[i],m) then if IsConjugate(G,h,M[i]^(Round(O[i]/m))) then sum:=sum+1/O[i]; end if; end if; end for; return k*sum; end function; IsHyperelliptic:=function(G,genus,M) Z:=Center(G); if Order(Z) eq 1 then return false; end if; L:= {@ z : z in Z | Order(z) eq 2 @}; if #L eq 0 then return false; end if; M:={@ z : z in L | NumberOfFixedPoints(G,M,z) eq 2*genus+2 @}; if #M eq 0 then return false; end if; if #M gt 0 then return true; end if; end function; eichlerentry :=function(G,M,h) m:=Order(h); z:=RootOfUnity(m); sum:=1; for u:=1 to m do if GCD(u,m) eq 1 then sum:=sum+FixXuh(G,M,u,h)*(z^u)/(1-z^u); end if; end for; return sum; end function; Eichler:= function(G,genus,M) CCL:=Classes(G); K:=CyclotomicField(#G); ans:=[K!genus]; for i:=2 to #CCL do ans:=Append(ans,K!eichlerentry(G,M,CCL[i][3])); end for; return CharacterRing(G)!ans; end function;