{{{id=4| attach "/home/armin/docs/math/sage/root_number.sage" attach "/home/armin/docs/math/sage/demo.sage" attach "/home/armin/docs/math/sage/magma.sage" /// }}}

A simple example over a number field

{{{id=34| K.=NumberField(x^4+2) E = EllipticCurve(K, [1, a, 0, 1+a, 0]); E /// Elliptic Curve defined by y^2 + x*y = x^3 + a*x^2 + (a+1)*x over Number Field in a with defining polynomial x^4 + 2 }}} {{{id=10| problems(E) /// at Fractional ideal (-a - 1) we feel bad and potential good -- at 3 :( at Fractional ideal (-a^2 + a + 1) we feel nonsplit multiplicative :) at Fractional ideal (a^3 + 2*a^2 + a + 1) we feel split multiplicative :) at Fractional ideal (a + 3) we feel nonsplit multiplicative :) at Fractional ideal (a^3 - 2*a^2 - 2*a - 1) we feel split multiplicative :) }}} {{{id=11| root_number(E) /// 1 }}}

For checking, we can employ a wrapper that we wrote around magma_free to check against Magma.

{{{id=12| root_number_magma(E) /// 1 }}}

We can also compute local root numbers:

{{{id=14| for P in E.discriminant().support(): print "Root number at", P, "is", root_number(E, P) /// Root number at Fractional ideal (-a - 1) is 1 Root number at Fractional ideal (-a^2 + a + 1) is 1 Root number at Fractional ideal (a^3 + 2*a^2 + a + 1) is -1 Root number at Fractional ideal (a + 3) is 1 Root number at Fractional ideal (a^3 - 2*a^2 - 2*a - 1) is -1 }}}

Some more testing

Over $\mathbb{Q}$ we can check against Pari.

{{{id=23| L = [] for c in [1..50]: for E in cremona_curves([c]): t = walltime() rn = root_number(E) L.append([E, rn, walltime(t)]) if rn != E.root_number(): print "Nooo.... ", E print len(L), "curves tested in", add([ q[-1] for q in L]), "seconds." L = sorted(L, cmp=lambda a,b: a[-1]>b[-1] and int(-1) or int(1)) print L[0][0].a_invariants(), "was the slowest with", L[0][-1], "seconds." /// 130 curves tested in 26.1332592964 seconds. (0, 1, 0, 3, -1) was the slowest with 3.61284899712 seconds. }}}

More than 90% of the time is spent in E.local_data().

{{{id=28| E = EllipticCurve([0, 1, 0, 3, -1]) problems(E) /// at Principal ideal (2) of Integer Ring we feel bad and potential good -- at 2, d= 6 :( at Principal ideal (11) of Integer Ring we feel nonsplit multiplicative :) }}}

Two conjectures from Tim's lecture

{{{id=39| E = EllipticCurve('19a3'); E /// Elliptic Curve defined by y^2 + y = x^3 + x^2 + x over Rational Field }}} {{{id=41| root_number(E) /// 1 }}}

Conjecture: $E$ has odd rank over $\mathbb{Q}(\sqrt[3]{m})$ for all $m>1$.

{{{id=44| ct = 0; t = walltime() for m in [2..50]: if not m^(1/3) in ZZ: ct += 1 K.
= NumberField(x^3-m) if root_number(E.change_ring(K)) != -1: print "Nooo.... ", m print ct, "curves tested in", walltime(t), "seconds." /// 47 curves tested in 18.0601041317 seconds }}}

Conjecture: Every EC over $\mathbb{Q}$ has even rank over $\mathbb{Q}(\sqrt{-1},\sqrt{17})$

{{{id=56| K.
= NumberField(x^4-32*x^2+324) # i, sqrt(17) ct = 0; t = walltime() for E in cremona_curves([1..20]): ct +=1 if root_number(E.change_ring(K)) != 1: print "Nooo.... ", E print ct, "curves tested in", walltime(t), "seconds." /// 28 curves tested in 38.2222681046 seconds. }}}

Beating Magma?

{{{id=35| K.
= NumberField(x^4-32*x^2+324) # i, sqrt(17) E = EllipticCurve('99a1') E1 = E.change_ring(K).quadratic_twist(a+1); E1 /// Elliptic Curve defined by y^2 = x^3 + (-3*a-3)*x^2 + (-24*a^2-48*a-24)*x + (16*a^3+48*a^2+48*a+16) over Number Field in a with defining polynomial x^4 - 32*x^2 + 324 }}} {{{id=37| problems(E1) /// at Fractional ideal (2, -1/72*a^3 + 1/4*a^2 + 7/36*a - 5) we feel bad and potential good -- at 2, d= 2 :( at Fractional ideal (2, -1/24*a^3 + 13/12*a + 1/2) we feel bad and potential good -- at 2, d= 2 :( at Fractional ideal (a + 1) we feel bad and potential good at Fractional ideal (3, 1/24*a^3 - 1/4*a^2 - 7/12*a + 3) we feel bad and potential good -- at 3 :( at Fractional ideal (3, -1/24*a^3 + 1/4*a^2 + 7/12*a - 5) we feel bad and potential good -- at 3 :( at Fractional ideal (11, a^2 - 19) we feel split multiplicative :) at Fractional ideal (11, a^2 - 13) we feel nonsplit multiplicative :) }}} {{{id=36| time root_number(E1) /// 1 Time: CPU 54.33 s, Wall: 54.33 s }}} {{{id=3| root_number_magma(E1) /// Traceback (most recent call last): File "", line 1, in File "_sage_input_126.py", line 10, in exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("cm9vdF9udW1iZXJfbWFnbWEoRTEp"),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))' + '\n', '', 'single') File "", line 1, in File "/tmp/tmpSDzEWu/___code___.py", line 2, in exec compile(u'root_number_magma(E1)' + '\n', '', 'single') File "", line 1, in File "", line 25, in root_number_magma File "integer.pyx", line 614, in sage.rings.integer.Integer.__init__ (sage/rings/integer.c:6386) TypeError: unable to convert x (= RootNumber( E: Elliptic Curve defined by y^2 = x^3 + (-3*a - 3)*x^2 + (-24*... ) LocalRootNumber( E: Elliptic Curve defined by y^2 = x^3 + (-3*a - 3)*x^2 + (-24*..., P: Prime Ideal Two element generators: [2, 0, 0, 0] [0, 0, 0, 1... ) LocalRootNumberGen( E: Elliptic Curve defined by y^2 + ((1023*$.1 - 1023)*$.1^2 + O... ) RootNumberAdditiveAt2( E: Elliptic Curve defined by y^2 + ((1023*$.1 - 1023)*$.1^2 + O..., loc: > T := TotallyRamifiedExtension( ^ Runtime error in 'TotallyRamifiedExtension': Polynomial must be Eisenstein ) to an integer }}} {{{id=13| /// }}}