Modular curve X_0(2)¶

In [1]:
%display latex

The modular curve $X_0(2)$ parameterizes pairs of elliptic curves related by a cyclic isogeny of degree 2, and it is the zero set of the modular polynomial $$\varphi_2(x,y)= -x^{2} y^{2} + x^{3} + 1488 \, x^{2} y + 1488 \, x y^{2} + y^{3} - 162000 \, x^{2} + 40773375 \, x y - 162000 \, y^{2} + 8748000000 \, x + 8748000000 \, y - 157464000000000$$

When $N=2$, a computation with the Hurwitz genus formula tells us the genus of this curve is $0$ (see Modular curves, Hecke correspondences, and L-functions by David E. Rorlich p.42). So, there exists a rational parametrization of this curve.

Huge shoutout to Gaurish Korpal for introducing me to modular curves.

In [8]:
var('x,y,z,t')
phi_2 = x^3 - x^2*y^2 
phi_2 += 1488*x^2*y - 162000*x^2 
phi_2 += 1488*x*y^2 + 40773375*x*y 
phi_2 += 8748000000*x + y^3 - 162000*y^2 + 8748000000*y -157464000000000;
phi_2
Out[8]:
\(\displaystyle -x^{2} y^{2} + x^{3} + 1488 \, x^{2} y + 1488 \, x y^{2} + y^{3} - 162000 \, x^{2} + 40773375 \, x y - 162000 \, y^{2} + 8748000000 \, x + 8748000000 \, y - 157464000000000\)

Now how to find it is not that easy, for the idea Viktor Vaughn's answer to the following question https://math.stackexchange.com/questions/4164279/find-the-rational-parametrization-of-this-curve.

Magma Code¶

(use http://magma.maths.usyd.edu.au/calc/ to evaluate)

QQ := Rationals();

R<x,y> := PolynomialRing(QQ,2);

f := x^3 - x^2*y^2 + 1488*x^2*y - 162000*x^2 + 1488*x*y^2+ 40773375*x*y + 8748000000*x + y^3 - 162000*y^2 + 8748000000*y -157464000000000;

C0 := Curve(AffineSpace(R),f);

C := ProjectiveClosure(C0);

P<U,V,W> := Ambient(C);

K := CanonicalDivisor(C);

mp := DivisorMap(-K);
mp;

P<X,Y,Z> := Codomain(mp);

Q:= Image(mp);
Q;

KC<xx,yy> := FunctionField(C);

KQ<u,v> := FunctionField(Q);

mpCQ := Restriction(mp, C, Q);

mpQC := map< Q -> C | [Pushforward(mpCQ, xx), Pushforward(mpCQ, yy), 1]>;

mpQC;
In [9]:
var('t,u,Y_0,Y_1,Y_2')
tilde_phi_2 = Y_0*Y_1 - 720*Y_1^2 + 4352/91*Y_1*Y_2 - 4096/4095*Y_2^2

solve(tilde_phi_2.subs(Y_0=1,Y_1 = u,Y_2=t*u) == 0, u)
Out[9]:
\(\displaystyle \left[u = \frac{4095}{16 \, {\left(256 \, t^{2} - 12240 \, t + 184275\right)}}, u = 0\right]\)
In [10]:
tilde_phi_2.subs(Y_0=1,Y_1= 0,Y_2=0).is_zero()
Out[10]:
\(\displaystyle \mathrm{True}\)
In [12]:
tilde_phi_2.subs(Y_0=1,Y_1= 4095/16/(256*t^2 - 12240*t + 184275),Y_2=t*( 4095/16/(256*t^2 - 12240*t + 184275))).is_zero()
Out[12]:
\(\displaystyle \mathrm{True}\)
In [13]:
tilde_phi_2.subs(Y_0= 256*t^2 - 12240*t + 184275,Y_1=4095/16,Y_2=4095*t/16)
Out[13]:
\(\displaystyle 0\)
In [15]:
Y_0= 256*t^2 - 12240*t + 184275
Y_1=4095/16
Y_2=4095*t/16
X_0 = 16769025*Y_1^4 - 196560*Y_1^3*Y_2 + 768*Y_1^2*Y_2^2 - 4096/4095*Y_1*Y_2^3
X_1 = -4095*Y_1^3*Y_2 + 768*Y_1^2*Y_2^2 - 65536/1365*Y_1*Y_2^3 + 16777216/16769025*Y_2^4
X_2 = Y_1^2*Y_2^2
x =X_0/X_2
y =X_1/X_2
phi_2.subs(x=x,y=y).expand()
Out[15]:
\(\displaystyle 0\)

Since the plugging in the parametrization into $\varphi_2(x,y)$ gives $0$, we've found a rational parametrization of $X_0(2)$!

In [16]:
x = x.numerator().factor()/x.denominator()
y = y.numerator().factor()/y.denominator()
In [17]:
x,y
Out[17]:
\(\displaystyle \left(-\frac{{\left(16 \, t - 4095\right)}^{3}}{4095 \, t^{2}}, \frac{{\left(256 \, t - 4095\right)}^{3}}{16769025 \, t}\right)\)
In [18]:
def minus_floor(x):
    return x-floor(x)
def build_frame(s):
    X = lambda u,v: x.subs(t = u+i*v).real()
    Y = lambda u,v: x.subs(t = u+i*v).imag()
    Z = lambda u,v,s: cos(s)*y.subs(t = u+i*v).real()+sin(s)*y.subs(t = u+i*v).imag()
    cf = lambda u,v: minus_floor(sin(s)*y.subs(t = u+i*v).real()+cos(s)*y.subs(t = u+i*v).imag())
    cm = colormaps.hsv
    G= (X,Y,lambda u,v: Z(u,v,s))
    P = parametric_plot3d(G,(-100, 100),(-100,100),aspect_ratio=1,colors = (cf,cm))
    P = P.add_condition(lambda x,y,z: abs(z)<2*10^4)
    P = P.add_condition(lambda x,y,z: abs(x+10800/3)<10^5/6)
    P = P.add_condition(lambda x,y,z: abs(y)<10^5/5)
    return P
frames = [build_frame(t) for t in srange(0,6.28,0.08)+[6.28]]
plot = animate(frames).interactive()
plot.show(delay=5, auto_play=False, projection='orthographic', frame=false, viewpoint=[[-0.5393,-0.5633,-0.626],118.13])