 CoCalc Public Filessupport / 2015-01-27-height.sagews
Authors: Harald Schilly, ℏal Snyder, William A. Stein
Description: Jupyter notebook support/2015-06-04-141749-bokeh.ipynb
E = EllipticCurve('389a')

E.point_search??

   File: /usr/local/sage/sage-6.4/local/lib/python2.7/site-packages/sage/schemes/elliptic_curves/ell_rational_field.py
Source:
def point_search(self, height_limit, verbose=False, rank_bound=None):
"""
Search for points on a curve up to an input bound on the naive
logarithmic height.

INPUT:

-  height_limit (float) - bound on naive height

-  verbose (bool) - (default: False)

If True, report on each point as found together with linear
relations between the points found and the saturation process.

If False, just return the result.

-  rank_bound (bool) - (default: None)

If provided, stop searching for points once we find this many
independent nontorsion points.

OUTPUT: points (list) - list of independent points which generate
the subgroup of the Mordell-Weil group generated by the points
found and then saturated.

.. warning::

height_limit is logarithmic, so increasing by 1 will cause
the running time to increase by a factor of approximately
4.5 (=exp(1.5)).

IMPLEMENTATION: Uses Michael Stoll's ratpoints library.

EXAMPLES::

sage: E=EllipticCurve('389a1')
sage: E.point_search(5, verbose=False)
[(-1 : 1 : 1), (-3/4 : 7/8 : 1)]

Increasing the height_limit takes longer, but finds no more
points::

sage: E.point_search(10, verbose=False)
[(-1 : 1 : 1), (-3/4 : 7/8 : 1)]

In fact this curve has rank 2 so no more than 2 points will ever be
output, but we are not using this fact.

::

sage: E.saturation(_)
([(-1 : 1 : 1), (-3/4 : 7/8 : 1)], 1, 0.152460177943144)

What this shows is that if the rank is 2 then the points listed do
generate the Mordell-Weil group (mod torsion). Finally,

::

sage: E.rank()
2

If we only need one independent generator::

sage: E.point_search(5, verbose=False, rank_bound=1)
[(-2 : 0 : 1)]

"""
from sage.libs.ratpoints import ratpoints
from sage.functions.all import exp
from sage.rings.arith import GCD
H = exp(float(height_limit)) # max(|p|,|q|) <= H, if x = p/q coprime
coeffs = [16*self.b6(), 8*self.b4(), self.b2(), 1]
points = []
a1 = self.a1()
a3 = self.a3()
new_H = H*2 # since we change the x-coord by 2 below
for X,Y,Z in ratpoints(coeffs, new_H, verbose):
if Z == 0: continue
z = 2*Z
x = X/2
y = (Y/z - a1*x - a3*z)/2
d = GCD((x,y,z))
x = x/d
if max(x.numerator().abs(), x.denominator().abs()) <= H:
y = y/d
z = z/d
points.append(self((x,y,z)))
if rank_bound is not None:
points = self.saturation(points, verbose=verbose)
if len(points) == rank_bound:
break
if rank_bound is None:
points = self.saturation(points, verbose=verbose)
return points


search_src("height bound")

libs/ratpoints.pyx:156: # Set the height bound: libs/mwrank/mwrank.pyx:338: The Silverman height bound for this elliptic curve. libs/mwrank/mwrank.pyx:365: The Cremona-Prickett-Siksek height bound for this elliptic curve. libs/mwrank/mwrank.pyx:401: A height bound for this elliptic curve. libs/mwrank/mwrank.pyx:409: Cremona_Prickett-Siksek height bounds. libs/mwrank/mwrank.pyx:1021: - firstlim (int, default 20) -- naive height bound on libs/mwrank/mwrank.pyx:1026: - secondlim (int, default 8) -- naive height bound on libs/mwrank/interface.py:701: Return the Cremona-Prickett-Siksek height bound. This is a libs/mwrank/interface.py:724: Return the Silverman height bound. This is a floating point rings/arith.py:53: A height bound may be specified to indicate the maximum coefficient rings/arith.py:57: only possible minimal polynomial satisfying the height bound, or no rings/arith.py:238: raise NotImplementedError("proof and height bound only implemented for real and complex numbers") schemes/elliptic_curves/height.py:1941: print "height bound in [%s, %s]" % (mu, mu*eps) schemes/elliptic_curves/ell_number_field.py:2113: It can happen that no points are found if the height bounds schemes/elliptic_curves/heegner.py:6542: verbose("Heegner height bound = %s"%h) schemes/elliptic_curves/heegner.py:6688: verbose("Heegner height bound = %s"%h) schemes/elliptic_curves/ell_rational_field.py:2222: Return the Cremona-Prickett-Siksek height bound. This is a schemes/elliptic_curves/ell_rational_field.py:2263: Return the Silverman height bound. This is a positive real schemes/projective/projective_morphism.py:2188: is determined by the height bound B. Then apply the the LLL algorithm to determine if the lift schemes/projective/projective_morphism.py:2199: - B - a positive integer - the height bound for a rational preperiodic point. (optional) matrix/matrix_cyclo_dense.pyx:1674: verbose("using height bound %s"%height_bound, level=echelon_verbose_level)
E = mwrank_EllipticCurve([0, 0, 0, -1002231243161, 0])
E.CPS_height_bound??

   File: /usr/local/sage/sage-6.4/local/lib/python2.7/site-packages/sage/libs/mwrank/interface.py
Source:
def CPS_height_bound(self):
r"""
Return the Cremona-Prickett-Siksek height bound.  This is a
floating point number B such that if P is a point on the
curve, then the naive logarithmic height h(P) is less than
B+\hat{h}(P), where \hat{h}(P) is the canonical height of
P.

.. warning::

We assume the model is minimal!

EXAMPLES::

sage: E = mwrank_EllipticCurve([0, 0, 0, -1002231243161, 0])
sage: E.CPS_height_bound()
14.163198527061496
sage: E = mwrank_EllipticCurve([0,0,1,-7,6])
sage: E.CPS_height_bound()
0.0
"""
return self.__curve.cps_bound()