Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: Math 582b
Views: 2493

February 12, 2016: Elliptic curves (part 1)

William Stein

(reminder: Go to Brian Conrad's talk on ABC in MEB right after class.)

Elliptic curves (and modular forms) are absolutely central in number theory:

Fermat's Last Theorem, congruent number problem, Birch and Swinnerton-Dyer conjecture, CM elliptic curves (class field theory), one-dimensional abelian varieties.

Unsolved problem: Is there an algorithm that decides whether or not a cubic F(x,y)Q[x,y]F(x,y) \in \QQ[x,y] has a rational solution?

(Answer: conjecturally yes, but we don't know!)

Unsolved problem: Is there an algorithm to determine whether or not an integer nn is the area of a right triangle with rational side lengths?

(Answer: conjecturally yes.)

Sage has a ridiculous amount of functionality for computing with elliptic curves.

There used to be several programs relevant to computing with elliptic curves (e.g., SIMATH), but now the ones that matter are Sage and Magma:

First rate support for elliptic curves:

  • Sage (and PARI/mwrank, which are both in Sage)

  • Magma

Also relevant: smalljac for point counting

Third rate (or worse) for elliptic curves:

  • Maple: has a package called apecs from the old days. Find the pdf file with google. I don't know if anybody uses this anymore.

  • Mathematica -- I've never heard of anybody doing anything useful with elliptic curves in Mathematica (and couldn't find anything via Google searches).

  • Matlab/Mupad -- ?

2. Quick background on elliptic curves

An elliptic curve EE over a field kk is a genus one curve with a distinguished rational point. Such a thing can be given by an equation y2+a1xy+a3y=x3+a2x2+a4x+a6. y^2 + a_1 xy + a_3 y = x^3 + a_2 x^2 + a_4 x + a_6.

In Sage (or Magma), make an elliptic curve by typing EllipticCurve([1,2,3,4,6]):

EllipticCurve([1,2,3,4,6])
Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 6 over Rational Field
%magma EllipticCurve([1,2,3,4,6])
Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 6 over Rational Field
%gp ellinit([1,2,3,4,6])
[1, 2, 3, 4, 6, 9, 11, 33, 44, -183, -4293, -14212, 6128487/14212, Vecsmall([1]), [Vecsmall([128, -1])], [0, 0, 0, 0, 0, 0, 0, 0]]

You can also make elliptic curves in a few other ways:

EllipticCurve_from_ # [put cursor after _ and press tab] ︠deae1276-1273-4446-8a16-1dd4de7ed1e4︠ E = ElliptiEllipticCurve_from_c4c6 E
Elliptic Curve defined by y^2 = x^3 - 21*x - 14 over Rational Field

The jj-invariant of an elliptic curve is an invariant of the isomorphism class of the curve over the algebraic closure. It's just an algebraic function of the coefficients. Here it is in general below:

E.j_invariant()
2016
R.<a1,a2,a3,a4,a6> = QQ[] E_generic = EllipticCurve(R.gens()) E_generic
Elliptic Curve defined by y^2 + a1*x*y + a3*y = x^3 + a2*x^2 + a4*x + a6 over Multivariate Polynomial Ring in a1, a2, a3, a4, a6 over Rational Field
show(E_generic.j_invariant())
a112+24a110a2+240a18a2272a19a3+1280a16a231152a17a2a3144a18a4+3840a14a246912a15a22a3+1728a16a322304a16a2a4+6144a12a2518432a13a23a3+13824a14a2a3213824a14a22a4+6912a15a3a4+4096a2618432a1a24a3+27648a12a22a3213824a13a3336864a12a23a4+55296a13a2a3a4+6912a14a4236864a24a4+110592a1a22a3a482944a12a32a4+55296a12a2a42+110592a22a42165888a1a3a42110592a43a14a2a32+a15a3a4a16a68a12a22a32+a13a33+8a13a2a3a4+a14a4212a14a2a616a23a32+36a1a2a33+16a1a22a3a430a12a32a4+8a12a2a4248a12a22a6+36a13a3a627a34+72a2a32a4+16a22a4296a1a3a4264a23a6+144a1a2a3a6+72a12a4a664a43216a32a6+288a2a4a6432a62\displaystyle \frac{a_{1}^{12} + 24 a_{1}^{10} a_{2} + 240 a_{1}^{8} a_{2}^{2} - 72 a_{1}^{9} a_{3} + 1280 a_{1}^{6} a_{2}^{3} - 1152 a_{1}^{7} a_{2} a_{3} - 144 a_{1}^{8} a_{4} + 3840 a_{1}^{4} a_{2}^{4} - 6912 a_{1}^{5} a_{2}^{2} a_{3} + 1728 a_{1}^{6} a_{3}^{2} - 2304 a_{1}^{6} a_{2} a_{4} + 6144 a_{1}^{2} a_{2}^{5} - 18432 a_{1}^{3} a_{2}^{3} a_{3} + 13824 a_{1}^{4} a_{2} a_{3}^{2} - 13824 a_{1}^{4} a_{2}^{2} a_{4} + 6912 a_{1}^{5} a_{3} a_{4} + 4096 a_{2}^{6} - 18432 a_{1} a_{2}^{4} a_{3} + 27648 a_{1}^{2} a_{2}^{2} a_{3}^{2} - 13824 a_{1}^{3} a_{3}^{3} - 36864 a_{1}^{2} a_{2}^{3} a_{4} + 55296 a_{1}^{3} a_{2} a_{3} a_{4} + 6912 a_{1}^{4} a_{4}^{2} - 36864 a_{2}^{4} a_{4} + 110592 a_{1} a_{2}^{2} a_{3} a_{4} - 82944 a_{1}^{2} a_{3}^{2} a_{4} + 55296 a_{1}^{2} a_{2} a_{4}^{2} + 110592 a_{2}^{2} a_{4}^{2} - 165888 a_{1} a_{3} a_{4}^{2} - 110592 a_{4}^{3}}{- a_{1}^{4} a_{2} a_{3}^{2} + a_{1}^{5} a_{3} a_{4} - a_{1}^{6} a_{6} - 8 a_{1}^{2} a_{2}^{2} a_{3}^{2} + a_{1}^{3} a_{3}^{3} + 8 a_{1}^{3} a_{2} a_{3} a_{4} + a_{1}^{4} a_{4}^{2} - 12 a_{1}^{4} a_{2} a_{6} - 16 a_{2}^{3} a_{3}^{2} + 36 a_{1} a_{2} a_{3}^{3} + 16 a_{1} a_{2}^{2} a_{3} a_{4} - 30 a_{1}^{2} a_{3}^{2} a_{4} + 8 a_{1}^{2} a_{2} a_{4}^{2} - 48 a_{1}^{2} a_{2}^{2} a_{6} + 36 a_{1}^{3} a_{3} a_{6} - 27 a_{3}^{4} + 72 a_{2} a_{3}^{2} a_{4} + 16 a_{2}^{2} a_{4}^{2} - 96 a_{1} a_{3} a_{4}^{2} - 64 a_{2}^{3} a_{6} + 144 a_{1} a_{2} a_{3} a_{6} + 72 a_{1}^{2} a_{4} a_{6} - 64 a_{4}^{3} - 216 a_{3}^{2} a_{6} + 288 a_{2} a_{4} a_{6} - 432 a_{6}^{2}}
E_generic.j_invariant??
File: /projects/sage/sage-6.10/local/lib/python2.7/site-packages/sage/schemes/elliptic_curves/ell_generic.py Source: def j_invariant(self): r""" Returns the j-invariant of this elliptic curve. EXAMPLES:: sage: E = EllipticCurve([0,0,1,-1,0]) sage: E.j_invariant() 110592/37 sage: E = EllipticCurve([0, -1, 1, -10, -20]) sage: E.j_invariant() -122023936/161051 sage: E = EllipticCurve([-4,0]) sage: E.j_invariant() 1728 :: sage: E = EllipticCurve([GF(7)(2),1]) sage: E.j_invariant() 1 """ try: return self.__j_invariant except AttributeError: c4, _ = self.c_invariants() self.__j_invariant = c4**3 / self.discriminant() return self.__j_invariant

There's elliptic curves over any field...

EllipticCurve(GF(9,'a'), [1,2,3,4,5])
Elliptic Curve defined by y^2 + x*y = x^3 + 2*x^2 + x + 2 over Finite Field in a of size 3^2
EllipticCurve(RR, [1,2,3,4,5])
Elliptic Curve defined by y^2 + 1.00000000000000*x*y + 3.00000000000000*y = x^3 + 2.00000000000000*x^2 + 4.00000000000000*x + 5.00000000000000 over Real Field with 53 bits of precision
# They are NOT ellipses; instead, they come up when computing # arc lengths of ellipses... EllipticCurve(RR, [1,2,3,4,5]).plot()
EllipticCurve([10,2,3,4,5]).plot()
︠644fcdbe-6d15-4a73-8231-f0fa8018dabc︠ ︠40ffffec-4d15-411d-a616-b9d82564a97e︠