Package sage :: Package schemes :: Package elliptic_curves :: Module sha :: Class Sha
[hide private]
[frames] | no frames]

Class Sha

source code

                      object --+    
                               |    
structure.sage_object.SageObject --+
                                   |
                                  Sha

Instance Methods [hide private]
 
__init__(self, E)
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
source code
 
an_numerical(self, prec=53, use_database=False, proof=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a...)
Return the numerical analytic order of Sha, which is a floating point number in all cases.
source code
 
an(self, use_database=False)
Returns the Birch and Swinnerton-Dyer conjectural order of Sha as a provably corret integer, unless the analytic rank is > 1, in which case this function returns a numerical value.
source code
 
an_padic(self, p, prec=0)
Returns the conjectural order -- up to sign -- of Sha(E), according to the $p$-adic analogue of the BSD conjecture.
source code
 
p_primary_bound(self, p)
Returns an upper bound of $\#Sha(E)(p)$.
source code
 
two_selmer_bound(self)
Returns a bound on the dimension of Sha(E)[2], computed using a 2-descent.
source code
 
bound_kolyvagin(self, D=0, regulator=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a..., ignore_nonsurj_hypothesis=False)
Given a fundamental discriminant D (!= -3,-4) that satisfies the Heegner hypothesis, return a list of primes so that Kolyvagin's theorem (as in Gross's paper) implies that any prime divisor of $\#Sha$ is in this list.
source code
 
bound_kato(self)
Returns a list p of primes such that the theorems of Kato's and others (e.g., as explained in a paper/thesis of Grigor Grigorov) imply that if p divides $\#Sha(E)$ then $p$ is in the list.
source code
 
bound(self)
Compute a provably correct bound on the order of the Shafarevich-Tate group of this curve.
source code

Inherited from structure.sage_object.SageObject: __hash__, __new__, __repr__, _axiom_, _axiom_init_, _gap_, _gap_init_, _gp_, _gp_init_, _interface_, _interface_init_, _interface_is_cached_, _kash_, _kash_init_, _macaulay2_, _macaulay2_init_, _magma_, _magma_init_, _maple_, _maple_init_, _mathematica_, _mathematica_init_, _maxima_, _maxima_init_, _octave_, _octave_init_, _pari_, _pari_init_, _r_init_, _sage_, _singular_, _singular_init_, category, db, dump, dumps, plot, rename, reset_name, save, version

Inherited from object: __delattr__, __getattribute__, __reduce__, __reduce_ex__, __setattr__, __str__

Properties [hide private]

Inherited from object: __class__

Method Details [hide private]

__init__(self, E)
(Constructor)

source code 
x.__init__(...) initializes x; see x.__class__.__doc__ for signature

Overrides: object.__init__
(inherited documentation)

an_numerical(self, prec=53, use_database=False, proof=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a...)

source code 

    Return the numerical analytic order of Sha, which is
    a floating point number in all cases.

    INPUT:
        prec -- integer (default: 53) bits precision -- just used
                for the L-series computation; not for regulator, etc. 
        use_database -- whether the rank and regulator should
                be looked up in the database if possible.
        proof -- bool or None (default: None, see proof.[tab] or
                       sage.structure.proof) proof option passed
                onto regulator and rank computation.

    NOTE: See also the an() command, which will return a
    provably correct integer when the rank is 0 or 1.

    EXAMPLES:
        sage: EllipticCurve('11a').sha().an_numerical()
        1.00000000000000
        sage: EllipticCurve('37a').sha().an_numerical()
        1.00000000000000
        sage: EllipticCurve('389a').sha().an_numerical()    # random low order bits
        1.00000000000000
        sage: EllipticCurve('66b3').sha().an_numerical()
        4.00000000000000
        sage: EllipticCurve('5077a').sha().an_numerical()   # random low bit
        1.00000000000000

    A rank 4 curve:
        sage: EllipticCurve([1, -1, 0, -79, 289]).sha().an_numerical()   # long time
        1.00000000000000

A rank 5 curve:
        sage: EllipticCurve([0, 0, 1, -79, 342]).sha().an_numerical(prec=4, proof=False)          # long time -- about 30 seconds.
        1.0                
    

an(self, use_database=False)

source code 

Returns the Birch and Swinnerton-Dyer conjectural order of Sha
as a provably corret integer, unless the analytic rank is > 1,
in which case this function returns a numerical value.

This result is proved correct if the order of vanishing is 0
and the Manin constant is <= 2.

If the optional parameter use_database is True (default:
False), this function returns the analytic order of Sha as
listed in Cremona's tables, if this curve appears in Cremona's
tables.

EXAMPLES:
    sage: E = EllipticCurve([0, -1, 1, -10, -20])   # 11A  = X_0(11)
    sage: E.sha().an()
    1
    sage: E = EllipticCurve([0, -1, 1, 0, 0])       # X_1(11)
    sage: E.sha().an()
    1

    sage: EllipticCurve('14a4').sha().an()
    1
    sage: EllipticCurve('14a4').sha().an(use_database=True)  # optional -- requires large Cremona database package
    1

The smallest conductor curve with nontrivial Sha:
    sage: E = EllipticCurve([1,1,1,-352,-2689])     # 66b3
    sage: E.sha().an()
    4

The four optimal quotients with nontrivial Sha and conductor <= 1000:
    sage: E = EllipticCurve([0, -1, 1, -929, -10595])       # 571A
    sage: E.sha().an()
    4
    sage: E = EllipticCurve([1, 1, 0, -1154, -15345])       # 681B
    sage: E.sha().an()
    9
    sage: E = EllipticCurve([0, -1, 0, -900, -10098])       # 960D
    sage: E.sha().an()
    4
    sage: E = EllipticCurve([0, 1, 0, -20, -42])            # 960N
    sage: E.sha().an()
    4

The smallest conductor curve of rank > 1:
    sage: E = EllipticCurve([0, 1, 1, -2, 0])       # 389A (rank 2)
    sage: E.sha().an()
    0.999999999999998

The following are examples that require computation of the Mordell-Weil
group and regulator:

    sage: E = EllipticCurve([0, 0, 1, -1, 0])                     # 37A  (rank 1)
    sage: E.sha().an()
    1

    sage: E = EllipticCurve("1610f3")
    sage: E.sha().an()
    4

In this case the input curve is not minimal, and if this function didn't
transform it to be minimal, it would give nonsense:
    sage: E = EllipticCurve([0,-432*6^2])
    sage: E.sha().an()
    1

an_padic(self, p, prec=0)

source code 

Returns the conjectural order -- up to sign -- of Sha(E),
according to the $p$-adic analogue of the BSD conjecture.

INPUT:
    p -- a prime > 3
    prec (optional) -- the precision used in the computation of the 
    p-adic L-Series

OUTPUT:
    p-adic number -- that conjecturally equals $\#Sha(E)(p)$ or $-\#Sha(E)(p)$.

NOTE:
    If prec is set to zero (default) then the precision is set so that
    at least the first p-adic digit of conjectural $\#Sha(E)(p)$ is
    determined.

BUG: 
    Currently for supersingular primes for curves of rank > 0, only the 
    first digit will be correct. More is hard to compute anyway.

EXAMPLES:

Good ordinary examples:

    sage: EllipticCurve('11a1').sha().an_padic(5)  #rank 0
    1 + O(5^2)
    sage: EllipticCurve('43a1').sha().an_padic(5)  #rank 1
    1 + O(5)
    sage: EllipticCurve('389a1').sha().an_padic(5,4) #rank 2   (long time)
    1 + O(5^3)
    sage: EllipticCurve('858k2').sha().an_padic(7)  #rank 0, non trivial sha  (long time)
    7^2 + O(7^3)
    
Exceptional cases:

    sage: EllipticCurve('11a1').sha().an_padic(11) #rank 0
    1 + O(11)

The output maybe be only up to sign, as the following two examples illustrate:

    sage: EllipticCurve('123a1').sha().an_padic(41) #rank 1    (long time) -- random output (can be either 1 + O(41) or 40 + O(41)).   
    40 + O(41)
    sage: EllipticCurve('817a1').sha().an_padic(43) #rank 2    (long time)
    42 + O(43) 
    
Supersingular cases:

    sage: EllipticCurve('34a1').sha().an_padic(5) # rank 0     (long time)
    1 + O(5^3)
    sage: EllipticCurve('43a1').sha().an_padic(7) # rank 1    (very long time -- nearly a minute)
    1 + O(7)
    sage: EllipticCurve('1483a1').sha().an_padic(5) # rank 2   (long time)
    1 + O(5)

p_primary_bound(self, p)

source code 

Returns an upper bound of $\#Sha(E)(p)$. 

INPUT:
    p -- a prime > 3

OUTPUT:
    integer -- power of p that bounds #Sha(E)(p) from above

NOTE:
    The result is a proven upper bound on the order of $Sha(E)(p)$.
    So in particular it proves it finiteness even if the rank of 
    the curve is larger than 1. Note also that this bound is sharp
    if one assumes the main conjecture of Iwasawa theory of
    elliptic curves (and this is known in certain cases).

EXAMPLES:
    sage: e = EllipticCurve('858k2')
    sage: e.sha().p_primary_bound(3)           # long time
    0
    sage: e.sha().p_primary_bound(7)           # long time
    2

bound_kolyvagin(self, D=0, regulator=['4ti2-20061025', 'R-2.6.0', 'atlas-3.7.37', 'atlas-3.8.1', 'a..., ignore_nonsurj_hypothesis=False)

source code 

Given a fundamental discriminant D (!= -3,-4) that satisfies the
Heegner hypothesis, return a list of primes so that
Kolyvagin's theorem (as in Gross's paper) implies that any
prime divisor of $\#Sha$ is in this list.

INPUT:
    D -- (optional) a fundamental discriminant < -4 that satisfies the
         Heegner hypothesis for E; if not given, use the first such D
         
    regulator -- (optional) regulator of E(K); if not given, will
                 be computed (which could take a long time)

                 
    ignore_nonsurj_hypothesis (optional: default False) --
              If True, then gives the bound coming from Heegner point
              index, but without any hypothesis on surjectivity
              of the mod-p representation.
              

OUTPUT:
    bound and index

More precisely:

        0 -- if E/K has complex multiplication or analytic rank >= 2
    or 
        B -- list of primes such that if p divides Sha(E/K), then p
             is in B.

    and

        I -- the odd part of the index of the Heegner point in the full
             group of K-rational points on E.  (If E has CM, returns 0.)

REMARKS:
    (1) We do not have to assume that the Manin constant is 1
        (or a power of 2).  If the Manin constant were
        divisible by a prime, that prime would get included in
        the list of bad primes.

    (2) We assume the Gross-Zagier theorem is True under the
        hypothesis that gcd(N,D) = 1, instead of the stronger
        hypothesis gcd(2*N,D)=1 that is in the original
        Gross-Zagier paper.  That Gross-Zagier is true when
        gcd(N,D)=1 is"well-known" to the experts, but doesn't
        seem to written up well in the literature.

    (3) Correctness of the computation is guaranteed using
        interval arithmetic, under the assumption that the
        regulator, square root, and period lattice are
        computed to precision at least $10^{-10}$, i.e., they are
        correct up to addition or a real number with absolute
        value less than $10^{-10}$.

EXAMPLES:
    sage: E = EllipticCurve('37a')
    sage: E.sha().bound_kolyvagin()
    ([2], 1)
    sage: E = EllipticCurve('141a')
    sage: E.sha().an()
    1
    sage: E.sha().bound_kolyvagin()
    ([2, 7], 49)

We get no information the curve has rank $2$.
    sage: E = EllipticCurve('389a')
    sage: E.sha().bound_kolyvagin()
    (0, 0)
    sage: E = EllipticCurve('681b')
    sage: E.sha().an()
    9
    sage: E.sha().bound_kolyvagin()
    ([2, 3], 9)        

bound_kato(self)

source code 

Returns a list p of primes such that the theorems of Kato's
and others (e.g., as explained in a paper/thesis of Grigor
Grigorov) imply that if p divides $\#Sha(E)$ then $p$ is in
the list.

If L(E,1) = 0, then Kato's theorem gives no information, so
this function returns False.

THEOREM (Kato): Suppose p >= 5 is a prime so the p-adic
representation rho_{E,p} is surjective.  Then $ord_p(\#Sha(E))$
divides $ord_p(L(E,1)/Omega_E)$.

EXAMPLES:
    sage: E = EllipticCurve([0, -1, 1, -10, -20])   # 11A  = X_0(11)
    sage: E.sha().bound_kato()
    [2, 3, 5]
    sage: E = EllipticCurve([0, -1, 1, 0, 0])       # X_1(11)
    sage: E.sha().bound_kato()
    [2, 3, 5]
    sage: E = EllipticCurve([1,1,1,-352,-2689])     # 66B3
    sage: E.sha().bound_kato()
    [2, 3]

For the following curve one really has 25 | $\#Sha$ (by Grigorov-Stein paper):
    sage: E = EllipticCurve([1, -1, 0, -332311, -73733731])   # 1058D1
    sage: E.sha().bound_kato()                 # long time (about 1 second)
    [2, 3, 5]
    sage: E.non_surjective()                # long time (about 1 second)
    []

For this one, Sha is divisible by 7.
    sage: E = EllipticCurve([0, 0, 0, -4062871, -3152083138])   # 3364C1
    sage: E.sha().bound_kato()                 # long time (< 10 seconds)
    [2, 3, 7]

No information about curves of rank > 0:
    sage: E = EllipticCurve([0, 0, 1, -1, 0])       # 37A  (rank 1)
    sage: E.sha().bound_kato()
    False

bound(self)

source code 

Compute a provably correct bound on the order of the Shafarevich-Tate
group of this curve. The bound is a either False (no bound) or a list
B of primes such that any divisor of Sha is in this list.