William Stein -- JMM -- Solving Cubic Equations
system:sage


<p>&nbsp;</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">olving Cubic Equations (JMM 2012 Short Course)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">William Stein</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1 style="text-align: center;">Solving Cubic Equations (JMM 2012 Short Course)</h1>
<h1 style="text-align: center;">William Stein</h1>
<p>This worksheet accompanies <a href="http://wstein.org/talks/2011-gross-stein-cubic/rational.pdf" target="_blank">these slides</a>.</p>

{{{id=7|

///
}}}

{{{id=6|

///
}}}

<h1>Pythagorean triples</h1>

{{{id=5|
@interact
def _(t=(1/4,(1/16,1/8,..,1))):
    t0 = t
    x,y,t=var('x,y,t')
    show([x==(1-t^2)/(1+t^2), y==2*t/(1+t^2)])
    t = t0
    (x,y) = ((1-t^2)/(1+t^2), 2*t/(1+t^2))
    a = 1/3
    G = circle((0,0), 1, color='blue', thickness=3)
    G += arrow((-1-a,-t*a), (x+a,y+t*a), head=2, color='red')
    G += point((0,t), pointsize=150, color='black', zorder=100)
    G += point((-1,0), pointsize=150, color='black', zorder=100)
    G += point((x,y), pointsize=190, color='lightgreen', zorder=100)
    G += text("$(0, %s)$"%t, (-.3, t+.2), fontsize=16, color='black')
    G += text(r"$(%s,\,%s)$"%(x,y), (x+.35, y+.25), fontsize=16, color='black')
    G.show(aspect_ratio=1, ymin=-1.1, ymax=1.1, xmax=1.3, xmin=-1.3, fontsize=0, figsize=6)
///
}}}

{{{id=4|

///
}}}

<h1>Cubic equations</h1>

{{{id=3|
var('x,y')
implicit_plot(x^3 + y^3 == 1, (x,-2,2), (y,-2,2), aspect_ratio=1, figsize=5, gridlines=True)
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=1|
var('x,y')
implicit_plot(y^2 + y == x^3 - x, (x,-2,3), (y,-4.5,4), aspect_ratio=1/2, figsize=5, gridlines=True)
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=12|
@interact
def _(equation='x^3 + y^3 == 1', 
      xmin=-2, xmax=2, ymin=-2, ymax=2, aspect_ratio=1, gridlines=True):
    x,y = var('x,y')
    eqn = sage_eval(equation, {'x':x, 'y':y})
    print eqn
    G = implicit_plot(eqn, (x,xmin,xmax), (y,ymin,ymax), aspect_ratio=aspect_ratio, gridlines=gridlines)
    G.show(figsize=4)
///
}}}

{{{id=11|

///
}}}

<h1>The Group Law</h1>

<p>How the figure in the slide was made:</p>

{{{id=13|
E = EllipticCurve([0,0,1,-1,0]); print E
G = E.plot(plot_points=600, thickness=2)
G += arrow((-2,1), (3,-4), head=2, color='red', width=2)
G += points([(-1,0), (0,-1), (2,-3)], color='black', pointsize=70, zorder=50)
G += text("$(2,-3)$", (1.3,-3.1), fontsize=18, color='black')
G += text("$(-1,0)$", (-.9,1), fontsize=18, color='black')
G += text("$(0,-1)$", (-.7,-1.85), fontsize=18, color='black')
G.show(gridlines=True, frame=True, aspect_ratio=1/2, xmax=3.1, xmin=-2, figsize=5)
///
Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=16|
E = EllipticCurve([0,0,1,-1,0])
P = E([-1,0]); Q = E([0,-1]); R = E([2,-3])
print P + Q + R
print -(P+Q)
print 7*P
///
(0 : 1 : 0)
(2 : -3 : 1)
(1849037896/6941055969 : -260151768440137/578280195945297 : 1)
}}}

{{{id=10|
for n in range(10):
    print n, n*P
///
0 (0 : 1 : 0)
1 (-1 : 0 : 1)
2 (6 : -15 : 1)
3 (-20/49 : 92/343 : 1)
4 (1357/841 : -53277/24389 : 1)
5 (8385/98596 : -2882165/30959144 : 1)
6 (12551561/13608721 : -41922509264/50202571769 : 1)
7 (1849037896/6941055969 : -260151768440137/578280195945297 : 1)
8 (4881674119706/5677664356225 : -4590618167456560854/13528653463047586625 : 1)
9 (2786836257692691/16063784753682169 : -1600059682932627475385835/2035972062206737347698803 : 1)
}}}

{{{id=19|

///
}}}

<h1>The Rank</h1>

{{{id=18|
E = EllipticCurve([0,0,1,-1,0])
E.rank()
///
1
}}}

{{{id=17|
E.rank?
///
<html><!--notruncate-->

<div class="docstring">
    
  <p><strong>File:</strong> /home/wstein/sage/sage-4.8.alpha5/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_rational_field.py</p>
<p><strong>Type:</strong> &lt;type &#8216;instancemethod&#8217;&gt;</p>
<p><strong>Definition:</strong> E.rank(use_database=False, verbose=False, only_use_mwrank=True, algorithm=&#8217;mwrank_lib&#8217;, proof=None)</p>
<p><strong>Docstring:</strong></p>
<blockquote>
<div><p>Return the rank of this elliptic curve, assuming no conjectures.</p>
<p>If we fail to provably compute the rank, raises a RuntimeError
exception.</p>
<p>INPUT:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">use_database</span> <span class="pre">(bool)</span></tt> - (default: False), if
True, try to look up the regulator in the Cremona database.</li>
<li><tt class="docutils literal"><span class="pre">verbose</span></tt> - (default: None), if specified changes
the verbosity of mwrank computations. algorithm -</li>
<li><tt class="docutils literal"><span class="pre">-</span> <span class="pre">'mwrank_shell'</span></tt> - call mwrank shell command</li>
<li><tt class="docutils literal"><span class="pre">-</span> <span class="pre">'mwrank_lib'</span></tt> - call mwrank c library</li>
<li><tt class="docutils literal"><span class="pre">only_use_mwrank</span></tt> - (default: True) if False try
using analytic rank methods first.</li>
<li><tt class="docutils literal"><span class="pre">proof</span></tt> - bool or None (default: None, see
proof.elliptic_curve or sage.structure.proof). Note that results
obtained from databases are considered proof = True</li>
</ul>
<p>OUTPUT:</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">rank</span> <span class="pre">(int)</span></tt> - the rank of the elliptic curve.</li>
</ul>
<p>IMPLEMENTATION: Uses L-functions, mwrank, and databases.</p>
<p>EXAMPLES:</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">(</span><span class="s">&#39;11a&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">0</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">(</span><span class="s">&#39;37a&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">1</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">(</span><span class="s">&#39;389a&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">2</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">(</span><span class="s">&#39;5077a&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">3</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">79</span><span class="p">,</span> <span class="mi">289</span><span class="p">])</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>   <span class="c"># This will use the default proof behavior of True</span>
<span class="go">4</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">79</span><span class="p">,</span> <span class="mi">342</span><span class="p">])</span><span class="o">.</span><span class="n">rank</span><span class="p">(</span><span class="n">proof</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="go">5</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="mi">79</span><span class="p">,</span> <span class="mi">342</span><span class="p">])</span><span class="o">.</span><span class="n">simon_two_descent</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="go">5</span>
</pre></div>
</div>
<p>Examples with denominators in defining equations:</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">E</span> <span class="o">=</span> <span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">675</span><span class="o">/</span><span class="mi">4</span><span class="p">])</span>
<span class="gp">sage: </span><span class="n">E</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">0</span>
<span class="gp">sage: </span><span class="n">E</span> <span class="o">=</span> <span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">/</span><span class="mi">5</span><span class="p">])</span>
<span class="gp">sage: </span><span class="n">E</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">1</span>
<span class="gp">sage: </span><span class="n">E</span><span class="o">.</span><span class="n">minimal_model</span><span class="p">()</span><span class="o">.</span><span class="n">rank</span><span class="p">()</span>
<span class="go">1</span>
</pre></div>
</div>
<p>A large example where mwrank doesn&#8217;t determine the result with certainty:</p>
<div class="highlight-python"><div class="highlight"><pre class="literal-block"><span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">37455</span><span class="p">])</span><span class="o">.</span><span class="n">rank</span><span class="p">(</span><span class="n">proof</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="go">0</span>
<span class="gp">sage: </span><span class="n">EllipticCurve</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">37455</span><span class="p">])</span><span class="o">.</span><span class="n">rank</span><span class="p">(</span><span class="n">proof</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="gt">Traceback (most recent call last):</span>
<span class="c">...</span>
<span class="nc">RuntimeError</span>: <span class="n-Identifier">Rank not provably correct.</span>
</pre></div>
</div>
</div></blockquote>


</div>
</html>
}}}

<p>Try a <em>random curve </em><em>(if you try a different one it could take a long time -- press "escape" with the cursor in the box to interrupt)</em>:</p>

{{{id=24|
E = EllipticCurve([2012,3])
print E.rank()
print E.gens()
///
1
[(7753/19044 : 75356155/2628072 : 1)]
}}}

<p>A family</p>

{{{id=25|
def F(a):
    return EllipticCurve([0,(a-1),1,-a,0])
    
for a in [0..20]:
    print a, F(a).rank()
///
0 0
1 1
2 2
3 2
4 3
5 2
6 2
7 3
8 3
9 3
10 2
11 3
12 3
13 3
14 3
15 2
16 4
17 3
18 2
19 3
20 3
}}}

<p>Exercise: Find the first $a$ such that $F(a)$ has rank $5$. &nbsp;Rank $6$.</p>

{{{id=31|

///
}}}

{{{id=33|

///
}}}

<p>Elkies Curve of Rank (at least) 28</p>

{{{id=27|
E = EllipticCurve([1,-1,1,-20067762415575526585033208209338542750930230312178956502,
34481611795030556467032985690390720374855944359319180361266008296291939448732243429])
///
}}}

<p>That the first few good $a_p=p+1-\#E(F_p)$ are negative is evidence that $E$ has high rank:</p>

{{{id=38|
D = E.discriminant(); [p for p in primes(1000) if D%p==0]
///
[2, 3, 5, 7, 11, 13, 17, 19]
}}}

{{{id=29|
for p in primes(20,200):
    print E.ap(p),
///
-9 -10 -8 -11 -10 -12 -12 -9 -12 -15 -16 -16 -15 -13 -18 -16 -13 -6 -20 -12 -20 -19 -11 -16 -10 -22 -17 -9 -24 -12 -23 -22 -7 -10 -7 -22 -22 -25
}}}

<p><strong>Exercise: </strong>What is the smallest good prime $p$ such that $a_p&gt;0$?</p>

{{{id=36|
P = [E([-2124150091254381073292137463, 259854492051899599030515511070780628911531]),
     E([2334509866034701756884754537, 18872004195494469180868316552803627931531]),
     E([-1671736054062369063879038663, 251709377261144287808506947241319126049131]),
     E([2139130260139156666492982137, 36639509171439729202421459692941297527531]),
     E([1534706764467120723885477337, 85429585346017694289021032862781072799531]),
     E([-2731079487875677033341575063, 262521815484332191641284072623902143387531]),
     E([2775726266844571649705458537, 12845755474014060248869487699082640369931]),
     E([1494385729327188957541833817, 88486605527733405986116494514049233411451]),
     E([1868438228620887358509065257, 59237403214437708712725140393059358589131]),
     E([2008945108825743774866542537, 47690677880125552882151750781541424711531]),
     E([2348360540918025169651632937, 17492930006200557857340332476448804363531]),
     E([-1472084007090481174470008663, 246643450653503714199947441549759798469131]), 
     E([2924128607708061213363288937, 28350264431488878501488356474767375899531]),
     E([5374993891066061893293934537, 286188908427263386451175031916479893731531]),
     E([1709690768233354523334008557, 71898834974686089466159700529215980921631]),
     E([2450954011353593144072595187, 4445228173532634357049262550610714736531]),
     E([2969254709273559167464674937, 32766893075366270801333682543160469687531]), 
     E([2711914934941692601332882937, 2068436612778381698650413981506590613531]),
     E([20078586077996854528778328937, 2779608541137806604656051725624624030091531]),
     E([2158082450240734774317810697, 34994373401964026809969662241800901254731]),
     E([2004645458247059022403224937, 48049329780704645522439866999888475467531]),
     E([2975749450947996264947091337, 33398989826075322320208934410104857869131]),
     E([-2102490467686285150147347863, 259576391459875789571677393171687203227531]),
     E([311583179915063034902194537, 168104385229980603540109472915660153473931]),
     E([2773931008341865231443771817, 12632162834649921002414116273769275813451]), 
     E([2156581188143768409363461387, 35125092964022908897004150516375178087331]), 
     E([3866330499872412508815659137, 121197755655944226293036926715025847322531]), 
     E([2230868289773576023778678737, 28558760030597485663387020600768640028531])]
///
}}}

{{{id=42|
P[0] + P[1]
///
(3108017602820373171270912268547263377137814553518653/1146511727644798490358769 : 1802558090655926570845589254141496753576572784929653778538438661217456501493/1227630733053376047702643420235410103 : 1)
}}}

{{{id=43|
time E.regulator_of_points(P[:7])
///
3.04313979267944e11
Time: CPU 3.18 s, Wall: 3.18 s
}}}

{{{id=45|
time E.regulator_of_points(P[:15])
///
1.97964758730350e23
Time: CPU 15.72 s, Wall: 15.71 s
}}}

<p>The following takes about 60 seconds (on my laptop), and shows that the 28 points are independent:</p>

{{{id=46|
time E.regulator_of_points(P)
///
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_38.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("dGltZSBFLnJlZ3VsYXRvcl9vZl9wb2ludHMoUCk="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/tmp/tmpUqfU0_/___code___.py", line 2, in <module>
    exec compile(u'__time__=misc.cputime(); __wall__=misc.walltime(); E.regulator_of_points(P); print "Time: CPU %.2f s, Wall: %.2f s"%(misc.cputime(__time__), misc.walltime(__wall__))' + '\n', '', 'single')
  File "", line 1, in <module>
    
  File "/home/wstein/sage/install/sage-4.8.alpha5/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_number_field.py", line 465, in regulator_of_points
    mat = self.height_pairing_matrix(points=points, precision=precision)
  File "/home/wstein/sage/install/sage-4.8.alpha5/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_number_field.py", line 363, in height_pairing_matrix
    mat[j,k]=((points[j]+points[k]).height(precision=precision) - mat[j,j] - mat[k,k])/2
  File "/home/wstein/sage/install/sage-4.8.alpha5/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_point.py", line 2496, in height
    if self.has_finite_order():
  File "/home/wstein/sage/install/sage-4.8.alpha5/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_point.py", line 2104, in has_finite_order
    return self.order() != oo
  File "/home/wstein/sage/install/sage-4.8.alpha5/local/lib/python2.6/site-packages/sage/schemes/elliptic_curves/ell_point.py", line 2056, in order
    n = int(E.pari_curve().ellorder(self))
  File "gen.pyx", line 6353, in sage.libs.pari.gen.gen.ellorder (sage/libs/pari/gen.c:24847)
KeyboardInterrupt
__SAGE__
}}}

{{{id=47|
points([(x,y) for x,y,_ in P]) + plot(E, color='grey', xmax=2e28, ymin=-50)
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=52|

///
}}}

{{{id=51|

///
}}}

<h1>Primes</h1>

{{{id=50|
prime_range(50)
///
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
}}}

{{{id=48|
primes(50)
///
<generator object primes at 0x5c53d20>
}}}

{{{id=54|
for p in primes(50):
    print p,
///
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
}}}

{{{id=55|
@interact
def _(n=(20,30,..,2000)):
    prime_pi.plot(0, n).show(figsize=[12,3],gridlines=True)
///
}}}

{{{id=58|
time p = 2^43112609 - 1
///
Time: CPU 0.00 s, Wall: 0.01 s
}}}

<p>It takes a while to compute the string representation of $p$.</p>

{{{id=61|
time s_bigp = str(2^43112609 - 1)
len(s_bigp)
///
Time: CPU 14.81 s, Wall: 15.02 s
12978189
}}}

{{{id=57|
@interact
def _(digits = (5,20,..,10000)):
    print "Showing %.5f percent of the digits"%(100*2.0*digits/len(s_bigp))
    print "p = " + s_bigp[:digits] + ' ... ' + s_bigp[-digits:]
///
}}}

{{{id=63|

///
}}}

{{{id=64|
E = EllipticCurve([0,0,1,-1,0]); E
///
Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
}}}

{{{id=62|
E23 = E.change_ring(GF(23)); E23
///
Elliptic Curve defined by y^2 + y = x^3 + 22*x over Finite Field of size 23
}}}

{{{id=56|
E23.plot(pointsize=50, figsize=4, gridlines=True)
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

<p><strong>Exercise:</strong>&nbsp;Make an interact that has a slider letting you select a prime, which plots the graph of $E$ modulo that prime.</p>

{{{id=66|

///
}}}

{{{id=68|

///
}}}

<h1>The <em>L</em>-Series</h1>

{{{id=72|
E = EllipticCurve([0,0,1,-1,0])
L = E.lseries(); L
///
Complex L-series of the Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
}}}

{{{id=71|
show(line([(x,L(x)) for x in [1.5,1.6, .., 8]]), figsize=[8,3], xmin=0, ymin=0)
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=70|
@interact
def _(E = ['y^2 + y = x^3 - x^2', 'y^2 + y = x^3 - x', 
            'a rank 4 curve', 'elkies rank>=28 curve', '2012'],
      B = (30..1000)):
    if E == 'y^2 + y = x^3 - x^2':
        E = EllipticCurve([0,-1,1,0,0])
        r = E.rank()
    elif E == 'y^2 + y = x^3 - x':
        E = EllipticCurve([0,0,1,-1,0])
        r = E.rank()
    elif E == 'a rank 4 curve':
        E = EllipticCurve([1, -1, 0, -79, 289])
        r = 4
    elif E == 'elkies rank>=28 curve':
        E = EllipticCurve([1,-1,1,
    -20067762415575526585033208209338542750930230312178956502,
    34481611795030556467032985690390720374855944359319180361266008296291939448732243429])
        r = ">=28"
    elif E == '2012':
        E = EllipticCurve([0,2012])
        r = "?"
                
    L_approx = 1
    print '%4s%6s%5s%9s%20s'%('p', 'A(p)', 'p/Ap', '  prod p/Ap', 'Rank = %s'%r)
    v = []
    t = ''
    for p in primes(B):
        if E.discriminant()%p:
            Ap = p+1-E.ap(p)
            L_approx *= float(p/Ap)
            t += '%4s%4s%8.3f%8.3f\n'%(p, Ap, float(p/Ap), L_approx)
            v.append((p, L_approx))
    (line(v) + points(v,color='black')).show(figsize=[8,2])
    print t
///
}}}

{{{id=96|

///
}}}

{{{id=95|

///
}}}

<h1>Natural (analytic) continuation</h1>

{{{id=94|
var('x')
f = 1/(1-x)
plot(f, -6, 2, figsize=[4,2], ymax=5, ymin=-5)
///
<html><font color='black'><img src='cell://sage0.png'></font></html>
}}}

{{{id=97|
f.taylor(x,0,5)
///
x^5 + x^4 + x^3 + x^2 + x + 1
}}}

{{{id=99|

///
}}}

{{{id=80|

///
}}}

<h1>The Birch and Swinnerton-Dyer Conjecture:</h1>
<h2>A Rank 1 Curve</h2>

{{{id=82|
E = EllipticCurve([0,0,1,-1,0])
L = E.lseries()
Lser = L.taylor_series(); Lser
///
0.305999773834052*z + 0.186547797268162*z^2 - 0.136791463097188*z^3 + 0.0161066468496401*z^4 + 0.0185955175398802*z^5 + O(z^6)
}}}

{{{id=83|
c = Lser[1]; c
///
0.305999773834052
}}}

{{{id=85|
Omega_E = E.period_lattice().omega(); Omega_E
///
5.98691729246392
}}}

{{{id=84|
Reg_E = E.regulator(); Reg_E
///
0.0511114082399688
}}}

{{{id=65|
# this *uses* the formula; but we do know in this case that Sha_E=1.
Sha_E = E.sha().an(); Sha_E
///
1
}}}

{{{id=89|
prod_cp = E.tamagawa_product_bsd(); prod_cp
///
1
}}}

{{{id=88|
T = E.torsion_order()^2; T
///
1
}}}

{{{id=87|
Omega_E * Reg_E * Sha_E * prod_cp / T^2
///
0.305999773834052
}}}

{{{id=91|

///
}}}

{{{id=90|

///
}}}

<h1></h1>

<h1>A Rank 2 Curve</h1>

{{{id=78|
E = EllipticCurve([0,1,1,-2,0])
L = E.lseries()
Lser = L.taylor_series(); Lser
///
-2.69129566562797e-23 + (1.52514901968783e-23)*z + 0.759316500288427*z^2 - 0.430302337583362*z^3 - 0.193509313829981*z^4 + 0.459971558373642*z^5 + O(z^6)
}}}

{{{id=100|
E.rank()
///
2
}}}

<p>If you solve for the order of the Shafarevich-Tate group in the conjecture:</p>

{{{id=101|
E.sha().an()
///
1.00000000000000
}}}

{{{id=105|
S = E.sha(); S
///
Tate-Shafarevich group for the Elliptic Curve defined by y^2 + y = x^3 + x^2 - 2*x over Rational Field
}}}

<p>The following proves that $p=5, 7$ do not divide the order of this group:</p>

{{{id=103|
S.p_primary_bound(5)
///
0
}}}

{{{id=102|
S.p_primary_bound(7)
///
0
}}}

{{{id=110|

///
}}}

<p><strong>Open Problem: </strong>Prove that the Shafarevich-Tate group of $E$ is <em>finite.</em></p>

{{{id=109|

///
}}}

<h1>A Rank 4 Curve</h1>

{{{id=108|
E = EllipticCurve([0,15,1,-16,0]); E
///
Elliptic Curve defined by y^2 + y = x^3 + 15*x^2 - 16*x over Rational Field
}}}

{{{id=107|
E.rank()
///
4
}}}

{{{id=115|
E.gens()
///
[(-15 : 15 : 1), (-14 : 20 : 1), (-51/4 : 187/8 : 1), (22 : 132 : 1)]
}}}

{{{id=112|
L = E.lseries()
Lser = L.taylor_series(); Lser
///
4.32638791417839e-24 + (-1.96674959799307e-23)*z + (2.05660099586894e-22)*z^2 + (-7.97704812013524e-22)*z^3 + 10.8463853245874*z^4 - 49.3070071384507*z^5 + O(z^6)
}}}

{{{id=117|

///
}}}

<p><strong>Open Problem: &nbsp;</strong><em>Prove</em>&nbsp;that $L(E,s)$ vanishes to order $4$ at $s=1$.&nbsp;</p>
<p>&nbsp;</p>

{{{id=113|

///
}}}