Also, rigorous lower bounds for the canonical height of non-torsion
points, implementing the algorithms in [CS] (over ) and [TT],
which also refer to [CPS].
AUTHORS:
REFERENCES:
[CS] | (1, 2, 3) J.E.Cremona, and S. Siksek, Computing a Lower Bound for the
Canonical Height on Elliptic Curves over ![]() |
[TT] | (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18) T. Thongjunthug, Computing a lower bound for the canonical height on elliptic curves over number fields, Math. Comp. 79 (2010), pages 2431-2449. |
[CPS] | (1, 2, 3, 4) J.E. Cremona, M. Prickett and S. Siksek, Height Difference Bounds For Elliptic Curves over Number Fields, Journal of Number Theory 116(1) (2006), pages 42-68. |
Class for computing canonical heights of points on elliptic curves defined over number fields, including rigorous lower bounds for the canonical height of non-torsion points.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import EllipticCurveCanonicalHeight
sage: E = EllipticCurve([0,0,0,0,1])
sage: EllipticCurveCanonicalHeight(E)
EllipticCurveCanonicalHeight object associated to Elliptic Curve defined by y^2 = x^3 + 1 over Rational Field
Normally this object would be created like this:
sage: E.height_function()
EllipticCurveCanonicalHeight object associated to Elliptic Curve defined by y^2 = x^3 + 1 over Rational Field
Return the value .
INPUT:
OUTPUT:
The real value as defined in [TT], section 5.
EXAMPLES:
Example 10.2 from [TT]:
sage: K.<i>=QuadraticField(-1)
sage: E = EllipticCurve([0,1-i,i,-i,0])
sage: H = E.height_function()
In [TT] the value is given as 0.772:
sage: RealField(12)( H.B(5, 0.01) )
0.777
Return the value .
INPUT:
OUTPUT:
The value as defined in [TT], section 4.
EXAMPLES:
sage: K.<i>=QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,1+5*i,3+i])
sage: H = E.height_function()
sage: [H.DE(n) for n in srange(1,6)]
[0, 2*log(5) + 2*log(2), 0, 2*log(13) + 2*log(5) + 4*log(2), 0]
Return the norm of the ideal .
OUTPUT:
The norm of the ideal as defined in [TT], section 3.1.
This is
if
is a global minimal model, and in general
measures the non-minimality of
.
EXAMPLES:
sage: K.<i>=QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,1+5*i,3+i])
sage: H = E.height_function()
sage: H.ME()
1
sage: E = EllipticCurve([0,0,0,0,1])
sage: E.height_function().ME()
1
sage: E = EllipticCurve([0,0,0,0,64])
sage: E.height_function().ME()
4096
sage: E.discriminant()/E.minimal_model().discriminant()
4096
Return the union of intervals .
INPUT:
OUTPUT:
The union of intervals defined in [TT]
sectoin 6.1.
EXAMPLES:
An example over :
sage: E = EllipticCurve('389a')
sage: v = QQ.places()[0]
sage: H = E.height_function()
sage: H.S(2,3,v)
([0.224512677391895, 0.274544821597130] U [0.725455178402870, 0.775487322608105])
An example over a number field:
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,0,a])
sage: v = K.real_places()[0]
sage: H = E.height_function()
sage: H.S(9,10,v)
([0.0781194447253472, 0.0823423732016403] U [0.917657626798360, 0.921880555274653])
Return the union of intervals .
INPUT:
OUTPUT:
The union of intervals defined in [TT]
(Lemma 6.1).
EXAMPLES:
An example over :
sage: E = EllipticCurve('389a')
sage: v = QQ.places()[0]
sage: H = E.height_function()
sage: H.S(2,3,v) , H.Sn(2,3,1,v)
(([0.224512677391895, 0.274544821597130] U [0.725455178402870, 0.775487322608105]),
([0.224512677391895, 0.274544821597130] U [0.725455178402870, 0.775487322608105]))
sage: H.Sn(2,3,6,v)
([0.0374187795653158, 0.0457574702661884] U [0.120909196400478, 0.129247887101351] U [0.204085446231982, 0.212424136932855] U [0.287575863067145, 0.295914553768017] U [0.370752112898649, 0.379090803599522] U [0.454242529733812, 0.462581220434684] U [0.537418779565316, 0.545757470266188] U [0.620909196400478, 0.629247887101351] U [0.704085446231982, 0.712424136932855] U [0.787575863067145, 0.795914553768017] U [0.870752112898649, 0.879090803599522] U [0.954242529733812, 0.962581220434684])
An example over a number field:
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,0,a])
sage: v = K.real_places()[0]
sage: H = E.height_function()
sage: H.S(2,3,v) , H.Sn(2,3,1,v)
(([0.142172065860075, 0.172845716928584] U [0.827154283071416, 0.857827934139925]),
([0.142172065860075, 0.172845716928584] U [0.827154283071416, 0.857827934139925]))
sage: H.Sn(2,3,6,v)
([0.0236953443100124, 0.0288076194880974] U [0.137859047178569, 0.142971322356654] U [0.190362010976679, 0.195474286154764] U [0.304525713845236, 0.309637989023321] U [0.357028677643346, 0.362140952821431] U [0.471192380511903, 0.476304655689988] U [0.523695344310012, 0.528807619488097] U [0.637859047178569, 0.642971322356654] U [0.690362010976679, 0.695474286154764] U [0.804525713845236, 0.809637989023321] U [0.857028677643346, 0.862140952821431] U [0.971192380511903, 0.976304655689988])
Return the constant associated to the embedding v.
INPUT:
OUTPUT:
The constant . In the notation of [CPS] (2006) and
[TT] (section 3.2),
. The result is
cached since it only depends on the curve.
EXAMPLES:
Example 1 from [CPS] (2006):
sage: K.<i>=QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,1+5*i,3+i])
sage: H = E.height_function()
sage: alpha = H.alpha(K.places()[0])
sage: alpha
1.12272013439355
Compare with in [CPS]:
sage: 3*alpha.log()
0.347263296676126
Return the base field.
EXAMPLES:
sage: E = EllipticCurve([0,0,0,0,1])
sage: H = E.height_function()
sage: H.base_field()
Rational Field
Returns True iff an intersection of sets is empty.
INPUT:
OUTPUT:
True or False, according as the intersection of the unions of
intervals for
in the list Bk (see
[TT], section 7) is empty or not. When Bk is the list of
for
for some
this
means that all non-torsion points on
with everywhere good
reduction have canonical height strictly greater than
,
by [TT], Proposition 7.8.
EXAMPLES:
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,0,a])
sage: v = K.complex_embeddings()[0]
sage: H = E.height_function()
The following two lines prove that the heights of non-torsion
points on with everywhere good reduction have canonical
height strictly greater than 0.02, but fail to prove the same
for 0.03. For the first proof, using only
is not
sufficient:
sage: H.complex_intersection_is_empty([H.B(n,0.02) for n in [1,2,3]],v) # long time (~6s)
False
sage: H.complex_intersection_is_empty([H.B(n,0.02) for n in [1,2,3,4]],v)
True
sage: H.complex_intersection_is_empty([H.B(n,0.03) for n in [1,2,3,4]],v) # long time (4s)
False
Using enables us to prove the lower bound 0.03. Note
that it takes longer when the result is False than when it
is True:
sage: H.complex_intersection_is_empty([H.B(n,0.03) for n in [1..6]],v)
True
Return the elliptic curve.
EXAMPLES:
sage: E = EllipticCurve([0,0,0,0,1])
sage: H = E.height_function()
sage: H.curve()
Elliptic Curve defined by y^2 = x^3 + 1 over Rational Field
Return the exponent of the group over the residue field at p.
INPUT:
OUTPUT:
A positive integer , the exponent of the group of
nonsingular points on the reduction of the elliptic curve
modulo
. The result is cached.
EXAMPLES:
sage: K.<i>=QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,1+5*i,3+i])
sage: H = E.height_function()
sage: H.e_p(K.prime_above(2))
2
sage: H.e_p(K.prime_above(3))
10
sage: H.e_p(K.prime_above(5))
9
sage: E.conductor().norm().factor()
2^10 * 20921
sage: p1,p2 = K.primes_above(20921)
sage: E.local_data(p1)
Local data at Fractional ideal (40*i + 139):
Reduction type: good
...
sage: H.e_p(p1)
20815
sage: E.local_data(p2)
Local data at Fractional ideal (-40*i + 139):
Reduction type: bad split multiplicative
...
sage: H.e_p(p2)
20920
Return a function approximating the Weierstrass function, with error.
INPUT:
OUTPUT:
A pair of functions fk, err which can be evaluated at complex
numbers (in the correct domain) to give an
approximation to
and an upper bound on the error,
respectively. The Weierstrass function returned is with
respect to the normalised lattice
associated to the
given embedding.
EXAMPLES:
sage: E = EllipticCurve('37a')
sage: L = E.period_lattice()
sage: w1, w2 = L.normalised_basis()
sage: z = CDF(0.3, 0.4)
Compare the value give by the standard elliptic exponential (scaled since fk is with respect to the normalised lattice):
sage: L.elliptic_exponential(z*w2, to_curve=False)[0] * w2 ** 2
-1.82543539306049 - 2.49336319992847*I
to the value given by this function, and see the error:
sage: fk, err = E.height_function().fk_intervals(N=10)
sage: fk(CIF(z))
-1.82543539306049? - 2.49336319992847?*I
sage: err(CIF(z))
2.71750621458744e-31
The same, but in the domain CDF instad of CIF:
sage: fk, err = E.height_function().fk_intervals(N=10, domain=CDF)
sage: fk(z)
-1.82543539306 - 2.49336319993*I
Returns a lower bound for all points of infinite order.
INPUT:
OUTPUT:
A positive real for which it has been established
rigorously that every point of infinite order on the elliptic
curve (defined over its ground field) has canonical height
greater than
, and such that it is not possible (at least
without increasing n_max) to prove the same for
.
EXAMPLES:
Example 1 from [CS] (where the same lower bound of 0.1126 was given):
sage: E = EllipticCurve([1, 0, 1, 421152067, 105484554028056]) # 60490d1
sage: E.height_function().min(.0001, 5)
0.00112632873099
Example 10.1 from [TT] (where a lower bound of 0.18 was given):
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,91-26*i,-144-323*i])
sage: H = E.height_function()
sage: H.min(0.1,4) # long time (8.1s)
0.162104944331
Example 10.2 from [TT]:
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([0,1-i,i,-i,0])
sage: H = E.height_function()
sage: H.min(0.01,5) # long time (4s)
0.0150437964347
In this example the point has height 0.023 so our
lower bound is quite good:
sage: P = E((0,0))
sage: P.height()
0.0230242154471211
Example 10.3 from [TT] (where the same bound of 0.0625 is given):
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,-3*a-a^2,a^2])
sage: H = E.height_function()
sage: H.min(0.1,5) # long time (7s)
0.0625
More examples over :
sage: E = EllipticCurve('37a')
sage: h = E.height_function()
sage: h.min(.01, 5)
0.0398731805749
sage: E.gen(0).height()
0.0511114082399688
After base change the lower bound can decrease:
sage: K.<a> = QuadraticField(-5)
sage: E.change_ring(K).height_function().min(0.5, 10) # long time (8s)
0.0441941738242
sage: E = EllipticCurve('389a')
sage: h = E.height_function()
sage: h.min(0.1, 5)
0.0573127527003
sage: [P.height() for P in E.gens()]
[0.686667083305587, 0.327000773651605]
Returns a lower bound for points of infinite order with good reduction.
INPUT:
OUTPUT:
A positive real for which it has been established
rigorously that every point of infinite order on the elliptic
curve (defined over its ground field), which has good
reduction at all primes, has canonical height greater than
, and such that it is not possible (at least without
increasing n_max) to prove the same for
.
EXAMPLES:
Example 1 from [CS] (where a lower bound of 1.9865 was given):
sage: E = EllipticCurve([1, 0, 1, 421152067, 105484554028056]) # 60490d1
sage: E.height_function().min_gr(.0001, 5)
1.98684388147
Example 10.1 from [TT] (where a lower bound of 0.18 was given):
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,91-26*i,-144-323*i])
sage: H = E.height_function()
sage: H.min_gr(0.1,4) # long time (8.1s)
0.162104944331
Example 10.2 from [TT]:
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([0,1-i,i,-i,0])
sage: H = E.height_function()
sage: H.min_gr(0.01,5)
0.0150437964347
In this example the point has height 0.023 so our
lower bound is quite good:
sage: P = E((0,0))
sage: P.has_good_reduction()
True
sage: P.height()
0.0230242154471211
Example 10.3 from [TT] (where the same bound of 0.25 is given):
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,-3*a-a^2,a^2])
sage: H = E.height_function()
sage: H.min_gr(0.1,5) # long time (7.2s)
0.25
Return the normalised elliptic log of a point with this x-coordinate.
INPUT:
OUTPUT:
A real number in the interval [0.5,1] giving the elliptic
logarithm of a point on with
-coordinate xi, on the
connected component with respect to the embedding
, scaled
by the real period.
EXAMPLES:
An example over :
sage: E = EllipticCurve('389a')
sage: v = QQ.places()[0]
sage: L = E.period_lattice(v)
sage: P = E.lift_x(10/9)
sage: L(P)
1.53151606047462
sage: L(P) / L.real_period()
0.615014189772115
sage: H = E.height_function()
sage: H.psi(10/9,v)
0.615014189772115
An example over a number field:
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,0,a])
sage: P = E.lift_x(1/3*a^2 + a + 5/3)
sage: v = K.real_places()[0]
sage: L = E.period_lattice(v)
sage: L(P)
3.51086196882538
sage: L(P) / L.real_period()
0.867385122699931
sage: xP = v(P.xy()[0])
sage: H = E.height_function()
sage: H.psi(xP,v)
0.867385122699931
sage: H.psi(1.23,v)
0.785854718241495
Returns True iff an intersection of sets is empty.
INPUT:
OUTPUT:
True or False, according as the intersection of the unions of
intervals for
in the list Bk is
empty or not. When Bk is the list of
for
for some
this means that all
non-torsion points on
with everywhere good reduction have
canonical height strictly greater than
, by [TT],
Proposition 6.2.
EXAMPLES:
An example over :
sage: E = EllipticCurve('389a')
sage: v = QQ.places()[0]
sage: H = E.height_function()
The following two lines prove that the heights of non-torsion
points on with everywhere good reduction have canonical
height strictly greater than 0.2, but fail to prove the same
for 0.3:
sage: H.real_intersection_is_empty([H.B(n,0.2) for n in srange(1,10)],v)
True
sage: H.real_intersection_is_empty([H.B(n,0.3) for n in srange(1,10)],v)
False
An example over a number field:
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,0,a])
sage: v = K.real_places()[0]
sage: H = E.height_function()
The following two lines prove that the heights of non-torsion
points on with everywhere good reduction have canonical
height strictly greater than 0.07, but fail to prove the same
for 0.08:
sage: H.real_intersection_is_empty([H.B(n,0.07) for n in srange(1,5)],v) # long time (3.3s)
True
sage: H.real_intersection_is_empty([H.B(n,0.08) for n in srange(1,5)],v)
False
Return the normalised upper half-plane parameter for
the period lattice with respect to the embedding
.
INPUT:
OUTPUT:
(Complex) in the fundamental region
of the upper half-plane.
EXAMPLES:
sage: E = EllipticCurve('37a')
sage: H = E.height_function()
sage: H.tau(QQ.places()[0])
1.22112736076463*I
Return True if we can prove that is a lower bound.
INPUT:
OUTPUT:
True or False, according to whether we succeed in
proving that is a lower bound for the canonical heights
of points of infinite order with everywhere good reduction.
Note
A True result is rigorous; False only means that
the attempt failed: trying again with larger may yield
True.
EXAMPLE:
sage: K.<a> = NumberField(x^3-2)
sage: E = EllipticCurve([0,0,0,0,a])
sage: H = E.height_function()
This curve does have a point of good reduction whose canonical point is approximately 1.68:
sage: P = E.gens()[0]
sage: P.height()
1.68038085233673
sage: P.has_good_reduction()
True
Using we can prove that 0.1 is a lower bound (in fact we
only need
), but not that 0.2 is:
sage: H.test_mu(0.1, 5)
B_1(0.100000000000000) = 1.51580969677387
B_2(0.100000000000000) = 0.932072561526720
True
sage: H.test_mu(0.2, 5)
B_1(0.200000000000000) = 2.04612906979932
B_2(0.200000000000000) = 3.09458988474327
B_3(0.200000000000000) = 27.6251108409484
B_4(0.200000000000000) = 1036.24722370223
B_5(0.200000000000000) = 3.67090854562318e6
False
Since 0.1 is a lower bound we can deduce that the point is
either primitive or divisible by either 2 or 3. In fact it is
primitive:
sage: (P.height()/0.1).sqrt()
4.09924487233530
sage: P.division_points(2)
[]
sage: P.division_points(3)
[]
Return a bound for the Weierstrass -function.
INPUT:
OUTPUT:
(Real) such that
whenever . Given the recurrence relations for the
Laurent series expansion of
, it is easy to see that
there is such a constant
. [Reference?]
EXAMPLES:
sage: E = EllipticCurve('37a')
sage: H = E.height_function()
sage: H.wp_c(QQ.places()[0])
2.68744508779950
sage: K.<i>=QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,1+5*i,3+i])
sage: H = E.height_function()
sage: H.wp_c(K.places()[0])
2.66213425640096
Return a function approximating the Weierstrass function.
INPUT:
OUTPUT:
A function wp which can be evaluated at complex numbers to
give an approximation to
. The Weierstrass function
returned is with respect to the normalised lattice
associated to the given embedding. For
which are not near
a lattice point the function fk is used, otherwise a
better approximation is used.
EXAMPLES:
sage: E = EllipticCurve('37a')
sage: wp = E.height_function().wp_intervals()
sage: z = CDF(0.3, 0.4)
sage: wp(CIF(z))
-1.82543539306049? - 2.4933631999285?*I
sage: L = E.period_lattice()
sage: w1, w2 = L.normalised_basis()
sage: L.elliptic_exponential(z*w2, to_curve=False)[0] * w2^2
-1.82543539306049 - 2.49336319992847*I
sage: z = CDF(0.3, 0.1)
sage: wp(CIF(z))
8.5918243572165? - 5.4751982004351?*I
sage: L.elliptic_exponential(z*w2, to_curve=False)[0] * w2^2
8.59182435721650 - 5.47519820043503*I
Return an array of the values of on an
grid.
INPUT:
OUTPUT:
An array of size either or
whose
entry is the value of the Weierstrass
-function
at
, a grid of points in the
fundamental region for the lattice
.
EXAMPLES:
sage: E = EllipticCurve('37a')
sage: H = E.height_function()
sage: v = QQ.places()[0]
The array of values on the grid shows symmetry, since is
even:
sage: H.wp_on_grid(v,4)
array([[ 25.43920182, 5.28760943, 5.28760943, 25.43920182],
[ 6.05099485, 1.83757786, 1.83757786, 6.05099485],
[ 6.05099485, 1.83757786, 1.83757786, 6.05099485],
[ 25.43920182, 5.28760943, 5.28760943, 25.43920182]])
The array of values on the half-grid:
sage: H.wp_on_grid(v,4,True)
array([[ 25.43920182, 5.28760943],
[ 6.05099485, 1.83757786],
[ 6.05099485, 1.83757786],
[ 25.43920182, 5.28760943]])
A class representing a finite union of closed intervals in
which can be scaled, shifted, intersected, etc.
The intervals are represented as an ordered list of their
endpoints, which may include and
.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: R = UnionOfIntervals([1,2,3,infinity]); R
([1, 2] U [3, +Infinity])
sage: R + 5
([6, 7] U [8, +Infinity])
sage: ~R
([-Infinity, 1] U [2, 3])
sage: ~R | (10*R + 100)
([-Infinity, 1] U [2, 3] U [110, 120] U [130, +Infinity])
Todo
Unify UnionOfIntervals with the class RealSet introduced by trac ticket #13125; see trac ticket #16063.
Returns the finite endpoints of this union of intervals.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: UnionOfIntervals([0,1]).finite_endpoints()
[0, 1]
sage: UnionOfIntervals([-infinity, 0, 1, infinity]).finite_endpoints()
[0, 1]
Return the intersection of a list of UnionOfIntervals.
INPUT:
OUTPUT:
A new UnionOfIntervals instance representing the intersection of the UnionOfIntervals in the list.
Note
This is a class method.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: A = UnionOfIntervals([1,3,5,7]); A
([1, 3] U [5, 7])
sage: B = A+1; B
([2, 4] U [6, 8])
sage: A.intersection([A,B])
([2, 3] U [6, 7])
Returns the intervals in self, as a list of 2-tuples.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: UnionOfIntervals(range(10)).intervals()
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
sage: UnionOfIntervals([-infinity, pi, 17, infinity]).intervals()
[(-Infinity, pi), (17, +Infinity)]
Returns whether self is empty.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: UnionOfIntervals([3,4]).is_empty()
False
sage: all = UnionOfIntervals([-infinity, infinity])
sage: all.is_empty()
False
sage: (~all).is_empty()
True
sage: A = UnionOfIntervals([0,1]) & UnionOfIntervals([2,3])
sage: A.is_empty()
True
Utility function to form the union or intersection of a list of UnionOfIntervals.
INPUT:
OUTPUT:
A new UnionOfIntervals instance representing the subset of ‘RR’ equal to those reals in any/all/condition of the UnionOfIntervals in the list.
Note
This is a static method for the class.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: A = UnionOfIntervals([1,3,5,7]); A
([1, 3] U [5, 7])
sage: B = A+1; B
([2, 4] U [6, 8])
sage: A.join([A,B],any) # union
([1, 4] U [5, 8])
sage: A.join([A,B],all) # intersection
([2, 3] U [6, 7])
sage: A.join([A,B],sum) # symmetric difference
([1, 2] U [3, 4] U [5, 6] U [7, 8])
Return the union of a list of UnionOfIntervals.
INPUT:
OUTPUT:
A new UnionOfIntervals instance representing the union of the UnionOfIntervals in the list.
Note
This is a class method.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import UnionOfIntervals
sage: A = UnionOfIntervals([1,3,5,7]); A
([1, 3] U [5, 7])
sage: B = A+1; B
([2, 4] U [6, 8])
sage: A.union([A,B])
([1, 4] U [5, 8])
Return a Real or Complex interval centered on 0 with radius err.
INPUT:
OUTPUT:
An element of RIF or CIF (as specified), centered on 0, with given radius.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import eps
sage: eps(0.01, True)
0.0?
sage: eps(0.01, False)
0.0? + 0.0?*I
Returns .
INPUT:
OUTPUT:
A real number approximating the value of .
ALGORITHM:
The extreme values must occur at an endpoint of a subinterval of
or at a point where one of
,
,
,
,
is
zero.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import inf_max_abs, UnionOfIntervals
sage: x = polygen(RR)
sage: f = (x-10)^4+1
sage: g = 2*x^3+100
sage: inf_max_abs(f,g,UnionOfIntervals([1,2,3,4,5,6]))
425.638201706391
sage: r0 = (f-g).roots()[0][0]
sage: r0
5.46053402234697
sage: max(abs(f(r0)),abs(g(r0)))
425.638201706391
Returns the minimum of a real-valued complex function on a square.
INPUT:
OUTPUT:
A 2-tuple , where
and
is a CIF element
contained in the disk
, at which
takes its minumum
value.
EXAMPLE:
sage: from sage.schemes.elliptic_curves.height import min_on_disk
sage: f = lambda x: (x^2+100).abs()
sage: s, t = min_on_disk(f, 0.0001)
sage: s, f(s), t
(0.01? + 1.00?*I, 99.01?, 99.0000000000000)
Returns the UnionOfIntervals representing the region where f is non-negative.
INPUT:
OUTPUT:
A UnionOfIntervals representing the set .
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import nonneg_region
sage: x = polygen(RR)
sage: nonneg_region(x^2-1)
([-Infinity, -1.00000000000000] U [1.00000000000000, +Infinity])
sage: nonneg_region(1-x^2)
([-1.00000000000000, 1.00000000000000])
sage: nonneg_region(1-x^3)
([-Infinity, 1.00000000000000])
sage: nonneg_region(x^3-1)
([1.00000000000000, +Infinity])
sage: nonneg_region((x-1)*(x-2))
([-Infinity, 1.00000000000000] U [2.00000000000000, +Infinity])
sage: nonneg_region(-(x-1)*(x-2))
([1.00000000000000, 2.00000000000000])
sage: nonneg_region((x-1)*(x-2)*(x-3))
([1.00000000000000, 2.00000000000000] U [3.00000000000000, +Infinity])
sage: nonneg_region(-(x-1)*(x-2)*(x-3))
([-Infinity, 1.00000000000000] U [2.00000000000000, 3.00000000000000])
sage: nonneg_region(x^4+1)
([-Infinity, +Infinity])
sage: nonneg_region(-x^4-1)
()
Compute the value of in CIF, where
.
INPUT:
EXAMPLES:
sage: from sage.schemes.elliptic_curves.height import rat_term_CIF
sage: z = CIF(0.5,0.2)
sage: rat_term_CIF(z)
-0.172467461182437? + 0.?e-16*I
sage: rat_term_CIF(z, False)
-0.172467461182437? + 0.?e-16*I