{{{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" /// }}}
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 }}}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 :) }}}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. }}}