= R[]
(X^3 + a*X + b).discriminant()
///
-4*a^3 - 27*b^2
}}}
{{{id=55|
E = EllipticCurve([0,1])
P = E([0,1]); Q = E([-1,0]); R = P+Q; mR = -R
G = E.plot(-1.5,2.5, plot_points=300)
G += points([(0,1), (-1,0), (2,-3), (2,3)], pointsize=50, color='black')
G += line([(-1.5,-.5), (2.5,3.5)], color='red')
G += text("P", (-1.2,.3), color='black')
G += text("Q", (-.3,1.3), color='black')
G += text("-R", (1.8,3.2), color='black')
G += text("R=P+Q", (1.3,-2.85), color='black')
G += line([(2,3.5), (2,-3.5)], color='green')
G.show(gridlines=True, aspect_ratio=1)
G.save('group_law.pdf', gridlines=True, aspect_ratio=1)
///
}}}
{{{id=54|
///
}}}
Example of the group law:
{{{id=56|
E = EllipticCurve([0,1]); E
///
Elliptic Curve defined by y^2 = x^3 + 1 over Rational Field
}}}
{{{id=51|
E.plot(plot_points=300)
///
}}}
{{{id=58|
P = E([0,1]); Q = E([-1,0])
///
}}}
{{{id=59|
6*P
///
(0 : 1 : 0)
}}}
{{{id=60|
P + Q
///
(2 : -3 : 1)
}}}
{{{id=57|
E.torsion_points()
///
[(-1 : 0 : 1), (0 : -1 : 1), (0 : 1 : 0), (0 : 1 : 1), (2 : -3 : 1), (2 : 3 : 1)]
}}}
{{{id=63|
E.rank()
///
0
}}}
{{{id=62|
///
}}}
Another group law example
{{{id=16|
E = EllipticCurve([0,-11]); E
///
Elliptic Curve defined by y^2 = x^3 - 11 over Rational Field
}}}
{{{id=24|
E.plot(plot_points=300)
///
}}}
{{{id=26|
E.rank()
///
2
}}}
{{{id=64|
E.torsion_points()
///
[(0 : 1 : 0)]
}}}
{{{id=14|
E.gens()
///
[(3 : 4 : 1), (15 : 58 : 1)]
}}}
{{{id=18|
4^2 == 3^3 - 11
///
True
}}}
{{{id=19|
58^2 == 15^3 - 11
///
True
}}}
{{{id=13|
P, Q = E.gens()
///
}}}
{{{id=12|
P + Q
///
(9/4 : -5/8 : 1)
}}}
{{{id=22|
10*P
///
(930435470900732273286212904916584382851918707114566057436294864025/257770111476555950391903081266179661202927866667272872071464670784 : -785546522860921296447469705097394135864922703664865812761579663533665658933035697506931116417953341/130872632714966803088018857357898482579518922148856944965828535978913736172452155853807515753661952 : 1)
}}}
{{{id=23|
-2*P + 7*Q
///
(420063556989067715791714761886724579923678909674987765537203462650619079/145334554461984774714423666838993439440712221643288217894750652294515625 : 200883314931678000123811665179930397145675318413317268608414672749225868340318880528744088623413230050407142/55405557015921763207664753901199020152992013160183413664113461664249639440731852187715160494988355970703125 : 1)
}}}
{{{id=29|
///
}}}
Counting points modulo $p$:
{{{id=32|
Emod = E.change_ring(GF(17)); Emod
///
Elliptic Curve defined by y^2 = x^3 + 6 over Finite Field of size 17
}}}
{{{id=28|
Emod.points()
///
[(0 : 1 : 0), (3 : 4 : 1), (3 : 13 : 1), (4 : 6 : 1), (4 : 11 : 1), (6 : 1 : 1), (6 : 16 : 1), (7 : 3 : 1), (7 : 14 : 1), (8 : 5 : 1), (8 : 12 : 1), (9 : 2 : 1), (9 : 15 : 1), (12 : 0 : 1), (14 : 8 : 1), (14 : 9 : 1), (15 : 7 : 1), (15 : 10 : 1)]
}}}
{{{id=27|
Emod.cardinality()
///
18
}}}
{{{id=34|
Emod.plot(pointsize=50, gridlines='minor', frame=True)
///
}}}
{{{id=20|
///
}}}
{{{id=5|
///
}}}
The very piece of paper where they first came up with part of the BSD conjecture:

Based on data like the following...
{{{id=2|
def f(E,M):
N = E.conductor()
return prod(E.Np(p) / float(p) for p in primes(M) if N%p)
///
}}}
{{{id=69|
for b in [1,2,-11,-6,316]:
E = EllipticCurve([0,b])
print '%4s%4s%10.3f%10.3f%10.3f'%(b, E.rank(), f(E,10^3), f(E,10^4), f(E,10^6))
///
1 0 1.895 2.060 1.849
2 1 6.804 8.735 11.693
-11 2 36.523 49.215 143.102
-6 0 0.461 0.551 1.013
316 3 100.158 261.144 879.231
}}}
{{{id=68|
///
}}}
{{{id=67|
def f_plot(E, M, **kwds):
N = E.conductor()
v = [(0,1)]
pr = 1
for p in primes(M):
if N%p:
pr *= E.Np(p) / float(p)
v.append((p, v[-1][1]))
v.append((p, pr))
return line(v, **kwds)
///
}}}
{{{id=73|
B = 10^3
P = (f_plot(EllipticCurve([0,1]), B, color='red') +
f_plot(EllipticCurve([0,2]), B, color='blue') +
f_plot(EllipticCurve([0,-11]), B, color='green') +
f_plot(EllipticCurve([0,-6]), B, color='orange') +
f_plot(EllipticCurve([0,316]), B, color='purple'))
P.show(figsize=[8,3])
///
}}}
{{{id=66|
P.save('bsd_plot2.pdf', figsize=[8,3])
///
}}}
{{{id=38|
///
}}}
Sage is also good at computing with $L(E,s)$
{{{id=37|
E = EllipticCurve([0,-6])
L = E.lseries().dokchitser()
///
}}}
{{{id=40|
L(2)
///
0.970573503589685
}}}
{{{id=41|
L(1)
///
1.80166139420421
}}}
{{{id=42|
L(1+I)
///
1.37330247586099 + 0.672104565160637*I
}}}
{{{id=36|
L.taylor_series(1, 5)
///
1.80166139420421 - 4.34358857895219*z + 10.6996108328594*z^2 - 16.6581015345210*z^3 + 17.7188237405279*z^4 + O(z^5)
}}}
{{{id=10|
E = EllipticCurve([0,316])
L = E.lseries().dokchitser()
L.taylor_series(1, 5)
///
(8.21208956591497e-23)*z + (-3.64556152695356e-22)*z^2 + 25.3581351256025*z^3 - 112.571399845523*z^4 + O(z^5)
}}}
{{{id=50|
E.analytic_rank()
///
3
}}}
{{{id=43|
E = EllipticCurve([0,-11])
L = E.lseries().dokchitser()
L.taylor_series(1, 5)
///
2.66270802215019e-23 + (-6.18778237886993e-23)*z + 5.92327478382316*z^2 - 13.7649096437350*z^3 + 17.0105571907034*z^4 + O(z^5)
}}}
{{{id=47|
proof.all(False)
for j in [301..350]:
for k in [j,-j]:
try:
E = EllipticCurve([0,k])
except:
continue
r = E.analytic_rank()
if r >= 2:
print k, r
if r >= 3:
print '*'*20
///
303 2
-307 3
********************
316 3
********************
Traceback (most recent call last): continue
File "", line 1, in
File "/tmp/tmpTFIEZ2/___code___.py", line 4, in
exec compile(u"for j in (ellipsis_range(_sage_const_301 ,Ellipsis,_sage_const_500 )):\n for k in [j,-j]:\n try:\n E = EllipticCurve([_sage_const_0 ,k])\n except:\n continue \n r = E.analytic_rank() \n if r >= _sage_const_2 : \n print k, r\n if r >= _sage_const_3 :\n print '*'*_sage_const_20 " + '\n', '', 'single')
File "", line 7, in
File "/sagenb/flask/sage-4.6.2/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_rational_field.py", line 1336, in analytic_rank
rank_lead = self.pari_curve().ellanalyticrank()
KeyboardInterrupt
__SAGE__
}}}
{{{id=46|
///
}}}
{{{id=45|
E = elliptic_curves.rank(4)[0]; E
///
Elliptic Curve defined by y^2 + x*y = x^3 - x^2 - 79*x + 289 over Rational Field
}}}
{{{id=44|
latex(E.short_weierstrass_model())
///
y^2 = x^3 - 102627x + 12560670
}}}
{{{id=70|
///
}}}