# This file computes additional data that helps to speed up the FindF program. # Specifically, to compute a Mobius-transformation between two rational functions f,g # it helps to know if there exist any non-trivial Mobius-transformations from f to f # (because if not, then there is no need to search over a field extension). # # So for each f in the table, we compute autom(f) = all Mobius-transformations from f to f, # and then store nops(autom(f)) = the number of such Mobius-transformations # into the table along with other data, namely, invariants, the five-point polynomial, # plus (for use for solving differential equations) exponent-differences. # # This code in this file is not very optimized, it takes about 1.5 hours to run. # After that, the data is stored in "AppendData.m" at which point this file is no # longer needed. read AllPrograms: read AllData: # Keep only Belyi and Belyi-(1) maps read in "AllData" that are actually necessary: count5Belyi[infinity,2,3] := count5Belyi[infinity,2,3][1..264]: count5Belyi[infinity,2,4] := count5Belyi[infinity,2,4][1..87]: count5Belyi[infinity,2,6] := count5Belyi[infinity,2,6][1..46]: B1[infinity,2,3] := B1[infinity,2,3][1..65]: # The following program computes Aut(f) = {the set of Mobius transformations m for which f(m) = f}. # If nops(autom(f)) is n = 1,2,3, or 4, then (for f in our table) the Mobius-automorphisms form a # cyclic group, and if it is 6, then the group is the symmetric group S3. # # For each Belyi-(1) map f we verified that all members of f's family (Definition 2.2) have the same set of automorphisms # (there could conceivably be a special value s0 where Aut(f) increases, we verified that this does not happen in our Belyi-(1) tables). # autom := proc(f) local P, i; global x, y; options remember; # Compute irreducible factors of f(x)-f(y): P := evala(Factors(numer(evala(eval(f, x = y) - f)), indets(f, RootOf)))[2]; # Select those that might split over C, and then factor those over C: P := evala(AFactors(mul(IrrProdLines(i[1],x,y), i = P), indets(f, RootOf)))[2]; # Find the linear factors over C, and solve for y: sort([seq(`if`( degree(i[1], y) = 1, solve(i[1], y), NULL), i = P)], length) end: # # Input: an irreducible polynomial f. # Output: if (over the algebraic closure of the constants), f might be a product of degree 1 factors w.r.t. y, then f, and if this is provably not so, then 1. IrrProdLines := proc(f,x,y) local d,i,S,D; d := degree(f,y); if d=1 then return f elif d=0 or {degree(f,x), degree(f,{x,y})} mod d <> {0} then return 1 fi; S := NULL; for i from 0 while nops([S])<2 do D := evala(discrim(eval(f,x=i),y)); if D<>0 then S := S,D fi od; if member(1, [seq(degree(i[1],x), i=evala(Factors(S[1]*x^2 - S[2], indets([args],RootOf)))[2])]) and (degree(f,{x,y})=ldegree(f,{x,y}) or algcurves[genus](f,x,y) = 1-d) then f else 1 fi end: # The following program adds data that is needed for Section 8 in the paper (solving differential equations). # # It computes the list of exponent differences of a differential operator obtained by applying the # change of variable x --> f on GHE with exponent differences given by reciprocals of A. # It then returns the sorted list of denominators of those exponent-differences, discarding those # coming from "removable singularities" # DenomExpDiff:= proc(f, x, A::list) local B,i,j; B := BranchPattern(f,x); B := [seq(seq(j/A[i], j=B[i]),i=1..3)]; sort( [seq(`if`(type(i,posint), NULL, denom(i)), i=B)] ) end: AppendDataB := proc(f,x,A) local i,p; p := FivePointPolynomial(f,x,A); i := I5(p,x); p, i, MinPolyOverQ(i,x), DenomExpDiff(args) end: AppendDataB1 := proc(f,x,A) local p; p := FivePointPolynomial(f,x,A); p, I5(p,x), I5tilde(p,x), DenomExpDiff(args) end: MinPolyOverQ := proc(a,x) sqrfree(evala(Norm(x-a)),x)[2][1][1] end: lprint("Computing invariants"); for m in [3,4,6] do A := [infinity,2,m]; lprint(cat("Computing invariant, and minpoly, for entries of Belyi", convert(A,string), " ....")); count5Belyi[op(A)] := [seq([f, AppendDataB(f,x,A), nops(autom(f))], f = count5Belyi[op(A)])]; lprint(cat("Computing invariants for entries of Belyi-(1)", convert(A,string), " ....")); count5B1[op(A)] := [seq([f, AppendDataB1(f,x,A), nops(autom(f))], f = B1[op(A)])]; od: lprint("Saving the computed invariants so they need not be computed next time"); save(count5Belyi, count5B1, "AppendData.m");