// This Magma script is for trying to prove that there are // no rational points on a curve by showing that all points lift // to an unramified modular double cover, and that none of those // covers has rational points we don't know about. load "analyze.txt"; function fileexists(str) retval := System("test -e " cat str); retval := retval div 256; ret := false; if (retval eq 0) then ret := true; end if; return ret; end function; printf "Determining the subgroups that we're done with.\n"; foundratpoints := []; for n in [1..727] do addval := true; if newsublist[n][5] eq 0 then if fileexists("eq" cat IntegerToString(n) cat ".txt") then addval := false; end if; end if; if newsublist[n][5] eq 1 then filname := "eq" cat IntegerToString(n) cat ".txt"; if fileexists(filname) then model := eval Read(filname); if Rank(model) ge 1 then addval := false; end if; end if; end if; Append(~foundratpoints,addval); end for; subnumlist := [556,558,563,566,618,619,626,628,632,633,634,637,641,649,650,651,654,672,673,674,675,676,677,678,679,680,683,686,687,688,689,690,691,692,693,694,695,706,712,713,714]; psi1 := KroneckerCharacter(-4); psi2 := KroneckerCharacter(8); psi3 := KroneckerCharacter(-8); for subnum in subnumlist do printf "Working on X%o.\n",subnum; unlist := []; commonlev := 0; lvlist := []; for m in [1..#newsublist[subnum][4]] do subgp := newsublist[subnum][4][m][1]; lv := newsublist[subnum][4][m][2]; commonlev := Max(lv,commonlev); Append(~lvlist,lv); gen := newsublist[subnum][5]; if genus2(subgp) eq (2*gen-1) then //printf "Maximal subgroup %o is an unramified double cover.\n",m; Append(~unlist,subgp); end if; end for; printf "We found %o unramified double covers.\n",#unlist; unlist2 := []; for m in [1..#unlist] do if lvlist[m] lt commonlev then Append(~unlist2,liftsub(unlist[m],lvlist[m],commonlev)); else Append(~unlist2,unlist[m]); end if; end for; ints := [ unlist2[m] meet SL(2,Integers(2^commonlev)) : m in [1..#unlist2]]; if &and[ ints[i] eq ints[1] : i in [2..#ints]] then printf "All the unramified double covers are twists of each other.\n"; end if; for m in [2..#unlist2] do twistcheck1 := true; twistcheck2 := true; twistcheck3 := true; genlist := Generators(unlist2[m]); for g in genlist do isinm1 := 0; if (g in unlist2[1]) then isinm1 := 1; else isinm1 := -1; end if; detval := Integers()!Determinant(g); chk1 := Evaluate(psi1,detval); chk2 := Evaluate(psi2,detval); chk3 := Evaluate(psi3,detval); if (isinm1 ne chk1) then twistcheck1 := false; end if; if (isinm1 ne chk2) then twistcheck2 := false; end if; if (isinm1 ne chk3) then twistcheck3 := false; end if; end for; if (twistcheck1 eq true) then printf "Unramified cover %o is a twist of cover 1 by -1.\n",m; end if; if (twistcheck2 eq true) then printf "Unramified cover %o is a twist of cover 1 by 2.\n",m; end if; if (twistcheck3 eq true) then printf "Unramified cover %o is a twist of cover 1 by -2.\n",m; end if; end for; for m in [1..#unlist2] do subs := {}; for mm in [1..subnum-1] do curgp := newsublist[mm][3]; curlv := newsublist[mm][2]; if (commonlev ge Valuation(curlv,2)) then if (Valuation(curlv,2) lt commonlev) then curgp := liftsub(curgp,Valuation(curlv,2),lv); end if; GG := GL(2,Integers(2^lv)); C := SetToSequence(Conjugates(GG,curgp)); //printf "Group %o has %o conjugates.\n",m,#C; for mmm in [1..#C] do if unlist2[m] subset C[mmm] then Include(~subs,mm); end if; end for; end if; end for; chk := false; if &or[ foundratpoints[a] : a in subs] then printf "Unramified cover %o covers %o.\n",m,[ a : a in subs | foundratpoints[a] ]; else printf "We didn't find a subcover of unramified cover %o with finitely many rational points.\n",m; end if; end for; end for;