// This is the MAGMA file accompanying the paper 'On the arithmetic of a family of degree two K3 surfaces'. // In here one can find the codes that are complementary to the proofs // in the thesis. // In the code, the surface X_eta will be here denoted with S // In order to perform any part of the code, // is often require to run also some previous parts. // To avoid errors we therefore encourage to run the code from the very beginning to // the desired point. /***************************************************************/ /* */ /* Proof of Remark 2.15 */ /* */ /***************************************************************/ QQ:=Rationals(); Pol:=PolynomialRing(QQ,7); Polt:=PolynomialRing(Pol); P2:=PolynomialRing(Polt,3); f:=x^6+y^6+z^6+D*x^2*y^2*z^2; fg:=Evaluate(f,[-b*t-c,t,1]); sq:=(a0*t^3+a1*t^2+a2*t+a3)^2; df:=fg-sq; Coeff:=Coefficients(df); I:=Ideal([Pol!g : g in Coeff]); 1 in I; GB:=GroebnerBasis(I); Polw:=PolynomialRing(QQ); n:=#GB; h:=GB[n]; h:=Polw!Evaluate(h,[0,0,0,0,0,0,w]); h; Factorisation(h); K1:=CyclotomicField(3); Roots(h,K1); /***************************************************************/ /* */ /* End of proof of Remark 2.15 */ /* */ /***************************************************************/ // We define the field of definition of the geometric Picard lattice of X_eta, denoted by L, // together with the weighted projective space PP_L and // the surface itself preK:=CyclotomicField(12); zeta3:=zeta12^4; zeta4:=zeta12^3; zeta6:=zeta12^2; K:=FunctionField(preK); R:=PolynomialRing(K,3); K1:=quo; S:=PolynomialRing(K1); L:=quo; delta:=4*zeta4*b0*b1*b2; eps:=delta/(c0*(3*c0+2*t)); c1:=(-t-c0+eps)/2; c2:=-t-c0-c1; assert c2 eq (-t-c0-eps)/2; PT:=ProjectiveSpace(L,[1,1,1,3]); T:=CoordinateRing(PT); fS:=x^6+y^6+z^6+t*x^2*y^2*z^2-w^2; S:=Scheme(PT,fS); // In order to compute the Gram matrix, we will need // to perform some computations over a finite field FF_p^n. // Let L_t0 be the number field given by specialising L to t=t0=7. // One can see that p=79 is a prime of good reduction for X_7. // Let pp be a prime of L,t0 lying above p=79, // then the residue field of pp is FF_{79^2}. p:=79; F:=GF(p^2); tp:=F!7; Pol:=PolynomialRing(F); zeta12p:=Roots(v^12-1)[12][1]; zeta6p:=zeta12p^2; zeta4p:=zeta12p^3; zeta3p:=zeta12p^4; h:=v^3+tp*v^2+4; cp:=Roots(h); c0p:=cp[1][1]; c1p:=cp[2][1]; c2p:=cp[3][1]; _,b0p:=IsSquare(3+tp); _,b1p:=IsSquare(3*zeta3p+tp); _,b2p:=IsSquare(3*zeta3p^2+tp); PP:=ProjectiveSpace(F,[1,1,1,3]); PPW:=CoordinateRing(PP); // We define the reduction maps mod p // namely the reduction map of fields and polynomial rings. // and also the reduction of S mod p. // Using these maps we define the reduction mod p=79 // of X_7. prePsi:=homF | zeta12p>; Psi:=homF| prePsi, tp>; Psi1:=homF | Psi, [b0p,b1p,b2p]>; Psi2:=homF | Psi1, c0p>; PsiP:=homPPW | Psi2, [X,Y,Z,W]>; assert Psi2(c1) eq c1p; assert Psi2(c2) eq c2p; fSp:=PsiP(fS); Sp:=Scheme(PP,fSp); // We define the subgroup H of the automorphism of X_eta Var:={x,y,z}; Perm:=Permutations(Var); idT:=homT | x,y,z,w>; pxy:=homT | y,x,z,w>; pxyz:=homT | y,z,x,w>; p105:=homT | zeta6*x,y,zeta6^(-1)*z,w >; p015:=homT | x,zeta6*y,zeta6^(-1)*z,w >; p003:=homT | x,y,-z,w >; genH:=[pxy,pxyz,p105,p015,p003]; S3:=[hom T | perm[1],perm[2],perm[3],w> : perm in Perm]; C2a:=[idT,p003]; C6a:=[homT | zeta6^i*x, y, zeta6^(-i)*z,w >: i in [0..5]]; C6b:=[homT | x, zeta6^i*y, zeta6^(-i)*z,w >: i in [0..5]]; C2b:=[p015,idT]; HH:=car; H:=[s[1]*s[2]*s[3]*s[4] : s in HH]; assert #H eq 36*4; /* // we check that H keeps S fixed for s in H do assert s(fS) eq fS; end for; */ // Now we define the divisors B_1,...,B_5 inside Omega // and the set H*Omega a4:=(9*c0+6*t)*delta/4/(t^3+27); b4:=-c0^2-t*c0; c4:=(18-3*t^2*c0-3*t*c0^2)/8/(t^3+27)*delta; a5:=zeta12*(-zeta6+2)*(b0*b1+b0*b2+b1*b2+t)/9; c5:=zeta12*(zeta6-2)/3; r5:=zeta12*(zeta6-2)*(2*b0*b1*b2+(2*t-3)*b0+(2*t-3*zeta3)*b1+(2*t+3*zeta6)*b2)/9; v5:=-b0-b1-b2; Omega:= [ [x^2 + y^2 + zeta3*z^2, w-b1*x*y*z], [x^2 + zeta3*y^2 + zeta3^2*z^2, w-b0*x*y*z], [2*x*y-c1*z^2, x^3-y^3-w], [c0*x^2 - 2*(9 * c0^2 + 3 * t * c0 - 2 * t^2) / delta *x*y + 2*y^2 - z^2, (x^3+a4*x^2*y+ b4*x*y^2 + c4*y^3)*(-c0^2*c1/2+1)-w], [a5*x^2 +c5*(y^2+z^2)+y*z, r5*x^3+ v5*x*y*z-w] ]; HOmega:={}; for eqn in Omega do for t in H do eqn11:=t(eqn[1]); eqn12:=t(eqn[2]); if Psi2(LeadingCoefficient(eqn11)) ne F!0 and Psi2(LeadingCoefficient(eqn12)) ne F!0 then Include(~HOmega, [eqn11/LeadingCoefficient(eqn11), eqn12/LeadingCoefficient(eqn12)]); else Include(~HOmega, [eqn11, eqn12]); end if; end for; end for; #HOmega; /***************************************************************/ /* */ /* Computations 3.3 */ /* */ /***************************************************************/ function GramMatrixD(List) m:=#List; M:=ScalarMatrix(Integers(),m,-2); for i in [1..m] do for j in [1..i] do Int:=List[i] meet List[j]; if Dimension(Int) eq 1 then M[i,j]:=2*ArithmeticGenus(Int)-2; else M[i,j]:=Degree(Int); end if; M[j,i]:=M[i,j]; end for; end for; return M; end function; DivsH:=HOmega; DivsHd:={[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])] : eqn in DivsH}; assert #DivsH eq #DivsHd; DivsHp:=[[PsiP(eqn[1]),PsiP(eqn[2])]:eqn in HOmega]; DivsHpp:={[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])] : eqn in DivsHp}; assert #DivsHp eq #DivsHpp; ListDivsHp:=[Scheme(PP,eqn) : eqn in DivsHp]; AG:=GramMatrixD(ListDivsHp); LG:=Lattice(AG); BG:=Basis(LG); rk:=#BG; SolG:=Solution(AG,[Vector(b) : b in BG]); MG:=Matrix(SolG); GramG:=MG*AG*Transpose(MG); assert Rank(GramG) eq 19; assert Determinant(GramG) eq 2^5*3^3; Lambda:=LatticeWithGram(GramG: CheckPositive:= false); ALambda,DLambda,phi:=DualQuotient(Lambda); pSignature(Lambda,-1) eq -17; ALambda; /* auxiliary function */ function Rep2(x) return x-2*Round(x/2); end function; /* end auxiliary function */ mE8:=-Matrix(GramMatrix(Lattice("E",8))); mE8:=ChangeRing(mE8,Integers()); U:=Matrix([[0,1],[1,0]]); mA5:=-Matrix(GramMatrix(Lattice("A",5))); mA2:=-Matrix([[2,-1],[-1,2]]); m4A2:=-4*Matrix([[2,-1],[-1,2]]); Dec1:=< , , , , >; L1:=Dec1[1,1]; for i in [1..#Dec1] do if i eq 1 and Dec1[i,2] ne 1 then for j in [2..Dec1[1,2]] do L1:=DiagonalJoin(L1,Dec1[i,1]); end for; end if; if i gt 1 then for j in [1..Dec1[i,2]] do L1:=DiagonalJoin(L1,Dec1[i,1]); end for; end if; end for; L1:=LatticeWithGram(L1: CheckPositive:= false); AL1,DL1,phi1:=DualQuotient(L1); q:={* Rep2(Norm((phi^-1)(g))) : g in ALambda *}; q1:={* Rep2(Norm((phi1^-1)(g1))) : g1 in AL1 *}; assert pSignature(L1,-1) eq pSignature(Lambda,-1); assert Rank(L1) eq Rank(Lambda); assert Factorisation(Determinant(L1)) eq Factorisation(Determinant(Lambda)); assert #Generators(AL1) eq #Generators(ALambda); assert q eq q1; assert IsIsomorphic(ALambda,AL1); /***************************************************************/ /* */ /* End of Computations 3.3 */ /* */ /***************************************************************/ // We define the Galois group Gal(L/K) Gal:=[]; EPhi12:=[1,5,7,11]; Ipm:=[1,-1]; GalK1K:=CartesianPower(Ipm,3); cc:=[L!c0,L!c1,L!c2]; GalLE:=CartesianPower(Ipm,2); for i in EPhi12 do presigma := homL| zeta12^i>; sigma := homL | presigma, t>; for s in GalK1K do if sigma(zeta3) eq L!zeta3 then sigma1:=homL | sigma, [s[1]*b0,s[2]*b1,s[3]*b2]>; else sigma1:=homL | sigma, [s[1]*b0,s[2]*b2,s[3]*b1]>; end if; for j in [1..#cc] do c:=cc[j]; sigma2:=homL | sigma1, c>; Append(~Gal,sigma2); end for; end for; end for; // we name a set of generators genGal:=[tau1,...,tau5] of Gal(L/K) gen:=[zeta12,b0,b1,b2,c0]; ImTau:=[ [zeta12^7, b0, b1, b2, c0], [zeta12, b0, b1, b2, c1], [zeta12^7, -b0, b1, b2, c0], [zeta12^11, b0, -b2, b1, c0], [zeta12^7, b0, b1, -b2, c0] ]; genGal:=[]; for i in [1..#ImTau] do for s in Gal do if [s(gg) : gg in gen] eq ImTau[i] then Append(~genGal,s); end if; end for; end for; GalT:=[homT | s,[x,y,z,w]> : s in Gal]; genGalT:=[homT | s,[x,y,z,w]> : s in genGal]; // We let GalT act on HOmega // getting a list of divisor that is invariant // under the action of H and Gal. HGalOmega:={}; for eqn in HOmega do for s in GalT do eqn11:=s(eqn[1]); eqn12:=s(eqn[2]); if Psi2(LeadingCoefficient(eqn11)) ne F!0 and Psi2(LeadingCoefficient(eqn12)) ne F!0 then Include(~HGalOmega, [eqn11/LeadingCoefficient(eqn11), eqn12/LeadingCoefficient(eqn12)]); else Include(~HGalOmega, [eqn11, eqn12]); end if; end for; end for; GOmega:=[eqn : eqn in HGalOmega]; #GOmega; // We skim the list GOmega deleting the repetitions, // getting two different lists of equations of divisors: // SetDivs5 and SetDivsp. // The elements of the list at the same position are the same up to a scalar // SetDivsp will be used to reduce the equation mod p // SetDivsG will be used to compute the matrices // corresponding to the action of G= on Pic(S) SetDivsNP:=[eqn : eqn in GOmega | {LeadingCoefficient(eqn[1]),LeadingCoefficient(eqn[2])} eq {1}]; SetDivsP:=[eqn : eqn in GOmega | {LeadingCoefficient(eqn[1]),LeadingCoefficient(eqn[2])} ne {1}]; #SetDivsP; #SetDivsNP; assert #SetDivsP+#SetDivsNP eq #GOmega; SetDivsP1:=[[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])]: eqn in SetDivsP]; SetDivsP2:=Set(SetDivsP1); IndProb:=[Index(SetDivsP1,eqn) : eqn in SetDivsP2 ]; SetDivsP3:=[SetDivsP[i] : i in IndProb]; SetDivsP4:=[[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])]: eqn in SetDivsP3]; SetDivs5:= SetDivsNP cat SetDivsP4; SetDivsG:=SetDivs5; SetDivsp:=SetDivsNP cat SetDivsP3; assert #SetDivsp eq #SetDivs5; assert #SetDivsp eq #GOmega; Divsp:=[[PsiP(eqn[1]),PsiP(eqn[2])]:eqn in SetDivsp]; ListDivsp:=[Scheme(PP,eqn) : eqn in Divsp]; /***************************************************************/ /* */ /* Proof of Lemma 3.7 */ /* */ /***************************************************************/ // In order to prove that G preserves Lambda // We shot that the lattice generated by the elements of GOmega // is exactly Lambda. A0:=GramMatrixD(ListDivsp); L0:=Lattice(A0); B0:=Basis(L0); rk:=#B0; Sol0:=Solution(A0,[Vector(b) : b in B0]); M0:=Matrix(Sol0); Gram0:=M0*A0*Transpose(M0); assert Rank(GramG) eq Rank(Gram0); assert Determinant(GramG) eq Determinant(Gram0); // By construction of the list GOmega, // the group G acts as permutation on it. // We want to compute the 414x414 permutation matrices that correspond to the // elements of G. // Notice that they will all be 414x414 permutation matrices. // Since these divisors generate a rank 19 lattice // we can write these matrices as 19x19 matrices nD:=#SetDivsG; GalGraphs:=[]; for s in genGalT do Graph:=[]; for i in [1..nD] do eqn:=SetDivsG[i]; eqn1:=[s(eqn[1]),s(eqn[2])]; j:=Index(SetDivsG,[eqn1[1]/LeadingCoefficient(eqn1[1]), eqn1[2]/LeadingCoefficient(eqn1[2])]); Append(~Graph,j); end for; Append(~GalGraphs,Graph); end for; MgenGal:=[]; // 414x414 matrices corresponding to the generators // of the Galois group for Gr in GalGraphs do Ms:=[[0: i in [1..nD]] : j in [1..nD]]; for i in [1..nD] do Ms[i][Gr[i]]:=1; end for; Append(~MgenGal,Matrix(Ms)); end for; HGraphs:=[]; for t in genH do Graph:=[]; for i in [1..nD] do eqn:=SetDivsG[i]; eqn1:=[t(eqn[1]),t(eqn[2])]; j:=Index(SetDivsG,[eqn1[1]/LeadingCoefficient(eqn1[1]), eqn1[2]/LeadingCoefficient(eqn1[2])]); Append(~Graph,j); end for; Append(~HGraphs,Graph); end for; MgenH:=[]; // 414x414 matrices corresponding to the generators // of H for Gr in HGraphs do Ms:=[[0: i in [1..nD]] : j in [1..nD]]; for i in [1..nD] do Ms[i][Gr[i]]:=1; end for; Append(~MgenH,Matrix(Ms)); end for; MgenG:=MgenH cat MgenGal; // 414x414 matrices corresponding to the generators // of G // The matrix M0 defines a map from ZZ^19 to ZZ^414 // We need a section of this map, represented by the matrix N0 // With this matrix we compute the 19x19 matrices // representing the generators of H and Gal BB0:=Matrix(B0); Id19:=ScalarMatrix(19,1); N0:=Matrix(Solution(BB0,[A0[i] : i in [1..#ListDivsp]])); assert M0*N0 eq Id19; assert N0*Gram0*Transpose(N0) eq A0; M19genG:=[M0*M*N0 : M in MgenG]; // 19x19 matrices corresponding // to the generators of // G, that is, // the union of the generators // of H and Gal M19genH:=[M0*M*N0 : M in MgenH]; // 19x19 matrices corresponding // to the generators of // H. M19genGal:=[M0*M*N0 : M in MgenGal]; // 19x19 matrices corresponding // to the generators of // Gal. G19:=MatrixGroup<19,Integers()|M19genG>; // The group of 19x19 matrices // corresponding to . H19:=MatrixGroup<19,Integers()|M19genH>; // The group of 19x19 matrices // corresponding to H. Gal19:=MatrixGroup<19,Integers()|M19genGal>; // The group of 19x19 matrices // corresponding to Gal. // In order to prove that there is no element of G acting as the identity on Lambda // it is enough to check that the cardinality of G19 equals the product of the cardinalities // of H and Gal, or equivalently, that // the cardinality of Gal19 equals the cardinality of Gal assert #G19 eq #H*#Gal; assert #Gal19 eq #Gal; /***************************************************************/ /* */ /* End of Proof of Lemma 3.7 */ /* */ /***************************************************************/ // We give names to the matrices corresponding to the generators of H and Gal tM1:=M19genGal[1]; tM2:=M19genGal[2]; tM3:=M19genGal[3]; tM4:=M19genGal[4]; tM5:=M19genGal[5]; pxyM:=M19genH[1]; pxyzM:=M19genH[2]; p105M:=M19genH[3]; p015M:=M19genH[4]; p003M:=M19genH[5]; /***************************************************************/ /* */ /* Proof of Lemma 3.9 */ /* */ /***************************************************************/ /* auxuliary function */ // This function compute the self intersection of // the element v of a lattice L having M as intersection form function QuadInt(v,w,M) v1:=ChangeRing(Matrix(v),Integers()); w1:=ChangeRing(Matrix(w),Integers()); return (v1*M*Transpose(w1))[1,1]; end function; /* end auxiliary function */ // First we prove the injectivity of iota_p for p=2. // We compute M_p, denoted by F2:=GF(2); V2:=VectorSpace(F2,19); Gram2:=ChangeRing(Gram0,F2); k2:=sub; k2; GenH2:=[ChangeRing(M,F2) : M in M19genH]; H2:=MatrixGroup<19,F2|GenH2>; H2t:=[M : M in Set(H2)]; M2:=[v : v in k2 | QuadInt(v,v,Gram0) mod 8 eq 0]; VM2:=[v : v in M2 | Dimension(sub) le 2]; W:=sub; assert Set(W) eq Set(VM2); // we compute a basis of W v1:=Basis(W)[1]; v2:=Basis(W)[2]; // We see which representative of v1 has been used by MAGMA elv1:=Eltseq(v1); u1:=&+[elv1[i]*B0[i] : i in [1..#B0]]; // We write w1 as combination // of the elements of the basis // of L0. uu,N:=Solution(A0,u1); // we write it as combination // of -2 curves. // It does not need to be minimal // We pick a particular representative w1 of v1, // such that w1^2 = -8 // and we check that ut is indeed a representative of v1 ww:=[ 0 : i in [1..414]]; ww[37]:=1; ww[70]:=-1; ww:=Parent(uu)!(ww); w1:=ww*N0; assert QuadInt(w1,w1,Gram0) eq -8; assert V2!w1 eq v1; eqn:=Omega[4]; B4:=[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])]; p030:=homT | x,-y,z,w >; eqn:=[p030(B4[1]),p030(B4[2])]; p030B4:=[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])]; // We set E0:=\tau_2^2\sigma_{(xy)}p_{0,3,0}(B4) // and E2:= \tau_2^2\sigma_{(xy)}(B4) tau2:=genGalT[2]; eqn:=[tau2(tau2(pxy(p030B4[1]))),tau2(tau2(pxy(p030B4[2])))]; E0:=[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])]; e0:=Index(SetDivsG,E0); eqn:=[tau2(tau2(pxy(B4[1]))),tau2(tau2(pxy(B4[2])))]; E2:=[eqn[1]/LeadingCoefficient(eqn[1]),eqn[2]/LeadingCoefficient(eqn[2])]; e2:=Index(SetDivsG,E2); ww:=[ 0 : i in [1..414]]; ww[e0]:=1; ww[e2]:=-1; ww:=Parent(uu)!(ww); w2:=ww*N0; assert QuadInt(w2,w2,Gram0) eq -8; assert V2!w2 eq v2; // Then we prove the injectivity for p=3 F3:=GF(3); V3:=VectorSpace(F3,19); Gram3:=ChangeRing(Gram0,F3); k3:=sub; k3; GenG3:=[ChangeRing(M,F3) : M in M19genG]; G3:=MatrixGroup<19,F3|GenG3>; M3:=[v : v in k3 | QuadInt(v,v,Gram0) mod 18 eq 0]; VM3:=[v : v in M3 | Dimension(sub) le 1]; assert VM3 eq [V3![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]; /***************************************************************/ /* */ /* End of proof of Lemma 3.9 */ /* */ /***************************************************************/ /***************************************************************/ /* */ /* Proof of Computation 4.1 */ /* */ /***************************************************************/ // Using the matrix representation of the action of G on L0 // We can compute the H^0(Gal,Pic), gmpic:=GModule(Gal19); cmpic:=CohomologyModule(Gal19,gmpic); cgpic:=CohomologyGroup(cmpic,0); cgpic; // Using the matrix representation of the action of GG on L0 // We can compute the H^1(Gal,Pic), // and H^1(H,Pic) for any H