// SOME COMPUTATIONS WITH THE KLEIN QUARTIC // ======================================== // // // Idea by Nils Bruin // Michael Stoll, Goettingen, July 2006 // // NOTE: The code below works with version 2.13-1 // //====================================================================== // // We want to reduce things mod p, so it is better to work over Z // // Set up polynomial ring in 3 variables PZ3 := PolynomialRing(Integers(), 3); // Define projective plane Pr2Z := ProjectiveSpace(PZ3); // // Now define the curve K := Curve(Pr2Z, X^3*Y + Y^3*Z + Z^3*X); K; // // Check that it defines a smooth genus 3 curve over Q KQ := BaseChange(K, Rationals()); IsIrreducible(KQ); IsNonsingular(KQ); Genus(KQ); // // Where can we have bad reduction? // As an example, check p=2. K2 := BaseChange(K, GF(2)); K2; IsIrreducible(K2); IsNonsingular(K2); Genus(K2); // so p=2 is OK. // // How can we find the bad primes? // The condition is that there is a singularity mod p. // So we look at the singular subscheme of K. SK := SingularSubscheme(K); SK; // Ideally, we would like to find its image under the structure // morphism to Spec(Z), but this doesn't quite work: Image(map Spec(Integers()) | []>); Ideal($1); // // so we have to do it in a more pedestrian way. // It is better to work with affine patches (and here, one is enough, // because of the obvious symmetry). SKa := AffinePatch(SK, 1); // Find the intersection of the defining ideal with Z: EliminationIdeal(Ideal(SKa), {}); // So 7 is the only bad prime here. // // Let us look at what the reduction mod 7 looks like. K7 := BaseChange(K, GF(7)); IsIrreducible(K7); IsNonsingular(K7); Genus(K7); // The special fiber here is a genus 0 curve with singularities. // Where are they? SingularPoints(K7); // So there is one singularity defined over F7. Can there be more? // (Exercise: No, because of the triple symmetry...) HasPointsOverExtension(SingularSubscheme(K7)); // // Let us check whether it is a regular point on the arithmetic surface K. // For this, it is best to work in an affine patch. K7a := AffinePatch(K7, 1); ptS := SingularPoints(K7a)[1]; ptS; // The point on K we are interesed in is given by the maximal ideal // m = (7, X-2, Y-4). It will be regular when the image of the defining // polynomial of K mod m^2 is nonzero. Ka := AffinePatch(K, 1); P2Z := CoordinateRing(Ambient(Ka)); q(DefiningPolynomial(Ka)) where _, q := quo^2>; // ==> point is nonregular. // Now we could go on and blow it up to find a regular model... // // Instead, let us find all the rational points on K. // There are three obvious ones: ptsK := [KQ | [1,0,0], [0,1,0], [0,0,1]]; ptsK; // and there is an obvious automorphism of K of order 3: autK := map KQ | [y, z, x]>; autK^3 eq IdentityMap(KQ); // ? -- try this: Expand(autK^3) eq IdentityMap(KQ); // ! // // Let us divide by the action of Z/3Z. // We use the four basic invariants // x+y+z, xy+yz+zx, xyz, x^2y+y^2z+z^2x // to map into a (1,2,3,3)-weighted P^3. Pr := ProjectiveSpace(Rationals(), [1,2,3,3]); mq := map Pr | [x+y+z, x*y+y*z+z*x, x*y*z, x^2*y+y^2*z+z^2*x]>; C := Image(mq); C; IsIrreducible(C); IsNonsingular(C); Genus(C); // So this is an elliptic curve, if we have a point on it. // But we do have a point: ptC := mq(ptsK[1]); ptC; // // Now construct the elliptic curve // (note that ptC so far is a point on Pr, but we need it as a point on C) E, CtoE := EllipticCurve(C, C!ptC); E; // We can ask which elliptic curve it is: CremonaReference(E); // and determine its Mordell-Weil group. G, mG := MordellWeilGroup(E); G; // so there are just two rational points on E, which we can pull back to C1 // and then to K. ptsE := [mG(g) : g in Set(G)]; ptsE; ptsC := [pt @@ CtoE : pt in ptsE]; // running into problems here: [Points(s) : s in ptsC]; // so do it all in one go back to K. m := Expand(mq*CtoE); // need to adjust the codomains to get meaningful composition. mq := Restriction(mq, KQ, C); m := Expand(mq*CtoE); // This is not yet a morphism: BS := BaseScheme(m); Degree(BS); Points(BS); // so we extend it m := Extend(m); IsEmpty(BaseScheme(m)); ptsKS := [pt @@ m : pt in ptsC1]; ptsKS; // note that we get schemes back -- m is not birational. Get at the points: [Points(s) : s in $1]; ptsK; // // THEOREM. The only rational points on K are the three obvious ones. // // Let's have a look at the Jacobian of K. // We can set up divisors on K like this: places1 := [Place(pt) : pt in ptsK]; places1; // Use the first as a base point to get divisors of degree zero: D1 := places1[2] - places1[1]; D2 := places1[3] - places1[1]; // Check their classes are nontrivial (clear since genus > 0). IsPrincipal(D1), IsPrincipal(D2); // // Can they be of finite order? // To get an idea, consider reduction mod 2. // Unfortunately, there appears to be no simple way of mapping points, // divisors, ... to a base-changed curve, so we have to do it // all over again. plcs := [Place(K2!ChangeUniverse(Eltseq(pt), Integers())) : pt in ptsK]; d1 := plcs[2] - plcs[1]; d2 := plcs[3] - plcs[1]; // Now find divisor class group: Cl, mCl := ClassGroup(K2); Cl; // and images of d1 and d2 in there. d1 @@ mCl; d2 @@ mCl; // (needs a small patch in 2.12-6) // // This suggests that both D1 and D2 have order 7, and that 3*D1 = D2. // Check! IsPrincipal(7*D1), IsPrincipal(7*D2), IsPrincipal(3*D1 - D2); // OK, so the rational points on K generate a subgroup Z/7Z. // Is there more? // Assuming rank zero (see below), we can get an upper bound on the order // of the Mordell-Weil group by looking at reductions mod good odd primes: GCD([ClassNumber(BaseChange(K, GF(p))) : p in [2,3,5]]); // Can we find an element of order 2? // Recall that we have a point of degree 3 mapping to the other point on E. pt3 := ptsKS[2]; Degree(pt3); // get a place of degree 3 out of this and subtract the other three points D3 := Divisor(KQ, pt3) - &+places1; // Check for its order. IsPrincipal(D3); IsPrincipal(2*D3); // So D3 has order 2, and we have found that the torsion subgroup of the // Mordell-Weil group is Z/14Z. // // Is this all? // To answer this, we have to determine the Mordell-Weil rank. // For this special curve, one can do a 2-descent // (not implemented in Magma), // but we can also use analytic methods. // Note that K = X(7), so Jac(K) = J(7), which is a factor of J_1(7^2). // J(7) splits into simple components of dimensions 1 (E) and 2. // This suffices to identify it in J_1(49). time J1 := JOne(7^2); time Dec := Decomposition(J1); [Dimension(A) : A in Dec]; // the interesting piece is the one of dimension 2 A := [A : A in Dec | Dimension(A) eq 2][1]; A; // Now check that L-series does not vanish. time LRatio(A, 1); // nonzero ==> analytic rank = 0 ==> MW rank = 0 ==> Jac(K)(Q) = Z/14Z.