\\ This pari file gives a certificate that odd spin components of minimal strata \\ are of general type for g>=13 running up in a few minutes up to g=18. \\ For larger g certificates are given by then complementary program 'onezerostrata'. \\ This program loops over all partitions giving the distributions of prongs. \\ This is slow, but allows to easily program the special cases of D_NC \\ given by Proposition 5.13 allocatemem() allocatemem() allocatemem() allocatemem() allocatemem() allocatemem() default(breakloop,0) default(format, "g0.12") \\ minmax of possibly empty vector, value arbitrary, of correct sign. vectmin(v) = if(length(v)==0,10,vecmin(v)) vectmax(v) = if(length(v)==0,-10,vecmax(v)) \\ This creates a list of all partitions, their lcm's and their sum of reciprocals \\ To test the general type conditions up to a given genus g, set M=2g-2 # M = 34; \\ with this M all strata up to g=18 can be checked in less than a minute on an average laptop \\ Partitions. {PP=vector(M); MM=matrix(M,M,m,n,[]); \\ PP[n] is {partitions of n}, MM[n,j] = {partitions with largest part j} for(n=1,M,MM[n,n]=[[n]]; for(j=1,n-1,w=[];for(k=1,j,w=concat(w,MM[n-j,k]);MM[n,j]=vector(length(w),i,concat(j,w[i]))))); for(n=1,M,w=[];for(j=1,n,w=concat(w,MM[n,j]));PP[n]=w); print("partitions calculated up to M = ",M)} \\ time 2 seconds PPsort = []; for(n=1,M,w=vector(n,i,[]);for(j=1,length(PP[n]),p0=PP[n][j]; lp = length(p0); w[lp]=concat(w[lp],[p0]));PPsort=concat(PPsort,[w])); \\ time 32 seconds (for M=40) PPlcm = []; for(n=1,M,wj = []; for(j=1,length(PPsort[n]),wjk = []; for(k=1,length(PPsort[n][j]), wjk = concat(wjk,[lcm(PPsort[n][j][k])]);); wj = concat(wj,[wjk])); PPlcm = concat(PPlcm,[wj])); \\ time 3 seconds PPinv= []; for(n=1,M,wj = []; for(j=1,length(PPsort[n]),wjk = []; for(k=1,length(PPsort[n][j]), wjk = concat(wjk,[sum(l=1,length(PPsort[n][j][k]),1/PPsort[n][j][k][l])];)); wj = concat(wj,[wjk])); PPinv = concat(PPinv,[wj])); \\ time 8 seconds \\ Standard variables specialized to the minimal stratum. Minv = 1/(2*g-1); Mt = 0; Mtinv = 0; nt = 0; \\ graphs in the minimal stratum do not have legs on top level. kmu=4*g*(g-1)/(2*g-1); N=2*g; teta=kmu/8; ktop=Mt+nt-Mtinv+p-pinv; Ntop=ktop+vt+Mtinv+pinv; Nbot=N-Ntop; tetabot= (kmu-ktop)/8+(p-pinv)/8; wla = (12 + kmu/2)/kmu; \\ w_\lambda \\ classes of the Brill-Noether-type divisors in the format \\ [\lambda, Dhcoefficient, \Delta_irr coefficient, compact type coefficient] \\ where ct needs to be substitued as ct = i*(g-i) BN =[6,-(g+1)/(g+3),-(g+1)/(g+3),-6*ct/(g+3)]; Hur=[6,-(3*g^2+12*g-6)/(g+8)/(3*g-1),-(3*g^2+12*g-6)/(g+8)/(3*g-1),-6*ct*(3*g+4)/(g+8)/(3*g-1)]; psi1=1/kmu/(2*g-1)*[12,-1,ktop,ktop]; W=[-1,0,0,o]+(g+1)*g/2*psi1; NF=2*(g+3)/(g+1)/(g-2)*(BN+12/(g+3)/(g+2)*W); NF=6/NF[1]*NF; \\ upper bound for y for which it is valid to replace the compact type \\ edges by non-compact type for graphs that are not VDB (i.e. nctInterval). \\ We have to compare the larger CT-contribution in BN/Hur/Nfold against \\ the larger D_NC-term for 'other compact type'. \\ In the NCT case we need to work with R=0 as lower bound of 1/E. {CTpol(sg) = if(sg%2==0,NCT=-2*(1-y)*Hur[3]-kmu/N/2,NCT=-2*(1-y)*BN[3]-0*kmu/N/2); if(sg%2==0,CT=-2*(1-y)*subst(Hur[4],ct,sg-1)-2*kmu/N,CT=-2*(1-y)*subst(BN[4],ct,sg-1)-2*kmu/N); pol = subst(CT-NCT,g,sg); return(pol); } {CTupperbd(sg) = pol = CTpol(sg); return(-polcoeff(pol,0,y)/polcoeff(pol,1,y)); } \\for(gg=13,18,print("g=",gg," gives upper bound ", CTupperbd(gg)*1.)) g=13 gives upper bound 0.735172413793 \\ this is not good enough, since D_h implies y >= 0.778909090909 g=14 gives upper bound 0.770456503015 g=15 gives upper bound 0.744421906694 g=16 gives upper bound 0.780271154745 g=17 gives upper bound 0.751359751360 g=18 gives upper bound 0.787923230129 \\ second version: assuming that the genera after contracting all \\ but the compact type edge are not (1,g-1): {CTupperbd2(sg) = if(sg%2==0,NCT=-2*(1-y)*Hur[3]-kmu/N/2,NCT=-2*(1-y)*BN[3]-0*kmu/N/2); if(sg%2==0,CT=-2*(1-y)*subst(Hur[4],ct,2*(sg-2))-2*kmu/N,CT=-2*(1-y)*subst(BN[4],ct,2*(sg-2))-2*kmu/N); pol = subst(CT-NCT,g,sg); return(-polcoeff(pol,0,y)/polcoeff(pol,1,y)); } \\for(gg=13,18,print("g=",gg," gives upper bound ", CTupperbd2(gg)*1.)) \\g=13 gives upper bound 0.869830508475 \\g=14 gives upper bound 0.889096962131 \\g=15 gives upper bound 0.875862068966 \\g=16 gives upper bound 0.894794438779 \\g=17 gives upper bound 0.880284324729 \\g=18 gives upper bound 0.899138896065 \\This imposes not constraints on the values for y given below. fwithtopodd = kmu/N*(Nbot-R)-(kmu-ktop)-(1-y)*2*pinv*BN[3]+12/wla*y*( (kmu-ktop)*(1/kmu+1/8)-tetabot+(p-pinv)/8+(vt-1)/2); fwithtopeven = kmu/N*(Nbot-R)-(kmu-ktop)-(1-y)*2*pinv*Hur[3]+12/wla*y*( (kmu-ktop)*(1/kmu+1/8)-tetabot+(p-pinv)/8+(vt-1)/2); \\ using Nfold {fwithtopevenNfold = kmu/N*(Nbot-R)-(kmu-ktop)+(1-y)*2*(pinv*(g^2 + g - 2)/(g^2 + 3*g - 1) + 3/(2*g^2 + 6*g - 2)*ktop*(-1)) + 12/wla*y*( (kmu-ktop)*(1/kmu+1/8)-tetabot+(p-pinv)/8+(vt-1)/2);} ctwithtopodd = kmu/N*(Nbot-R)-(kmu-ktop)-(1-y)*2*pinv*subst(BN[4],ct,gtop*(g-gtop))+12/wla*y*( (kmu-ktop)*(1/kmu+1/8)-tetabot+(p-pinv)/8+(vt-1)/2); ctwithtopeven = kmu/N*(Nbot-R)-(kmu-ktop)-(1-y)*2*pinv*subst(Hur[4],ct,gtop*(g-gtop)) + 12/wla*y*( (kmu-ktop)*(1/kmu+1/8)-tetabot+(p-pinv)/8+(vt-1)/2); \\ using Nfold divisor: ctwithtopevenNfold = kmu/N*(Nbot-R)-(kmu-ktop)+(1-y)*2*pinv*(6*gtop*g^2 - 6*gtop^2*g + (6*gtop^2 - 6*gtop))/(g^2 + 3*g - 1)+12/wla*y*( (kmu-ktop)*(1/kmu+1/8)-tetabot+(p-pinv)/8+(vt-1)/2); sGamODD = subst(fwithtopodd,vt,vt); sGamEVEN = subst(fwithtopeven,vt,vt); sGamEVENNfold = subst(fwithtopevenNfold,vt,vt); ctGamODD = subst(ctwithtopodd,vt,1); ctGamEVEN = subst(ctwithtopeven,vt,1); ctGamEVENNfold = subst(ctwithtopevenNfold,vt,1); shorODD = (-1-kmu/N) + (2-2*y)*(g+1)/(g+3) + y*12*(1+teta)/(12+12*teta-kmu); \\ using the Hurwitz divisor: shorEVEN= (-1-kmu/N) + (2-2*y)*(3*g^2+12*g-6)/(g+8)/(3*g-1) + y*12*(1+teta)/(12+12*teta-kmu); \\ using the Nfold divisor: shorEVENNfold= (-1-kmu/N) + (2-2*y)*(2*g^2+2*g-1)/(2*g^2 + 6*g -2) + y*12*(1+teta)/(12+12*teta-kmu); \\ bounds given by D_hor: In fact only lower bounds, i.e. 'neg' will be an empty list. {horPolys(sg) = local(pos,neg,d0,d1); pos = []; neg =[]; shor = if(sg ==12 || sg ==14, subst(shorEVENNfold,g,sg), if(sg % 2 == 1, subst(shorODD,g,sg), subst(shorEVEN,g,sg))); d1 = polcoeff(shor,1,y); d0 = polcoeff(shor,0,y); if(d1 > 0, nst = -d0/d1; pos = concat(pos, nst), if(d1<0, nst = -d0/d1; neg = concat(neg, nst), if(d0<0, print("Error: const poly, neg coeff")))); return([pos,neg]); } \\ This version is valid for y with upper bound given by CTbound \\ It only works for g>=14, but it is ~ a factor g faster than \\ nctPolys2 since there is no loop over etop. {nctPolys1(sg) = local(pos,neg,d0,d1); pos = []; neg =[]; snct = if(sg ==12 || sg ==14, subst(fwithtopevenNfold,g,sg), if(sg % 2 == 1, subst(fwithtopodd,g,sg), subst(fwithtopeven,g,sg))); for(gtop =1,sg,for(E=2,sg-gtop+1, l = length(PPsort[2*gtop-2+E][E]); for(i=1,l, ell = PPlcm[2*gtop-2+E][E][i]; spinv = PPinv[2*gtop-2+E][E][i]; for(vtop = 1, min(gtop,E), \\ a bit rough: no ct edges \\ this implements the D_NC-improvement given by Remark 5.12 snct2 = subst(subst(subst(subst(snct, R, (vt-1)+if(gtop==sg-E+1, \\ case RMB if(vtop==1 && PPsort[2*gtop-2+E][E][i][1]==2*gtop-2+1 && 2*gtop-2+1 >=2*E-3, 1/ell, \\ case [p,1,...1] if(vtop==1 && PPsort[2*gtop-2+E][E][i][1]==2*gtop-2 && 2*gtop-2 >=2*E-2, 1/ell, \\ case [p,2,1,...,1] if(vtop==1 && PPsort[2*gtop-2+E][E][i][length(PPsort[2*gtop-2+E][E][i])]==1 && PPsort[2*gtop-2+E][E][i][1]>7,pinv/(E+1)))), pinv/E) \\ if(gtop....) ),pinv,spinv),p,2*gtop-2+E),vt,vtop); \\ end definition of snct2 d1 = polcoeff(snct2,1,y); d0 = polcoeff(snct2,0,y); if(d1 > 0, nst = -d0/d1; pos = concat(pos, nst), if(d1<0, nst = -d0/d1; \\if(nst < 0.76, print("Bad case: gtop=",gtop, " E=",E, " Pronglist=", PPsort[2*gtop-2+E][E][i], " and Pinv="1.*PPinv[2*gtop-2+E][E][i], " gives zero at y=",1.*nst, " fullpoly=",snct2)); neg = concat(neg, nst), if(d0<0,print("Error: const poly, neg coeff")))); )))); return([pos,neg]); } \\ This version is valid for y with upper bound given by CTbound2 \\ It covers the case g=13 (and also the other cases), but needs more time. {nctPolys2(sg) = local(pos,neg,d0,d1); pos = []; neg =[]; snct = if(sg ==12 || sg ==14, subst(fwithtopevenNfold,g,sg), if(sg % 2 == 1, subst(fwithtopodd,g,sg), subst(fwithtopeven,g,sg))); for(gtop =1,sg,for(E=2,sg-gtop+1, for(vtop = 1, min(gtop,E), for(etop = 0, vtop - 1, \\ vertices with compact type and g=1, not covered by CTupperbd2 ER = E - etop; \\ remaining edges l = length(PPsort[2*gtop-2+ER][ER]); for(i=1,l, ell = PPlcm[2*gtop-2+ER][ER][i]; spinv = etop + PPinv[2*gtop-2+ER][ER][i]; \\ this implements the D_NC-improvement given by Remark 5.12 \\ the etop-edges are not needed for the case disctinction, since they contribute prongs 1,1,...,1. snct2 = subst(subst(subst(subst(snct, R, (vt-1)+if(gtop==sg-E+1, \\ case RMB if(vtop==1 && PPsort[2*gtop-2+ER][ER][i][1]==2*gtop-2+1 && 2*gtop-2+1 >=2*E-3, 1/ell, \\ case [p,1,...1] if(vtop==1 && PPsort[2*gtop-2+ER][ER][i][1]==2*gtop-2 && 2*gtop-2 >=2*E-2, 1/ell, \\ case [p,2,1,...,1] if(vtop==1 && PPsort[2*gtop-2+ER][ER][i][length(PPsort[2*gtop-2+ER][ER][i])]==1 && PPsort[2*gtop-2+ER][ER][i][1]>7,pinv/(E+1)))), pinv/E) \\ if(gtop....) ),pinv,spinv),p,2*gtop-2+E),vt,vtop); \\ end definition of snct2 snct2 += etop*CTpol(sg); d1 = polcoeff(snct2,1,y); d0 = polcoeff(snct2,0,y); if(d1 > 0, nst = -d0/d1; pos = concat(pos, nst), if(d1<0, nst = -d0/d1; \\if(nst < 0.76, print("Bad case: gtop=",gtop, " E=",E, " Pronglist=", PPsort[2*gtop-2+E][E][i], " and Pinv="1.*PPinv[2*gtop-2+E][E][i], " gives zero at y=",1.*nst, " fullpoly=",snct2)); neg = concat(neg, nst), if(d0<0,print("Error: const poly, neg coeff")))); ))))); return([pos,neg]); } \\ compact type graphs with one top level vertex of arbitrary genus, \\ (In all other cases we may treat the edges as non-compact type thanks \\ to the bound CTbound2 (or CTbound1 for g>=14) and those cases are covered \\ by nctPolys2 (or nctPolys1 for g=13) {compPolys(sg)= local(pos,neg,d0,d1); pos = []; neg =[]; sct = if(sg ==12 || sg ==14, subst(ctGamEVENNfold,g,sg), if(sg % 2 == 1, subst(ctGamODD,g,sg), subst(ctGamEVEN,g,sg))); for(sgtop =1,sg-1, ell = 2*sgtop-1; spinv = 1/ell; sct2 = subst(subst(subst(subst(sct, R, (2+2*(sgtop==1))*pinv + 1/ell),pinv,spinv),p,2*sgtop-1),gtop,sgtop); d1 = polcoeff(sct2,1,y); d0 = polcoeff(sct2,0,y); if(d1 > 0, nst = -d0/d1; pos = concat(pos, nst), if(d1<0, nst = -d0/d1; neg = concat(neg, nst), if(d0<0,print("Error: const poly, neg coeff"))));); return([pos,neg]); } /* ll = 6; start = 12; {for(gg=start, start+ll, hg = horPolys(gg); ctg = compPolys(gg); if(gg <= 13, nctg = nctPolys2(gg), nctg = nctPolys1(gg)); lb = vectmax([vectmax(hg[1]),vectmax(ctg[1]),vectmax(nctg[1])]); ub = vectmin([vectmin(hg[2]),vectmin(ctg[2]),vectmin(nctg[2])]); print(gg, " gives ",1.*lb, " to ", 1.*ub);)} */ /* 12 gives 0.911561264822 to 0.808521588239 13 gives 0.778909090909 to 0.782740920097 14 gives 0.672039072039 to 0.680693555114 15 gives 0.594164456233 to 0.730928653320 16 gives 0.634667703070 to 0.663378242280 17 gives 0.474747474747 to 0.681694832781 18 gives 0.543867595819 to 0.622683150643 */