// 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 ptsE]; 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;
// 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.
~~