An elliptic curve over a number field
can be given
by a Weierstrass equation whose coefficients lie in
or by
using base_extend on an elliptic curve defined over a subfield.
One major difference to elliptic curves over is that there
might not exist a global minimal equation over
, when
does
not have class number one.
Another difference is the lack of understanding of modularity for
general elliptic curves over general number fields.
Currently Sage can obtain local information about for finite places
, it has an interface to Denis Simon’s script for 2-descent, it can compute
the torsion subgroup of the Mordell-Weil group
, and it can work with
isogenies defined over
.
EXAMPLE:
sage: K.<i> = NumberField(x^2+1)
sage: E = EllipticCurve([0,4+i])
sage: E.discriminant()
-3456*i - 6480
sage: P= E([i,2])
sage: P+P
(-2*i + 9/16 : -9/4*i - 101/64 : 1)
sage: E.has_good_reduction(2+i)
True
sage: E.local_data(4+i)
Local data at Fractional ideal (i + 4):
Reduction type: bad additive
Local minimal model: Elliptic Curve defined by y^2 = x^3 + (i+4) over Number Field in i with defining polynomial x^2 + 1
Minimal discriminant valuation: 2
Conductor exponent: 2
Kodaira Symbol: II
Tamagawa Number: 1
sage: E.tamagawa_product_bsd()
1
sage: E.simon_two_descent()
(1, 1, [(i : 2 : 1)])
sage: E.torsion_order()
1
sage: E.isogenies_prime_degree(3)
[Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + (i+4) over Number Field in i with defining polynomial x^2 + 1 to Elliptic Curve defined by y^2 = x^3 + (-27*i-108) over Number Field in i with defining polynomial x^2 + 1]
AUTHORS:
REFERENCE:
Bases: sage.schemes.elliptic_curves.ell_field.EllipticCurve_field
Elliptic curve over a number field.
EXAMPLES:
sage: K.<i>=NumberField(x^2+1)
sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35])
Elliptic Curve defined by y^2 + i*x*y + (i+1)*y = x^3 + (i-1)*x^2 + (24*i+15)*x + (14*i+35) over Number Field in i with defining polynomial x^2 + 1
Return the base extension of self to .
EXAMPLES:
sage: E = EllipticCurve('11a3')
sage: K = QuadraticField(-5, 'a')
sage: E.base_extend(K)
Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 over Number Field in a with defining polynomial x^2 + 5
Check that non-torsion points are remembered when extending the base field (see trac ticket #16034):
sage: E = EllipticCurve([1, 0, 1, -1751, -31352])
sage: K.<d> = QuadraticField(5)
sage: E.gens()
[(52 : 111 : 1)]
sage: EK = E.base_extend(K)
sage: EK.gens()
[(52 : 111 : 1)]
Returns the CM discriminant of the -invariant of this curve.
OUTPUT:
An integer which is either
if this curve
does not
have Complex Multiplication) (CM), or an imaginary quadratic
discriminant if
is the
-invariant of the order with
discriminant
.
Note
If has CM but the discriminant
is not a square in
the base field
then the extra endomorphisms will not be
defined over
. See also has_rational_cm().
EXAMPLES:
sage: EllipticCurve(j=0).cm_discriminant()
-3
sage: EllipticCurve(j=1).cm_discriminant()
Traceback (most recent call last):
...
ValueError: Elliptic Curve defined by y^2 + x*y = x^3 + 36*x + 3455 over Rational Field does not have CM
sage: EllipticCurve(j=1728).cm_discriminant()
-4
sage: EllipticCurve(j=8000).cm_discriminant()
-8
sage: K.<a> = QuadraticField(5)
sage: EllipticCurve(j=282880*a + 632000).cm_discriminant()
-20
sage: K.<a> = NumberField(x^3 - 2)
sage: EllipticCurve(j=31710790944000*a^2 + 39953093016000*a + 50337742902000).cm_discriminant()
-108
Returns the conductor of this elliptic curve as a fractional ideal of the base field.
OUTPUT:
(fractional ideal) The conductor of the curve.
EXAMPLES:
sage: K.<i>=NumberField(x^2+1)
sage: EllipticCurve([i, i - 1, i + 1, 24*i + 15, 14*i + 35]).conductor()
Fractional ideal (21*i - 3)
sage: K.<a>=NumberField(x^2-x+3)
sage: EllipticCurve([1 + a , -1 + a , 1 + a , -11 + a , 5 -9*a ]).conductor()
Fractional ideal (-6*a)
A not so well known curve with everywhere good reduction:
sage: K.<a>=NumberField(x^2-38)
sage: E=EllipticCurve([0,0,0, 21796814856932765568243810*a - 134364590724198567128296995, 121774567239345229314269094644186997594*a - 750668847495706904791115375024037711300])
sage: E.conductor()
Fractional ideal (1)
An example which used to fail (see trac ticket #5307):
sage: K.<w>=NumberField(x^2+x+6)
sage: E=EllipticCurve([w,-1,0,-w-6,0])
sage: E.conductor()
Fractional ideal (86304, w + 5898)
An example raised in trac ticket #11346:
sage: K.<g> = NumberField(x^2 - x - 1)
sage: E1 = EllipticCurve(K,[0,0,0,-1/48,-161/864])
sage: [(p.smallest_integer(),e) for p,e in E1.conductor().factor()]
[(2, 4), (3, 1), (5, 1)]
Given an elliptic curve over a number field and a prime number
,
construct the field
.
INPUT:
OUTPUT:
If map is False, the division field as an absolute number field. If map is True, a tuple (K, phi) where phi is an embedding of the base field in the division field K.
Warning
This takes a very long time when the degree of the division
field is large (e.g. when is large or when the Galois
representation is surjective). The simplify flag also
has a big influence on the running time: sometimes
simplify=False is faster, sometimes simplify=True
(the default) is faster.
EXAMPLES:
The 2-division field is the same as the splitting field of the 2-division polynomial (therefore, it has degree 1, 2, 3 or 6):
sage: E = EllipticCurve('15a1')
sage: K.<b> = E.division_field(2); K
Number Field in b with defining polynomial x
sage: E = EllipticCurve('14a1')
sage: K.<b> = E.division_field(2); K
Number Field in b with defining polynomial x^2 + 5*x + 92
sage: E = EllipticCurve('196b1')
sage: K.<b> = E.division_field(2); K
Number Field in b with defining polynomial x^3 + x^2 - 114*x - 127
sage: E = EllipticCurve('19a1')
sage: K.<b> = E.division_field(2); K
Number Field in b with defining polynomial x^6 + 10*x^5 + 24*x^4 - 212*x^3 + 1364*x^2 + 24072*x + 104292
For odd primes , the division field is either the splitting
field of the
-division polynomial, or a quadratic extension
of it.
sage: E = EllipticCurve('50a1')
sage: F.<a> = E.division_polynomial(3).splitting_field(simplify_all=True); F
Number Field in a with defining polynomial x^6 - 3*x^5 + 4*x^4 - 3*x^3 - 2*x^2 + 3*x + 3
sage: K.<b> = E.division_field(3, simplify_all=True); K
Number Field in b with defining polynomial x^6 - 3*x^5 + 4*x^4 - 3*x^3 - 2*x^2 + 3*x + 3
If we take any quadratic twist, the splitting field of the 3-division polynomial remains the same, but the 3-division field becomes a quadratic extension:
sage: E = E.quadratic_twist(5) # 50b3
sage: F.<a> = E.division_polynomial(3).splitting_field(simplify_all=True); F
Number Field in a with defining polynomial x^6 - 3*x^5 + 4*x^4 - 3*x^3 - 2*x^2 + 3*x + 3
sage: K.<b> = E.division_field(3, simplify_all=True); K
Number Field in b with defining polynomial x^12 - 3*x^11 + 8*x^10 - 15*x^9 + 30*x^8 - 63*x^7 + 109*x^6 - 144*x^5 + 150*x^4 - 120*x^3 + 68*x^2 - 24*x + 4
Try another quadratic twist, this time over a subfield of :
sage: G.<c>,_,_ = F.subfields(3)[0]
sage: E = E.base_extend(G).quadratic_twist(c); E
Elliptic Curve defined by y^2 = x^3 + 5*a0*x^2 + (-200*a0^2)*x + (-42000*a0^2+42000*a0+126000) over Number Field in a0 with defining polynomial x^3 - 3*x^2 + 3*x + 9
sage: K.<b> = E.division_field(3, simplify_all=True); K
Number Field in b with defining polynomial x^12 - 10*x^10 + 55*x^8 - 60*x^6 + 75*x^4 + 1350*x^2 + 2025
Some higher-degree examples:
sage: E = EllipticCurve('11a1')
sage: K.<b> = E.division_field(2); K
Number Field in b with defining polynomial x^6 + 2*x^5 - 48*x^4 - 436*x^3 + 1668*x^2 + 28792*x + 73844
sage: K.<b> = E.division_field(3); K # long time (3s on sage.math, 2014)
Number Field in b with defining polynomial x^48 ...
sage: K.<b> = E.division_field(5); K
Number Field in b with defining polynomial x^4 - x^3 + x^2 - x + 1
sage: E.division_field(5, 'b', simplify=False)
Number Field in b with defining polynomial x^4 + x^3 + 11*x^2 + 41*x + 101
sage: E.base_extend(K).torsion_subgroup() # long time (2s on sage.math, 2014)
Torsion Subgroup isomorphic to Z/5 + Z/5 associated to the Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20) over Number Field in b with defining polynomial x^4 - x^3 + x^2 - x + 1
sage: E = EllipticCurve('27a1')
sage: K.<b> = E.division_field(3); K
Number Field in b with defining polynomial x^2 + 3*x + 9
sage: K.<b> = E.division_field(2); K
Number Field in b with defining polynomial x^6 + 6*x^5 + 24*x^4 - 52*x^3 - 228*x^2 + 744*x + 3844
sage: K.<b> = E.division_field(2, simplify_all=True); K
Number Field in b with defining polynomial x^6 - 3*x^5 + 5*x^3 - 3*x + 1
sage: K.<b> = E.division_field(5); K # long time (4s on sage.math, 2014)
Number Field in b with defining polynomial x^48 ...
sage: K.<b> = E.division_field(7); K # long time (8s on sage.math, 2014)
Number Field in b with defining polynomial x^72 ...
Over a number field:
sage: R.<x> = PolynomialRing(QQ)
sage: K.<i> = NumberField(x^2 + 1)
sage: E = EllipticCurve([0,0,0,0,i])
sage: L.<b> = E.division_field(2); L
Number Field in b with defining polynomial x^4 - x^2 + 1
sage: L.<b>, phi = E.division_field(2, map=True); phi
Ring morphism:
From: Number Field in i with defining polynomial x^2 + 1
To: Number Field in b with defining polynomial x^4 - x^2 + 1
Defn: i |--> -b^3
sage: L.<b>, phi = E.division_field(3, map=True)
sage: L
Number Field in b with defining polynomial x^24 - 6*x^22 - 12*x^21 - 21*x^20 + 216*x^19 + 48*x^18 + 804*x^17 + 1194*x^16 - 13488*x^15 + 21222*x^14 + 44196*x^13 - 47977*x^12 - 102888*x^11 + 173424*x^10 - 172308*x^9 + 302046*x^8 + 252864*x^7 - 931182*x^6 + 180300*x^5 + 879567*x^4 - 415896*x^3 + 1941012*x^2 + 650220*x + 443089
sage: phi
Ring morphism:
From: Number Field in i with defining polynomial x^2 + 1
To: Number Field in b with defining polynomial x^24 ...
Defn: i |--> -215621657062634529/183360797284413355040732*b^23 ...
AUTHORS:
The compatible family of the Galois representation attached to this elliptic curve.
Given an elliptic curve over a number field
and a rational prime number
, the
-torsion
points of
is a representation of the
absolute Galois group of
. As
varies
we obtain the Tate module
which is a
a representation of
on a free
-module
of rank
. As
varies the representations
are compatible.
EXAMPLES:
sage: K = NumberField(x**2 + 1, 'a')
sage: E = EllipticCurve('11a1').change_ring(K)
sage: rho = E.galois_representation()
sage: rho
Compatible family of Galois representations associated to the Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20) over Number Field in a with defining polynomial x^2 + 1
sage: rho.is_surjective(3)
True
sage: rho.is_surjective(5) # long time (4s on sage.math, 2014)
False
sage: rho.non_surjective()
[5]
Return some points of infinite order on this elliptic curve.
Contrary to what the name of this method suggests, the points it returns do not always generate a subgroup of full rank in the Mordell-Weil group, nor are they necessarily linearly independent. Moreover, the number of points can be smaller or larger than what one could expect after calling rank() or rank_bounds().
Note
The optional parameters control the Simon two descent algorithm; see the documentation of simon_two_descent() for more details.
INPUT:
OUTPUT:
A set of points of infinite order given by the Simon two-descent.
Note
For non-quadratic number fields, this code does return, but it takes a long time.
EXAMPLES:
sage: K.<a> = NumberField(x^2 + 23, 'a')
sage: E = EllipticCurve(K, '37')
sage: E == loads(dumps(E))
True
sage: E.gens()
[(0 : 0 : 1), (1/8*a + 5/8 : -3/16*a - 7/16 : 1)]
It can happen that no points are found if the height bounds used in the search are too small (see trac ticket #10745):
sage: K.<y> = NumberField(x^4 + x^2 - 7)
sage: E = EllipticCurve(K, [1, 0, 5*y^2 + 16, 0, 0])
sage: E.gens(lim1=1, lim3=1)
[]
sage: E.rank(), E.gens() # long time (about 3 s)
(1, [(9/25*y^2 + 26/25 : -229/125*y^3 - 67/25*y^2 - 731/125*y - 213/25 : 1)])
Here is a curve of rank 2, yet the list contains many points:
sage: K.<t> = NumberField(x^2-17)
sage: E = EllipticCurve(K,[-4,0])
sage: E.gens()
[(-1/2*t + 1/2 : -1/2*t + 1/2 : 1),
(-2*t + 8 : -8*t + 32 : 1),
(1/2*t + 3/2 : -1/2*t - 7/2 : 1),
(-1/8*t - 7/8 : -1/16*t - 23/16 : 1),
(1/8*t - 7/8 : -1/16*t + 23/16 : 1),
(t + 3 : -2*t - 10 : 1),
(2*t + 8 : -8*t - 32 : 1),
(1/2*t + 1/2 : -1/2*t - 1/2 : 1),
(-1/2*t + 3/2 : -1/2*t + 7/2 : 1),
(t + 7 : -4*t - 20 : 1),
(-t + 7 : -4*t + 20 : 1),
(-t + 3 : -2*t + 10 : 1)]
sage: E.rank()
2
Test that points of finite order are not included (see trac ticket #13593):
sage: E = EllipticCurve("17a3")
sage: K.<t> = NumberField(x^2+3)
sage: EK = E.base_extend(K)
sage: EK.rank()
0
sage: EK.gens()
[]
IMPLEMENTATION:
Uses Denis Simon’s PARI/GP scripts from http://www.math.unicaen.fr/~simon/.
Return a model of self which is integral at all primes.
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: E = EllipticCurve([i/5,i/5,i/5,i/5,i/5])
sage: P1,P2 = K.primes_above(5)
sage: E.global_integral_model()
Elliptic Curve defined by y^2 + (-i)*x*y + (-25*i)*y = x^3 + 5*i*x^2 + 125*i*x + 3125*i over Number Field in i with defining polynomial x^2 + 1
sage: K.<a> = NumberField(x^2-38)
sage: E = EllipticCurve([a,1/2])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 = x^3 + 1444*a*x + 27436 over Number Field in a with defining polynomial x^2 - 38
sage: K.<s> = NumberField(x^2-5)
sage: w = (1+s)/2
sage: E = EllipticCurve(K,[2,w])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 = x^3 + 2*x + (1/2*s+1/2) over Number Field in s with defining polynomial x^2 - 5
sage: K.<v> = NumberField(x^2 + 161*x - 150)
sage: E = EllipticCurve([25105/216*v - 3839/36, 634768555/7776*v - 98002625/1296, 634768555/7776*v - 98002625/1296, 0, 0])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 + (2094779518028859*v-1940492905300351)*x*y + (477997268472544193101178234454165304071127500*v-442791377441346852919930773849502871958097500)*y = x^3 + (26519784690047674853185542622500*v-24566525306469707225840460652500)*x^2 over Number Field in v with defining polynomial x^2 + 161*x - 150
sage: R.<t> = QQ[]
sage: K.<g> = NumberField(t^4 - t^3 - 3*t^2 - t + 1)
sage: E = EllipticCurve([ -43/625*g^3 + 14/625*g^2 - 4/625*g + 706/625, -4862/78125*g^3 - 4074/78125*g^2 - 711/78125*g + 10304/78125, -4862/78125*g^3 - 4074/78125*g^2 - 711/78125*g + 10304/78125, 0,0])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 + (15*g^3-48*g-42)*x*y + (-111510*g^3-162162*g^2-44145*g+37638)*y = x^3 + (-954*g^3-1134*g^2+81*g+576)*x^2 over Number Field in g with defining polynomial t^4 - t^3 - 3*t^2 - t + 1
Returns a model of self that is integral, minimal at all primes.
Note
This is only implemented for class number 1. In general, such a model may or may not exist.
INPUT:
OUTPUT:
A global integral and minimal model.
EXAMPLES:
sage: K.<a> = NumberField(x^2-38)
sage: E = EllipticCurve([0,0,0, 21796814856932765568243810*a - 134364590724198567128296995, 121774567239345229314269094644186997594*a - 750668847495706904791115375024037711300])
sage: E2 = E.global_minimal_model()
sage: E2 # random (the global minimal model is not unique)
Elliptic Curve defined by y^2 + a*x*y + (a+1)*y = x^3 + (a+1)*x^2 + (368258520200522046806318444*a-2270097978636731786720859345)*x + (8456608930173478039472018047583706316424*a-52130038506793883217874390501829588391299) over Number Field in a with defining polynomial x^2 - 38
sage: E2.local_data()
[]
See trac ticket #11347:
sage: K.<g> = NumberField(x^2 - x - 1)
sage: E = EllipticCurve(K,[0,0,0,-1/48,161/864]).integral_model().global_minimal_model(); E
Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 over Number Field in g with defining polynomial x^2 - x - 1
sage: [(p.norm(), e) for p, e in E.conductor().factor()]
[(9, 1), (5, 1)]
sage: [(p.norm(), e) for p, e in E.discriminant().factor()]
[(-5, 2), (9, 1)]
See trac ticket #14472, this used not to work over a relative extension:
sage: K1.<w> = NumberField(x^2+x+1)
sage: m = polygen(K1)
sage: K2.<v> = K1.extension(m^2-w+1)
sage: E = EllipticCurve([0*v,-432])
sage: E.global_minimal_model()
Elliptic Curve defined by y^2 + (v+w+1)*y = x^3 + ((6*w-10)*v+16*w+20) over Number Field in v with defining polynomial x^2 - w + 1 over its base field
Return True if this elliptic curve has (bad) additive reduction at the prime .
INPUT:
OUTPUT:
(bool) True if the curve has additive reduction at , else False.
EXAMPLES:
sage: E=EllipticCurve('27a1')
sage: [(p,E.has_additive_reduction(p)) for p in prime_range(15)]
[(2, False), (3, True), (5, False), (7, False), (11, False), (13, False)]
sage: K.<a>=NumberField(x^3-2)
sage: P17a, P17b = [P for P,e in K.factor(17)]
sage: E = EllipticCurve([0,0,0,0,2*a+1])
sage: [(p,E.has_additive_reduction(p)) for p in [P17a,P17b]]
[(Fractional ideal (4*a^2 - 2*a + 1), False),
(Fractional ideal (2*a + 1), True)]
Return True if this elliptic curve has bad reduction at the prime .
INPUT:
OUTPUT:
(bool) True if the curve has bad reduction at , else False.
Note
This requires determining a local integral minimal model; we do not just check that the discriminant of the current model has valuation zero.
EXAMPLES:
sage: E=EllipticCurve('14a1')
sage: [(p,E.has_bad_reduction(p)) for p in prime_range(15)]
[(2, True), (3, False), (5, False), (7, True), (11, False), (13, False)]
sage: K.<a>=NumberField(x^3-2)
sage: P17a, P17b = [P for P,e in K.factor(17)]
sage: E = EllipticCurve([0,0,0,0,2*a+1])
sage: [(p,E.has_bad_reduction(p)) for p in [P17a,P17b]]
[(Fractional ideal (4*a^2 - 2*a + 1), False),
(Fractional ideal (2*a + 1), True)]
Returns whether or not this curve has a CM -invariant.
OUTPUT:
True if this curve has CM over the algebraic closure of the base field, otherwise False. See also cm_discriminant() and has_rational_cm().
Note
Even if has CM in this sense (that its
-invariant is
a CM
-invariant), since the associated negative
discriminant
is not a square in the base field
, the
extra endomorphisms will not be defined over
. See also
the method has_rational_cm() which tests whether
has extra endomorphisms defined over
or a given
extension of
.
EXAMPLES:
sage: EllipticCurve(j=0).has_cm()
True
sage: EllipticCurve(j=1).has_cm()
False
sage: EllipticCurve(j=1728).has_cm()
True
sage: EllipticCurve(j=8000).has_cm()
True
sage: K.<a> = QuadraticField(5)
sage: EllipticCurve(j=282880*a + 632000).has_cm()
True
sage: K.<a> = NumberField(x^3 - 2)
sage: EllipticCurve(j=31710790944000*a^2 + 39953093016000*a + 50337742902000).has_cm()
True
Return True if this elliptic curve has good reduction at the prime .
INPUT:
OUTPUT:
(bool) – True if the curve has good reduction at , else False.
Note
This requires determining a local integral minimal model; we do not just check that the discriminant of the current model has valuation zero.
EXAMPLES:
sage: E=EllipticCurve('14a1')
sage: [(p,E.has_good_reduction(p)) for p in prime_range(15)]
[(2, False), (3, True), (5, True), (7, False), (11, True), (13, True)]
sage: K.<a>=NumberField(x^3-2)
sage: P17a, P17b = [P for P,e in K.factor(17)]
sage: E = EllipticCurve([0,0,0,0,2*a+1])
sage: [(p,E.has_good_reduction(p)) for p in [P17a,P17b]]
[(Fractional ideal (4*a^2 - 2*a + 1), True),
(Fractional ideal (2*a + 1), False)]
Return True if this elliptic curve has (bad) multiplicative reduction at the prime .
Note
See also has_split_multiplicative_reduction() and has_nonsplit_multiplicative_reduction().
INPUT:
element generating such an ideal.
OUTPUT:
(bool) True if the curve has multiplicative reduction at ,
else False.
EXAMPLES:
sage: E=EllipticCurve('14a1')
sage: [(p,E.has_multiplicative_reduction(p)) for p in prime_range(15)]
[(2, True), (3, False), (5, False), (7, True), (11, False), (13, False)]
sage: K.<a>=NumberField(x^3-2)
sage: P17a, P17b = [P for P,e in K.factor(17)]
sage: E = EllipticCurve([0,0,0,0,2*a+1])
sage: [(p,E.has_multiplicative_reduction(p)) for p in [P17a,P17b]]
[(Fractional ideal (4*a^2 - 2*a + 1), False), (Fractional ideal (2*a + 1), False)]
Return True if this elliptic curve has (bad) non-split multiplicative reduction at the prime .
INPUT:
OUTPUT:
(bool) True if the curve has non-split multiplicative
reduction at , else False.
EXAMPLES:
sage: E=EllipticCurve('14a1')
sage: [(p,E.has_nonsplit_multiplicative_reduction(p)) for p in prime_range(15)]
[(2, True), (3, False), (5, False), (7, False), (11, False), (13, False)]
sage: K.<a>=NumberField(x^3-2)
sage: P17a, P17b = [P for P,e in K.factor(17)]
sage: E = EllipticCurve([0,0,0,0,2*a+1])
sage: [(p,E.has_nonsplit_multiplicative_reduction(p)) for p in [P17a,P17b]]
[(Fractional ideal (4*a^2 - 2*a + 1), False), (Fractional ideal (2*a + 1), False)]
Returns whether or not this curve has CM defined over its base field or a given extension.
INPUT:
OUTPUT:
True if the ring of endomorphisms of this curve over
the given field is larger than ; otherwise False.
See also cm_discriminant() and has_cm().
Note
If has CM but the discriminant
is not a square in
the given field
then the extra endomorphisms will not
be defined over
, and this function will return
False. See also has_cm(). To obtain the CM
discriminant, use cm_discriminant().
EXAMPLES:
sage: E = EllipticCurve(j=0)
sage: E.has_cm()
True
sage: E.has_rational_cm()
False
sage: D = E.cm_discriminant(); D
-3
sage: E.has_rational_cm(QuadraticField(D))
True
sage: E = EllipticCurve(j=1728)
sage: E.has_cm()
True
sage: E.has_rational_cm()
False
sage: D = E.cm_discriminant(); D
-4
sage: E.has_rational_cm(QuadraticField(D))
True
Higher degree examples:
sage: K.<a> = QuadraticField(5)
sage: E = EllipticCurve(j=282880*a + 632000)
sage: E.has_cm()
True
sage: E.has_rational_cm()
False
sage: E.cm_discriminant()
-20
sage: E.has_rational_cm(K.extension(x^2+5,'b'))
True
An error is raised if a field is given which is not an extension of the base field:
sage: E.has_rational_cm(QuadraticField(-20))
Traceback (most recent call last):
...
ValueError: Error in has_rational_cm: Number Field in a with defining polynomial x^2 + 20 is not an extension field of Number Field in a with defining polynomial x^2 - 5
sage: K.<a> = NumberField(x^3 - 2)
sage: E = EllipticCurve(j=31710790944000*a^2 + 39953093016000*a + 50337742902000)
sage: E.has_cm()
True
sage: E.has_rational_cm()
False
sage: D = E.cm_discriminant(); D
-108
sage: E.has_rational_cm(K.extension(x^2+108,'b'))
True
Return True if this elliptic curve has (bad) split multiplicative reduction at the prime .
INPUT:
OUTPUT:
(bool) True if the curve has split multiplicative reduction at
, else False.
EXAMPLES:
sage: E=EllipticCurve('14a1')
sage: [(p,E.has_split_multiplicative_reduction(p)) for p in prime_range(15)]
[(2, False), (3, False), (5, False), (7, True), (11, False), (13, False)]
sage: K.<a>=NumberField(x^3-2)
sage: P17a, P17b = [P for P,e in K.factor(17)]
sage: E = EllipticCurve([0,0,0,0,2*a+1])
sage: [(p,E.has_split_multiplicative_reduction(p)) for p in [P17a,P17b]]
[(Fractional ideal (4*a^2 - 2*a + 1), False), (Fractional ideal (2*a + 1), False)]
Return the canonical height function attached to self.
EXAMPLE:
sage: K.<a> = NumberField(x^2 - 5)
sage: E = EllipticCurve(K, '11a3')
sage: E.height_function()
EllipticCurveCanonicalHeight object associated to Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 over Number Field in a with defining polynomial x^2 - 5
Returns the height pairing matrix of the given points.
INPUT:
EXAMPLES:
sage: E = EllipticCurve([0, 0, 1, -1, 0])
sage: E.height_pairing_matrix()
[0.0511114082399688]
For rank 0 curves, the result is a valid 0x0 matrix:
sage: EllipticCurve('11a').height_pairing_matrix()
[]
sage: E=EllipticCurve('5077a1')
sage: E.height_pairing_matrix([E.lift_x(x) for x in [-2,-7/4,1]], precision=100)
[ 1.3685725053539301120518194471 -1.3095767070865761992624519454 -0.63486715783715592064475542573]
[ -1.3095767070865761992624519454 2.7173593928122930896610589220 1.0998184305667292139777571432]
[-0.63486715783715592064475542573 1.0998184305667292139777571432 0.66820516565192793503314205089]
sage: E = EllipticCurve('389a1')
sage: E = EllipticCurve('389a1')
sage: P,Q = E.point([-1,1,1]),E.point([0,-1,1])
sage: E.height_pairing_matrix([P,Q])
[0.686667083305587 0.268478098806726]
[0.268478098806726 0.327000773651605]
Over a number field:
sage: x = polygen(QQ)
sage: K.<t> = NumberField(x^2+47)
sage: EK = E.base_extend(K)
sage: EK.height_pairing_matrix([EK(P),EK(Q)])
[0.686667083305587 0.268478098806726]
[0.268478098806726 0.327000773651605]
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,i,i])
sage: P = E(-9+4*i,-18-25*i)
sage: Q = E(i,-i)
sage: E.height_pairing_matrix([P,Q])
[ 2.16941934493768 -0.870059380421505]
[-0.870059380421505 0.424585837470709]
sage: E.regulator_of_points([P,Q])
0.164101403936070
Return a model of self which is integral at all primes.
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: E = EllipticCurve([i/5,i/5,i/5,i/5,i/5])
sage: P1,P2 = K.primes_above(5)
sage: E.global_integral_model()
Elliptic Curve defined by y^2 + (-i)*x*y + (-25*i)*y = x^3 + 5*i*x^2 + 125*i*x + 3125*i over Number Field in i with defining polynomial x^2 + 1
sage: K.<a> = NumberField(x^2-38)
sage: E = EllipticCurve([a,1/2])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 = x^3 + 1444*a*x + 27436 over Number Field in a with defining polynomial x^2 - 38
sage: K.<s> = NumberField(x^2-5)
sage: w = (1+s)/2
sage: E = EllipticCurve(K,[2,w])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 = x^3 + 2*x + (1/2*s+1/2) over Number Field in s with defining polynomial x^2 - 5
sage: K.<v> = NumberField(x^2 + 161*x - 150)
sage: E = EllipticCurve([25105/216*v - 3839/36, 634768555/7776*v - 98002625/1296, 634768555/7776*v - 98002625/1296, 0, 0])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 + (2094779518028859*v-1940492905300351)*x*y + (477997268472544193101178234454165304071127500*v-442791377441346852919930773849502871958097500)*y = x^3 + (26519784690047674853185542622500*v-24566525306469707225840460652500)*x^2 over Number Field in v with defining polynomial x^2 + 161*x - 150
sage: R.<t> = QQ[]
sage: K.<g> = NumberField(t^4 - t^3 - 3*t^2 - t + 1)
sage: E = EllipticCurve([ -43/625*g^3 + 14/625*g^2 - 4/625*g + 706/625, -4862/78125*g^3 - 4074/78125*g^2 - 711/78125*g + 10304/78125, -4862/78125*g^3 - 4074/78125*g^2 - 711/78125*g + 10304/78125, 0,0])
sage: E.global_integral_model()
Elliptic Curve defined by y^2 + (15*g^3-48*g-42)*x*y + (-111510*g^3-162162*g^2-44145*g+37638)*y = x^3 + (-954*g^3-1134*g^2+81*g+576)*x^2 over Number Field in g with defining polynomial t^4 - t^3 - 3*t^2 - t + 1
Return true iff self is integral at all primes.
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: E = EllipticCurve([i/5,i/5,i/5,i/5,i/5])
sage: P1,P2 = K.primes_above(5)
sage: Emin = E.global_integral_model()
sage: Emin.is_global_integral_model()
True
Returns whether or not self is isogenous to other.
INPUT:
OUTPUT:
(bool) True if there is an isogeny from curve self to curve other.
EXAMPLES:
sage: x = polygen(QQ, 'x')
sage: F = NumberField(x^2 -2, 's'); F
Number Field in s with defining polynomial x^2 - 2
sage: E1 = EllipticCurve(F, [7,8])
sage: E2 = EllipticCurve(F, [0,5,0,1,0])
sage: E3 = EllipticCurve(F, [0,-10,0,21,0])
sage: E1.is_isogenous(E2)
False
sage: E1.is_isogenous(E1)
True
sage: E2.is_isogenous(E2)
True
sage: E2.is_isogenous(E1)
False
sage: E2.is_isogenous(E3)
True
sage: x = polygen(QQ, 'x')
sage: F = NumberField(x^2 -2, 's'); F
Number Field in s with defining polynomial x^2 - 2
sage: E = EllipticCurve('14a1')
sage: EE = EllipticCurve('14a2')
sage: E1 = E.change_ring(F)
sage: E2 = EE.change_ring(F)
sage: E1.is_isogenous(E2)
True
sage: x = polygen(QQ, 'x')
sage: F = NumberField(x^2 -2, 's'); F
Number Field in s with defining polynomial x^2 - 2
sage: k.<a> = NumberField(x^3+7)
sage: E = EllipticCurve(F, [7,8])
sage: EE = EllipticCurve(k, [2, 2])
sage: E.is_isogenous(EE)
Traceback (most recent call last):
...
ValueError: Second argument must be defined over the same number field.
Some examples from Cremona’s 1981 tables:
sage: K.<i> = QuadraticField(-1)
sage: E1 = EllipticCurve([i + 1, 0, 1, -240*i - 400, -2869*i - 2627])
sage: E1.conductor()
Fractional ideal (-4*i - 7)
sage: E2 = EllipticCurve([1+i,0,1,0,0])
sage: E2.conductor()
Fractional ideal (-4*i - 7)
sage: E1.is_isogenous(E2) # slower (~500ms)
True
sage: E1.is_isogenous(E2, proof=False) # faster (~170ms)
True
In this case E1 and E2 are in fact 9-isogenous, as may be deduced from the following:
sage: E3 = EllipticCurve([i + 1, 0, 1, -5*i - 5, -2*i - 5])
sage: E3.is_isogenous(E1)
True
sage: E3.is_isogenous(E2)
True
sage: E1.isogeny_degree(E2)
9
TESTS:
Check that trac ticket #15890 is fixed:
sage: K.<s> = QuadraticField(229)
sage: c4 = 2173 - 235*(1 - s)/2
sage: c6 = -124369 + 15988*(1 - s)/2
sage: c4c = 2173 - 235*(1 + s)/2
sage: c6c = -124369 + 15988*(1 + s)/2
sage: E = EllipticCurve_from_c4c6(c4, c6)
sage: Ec = EllipticCurve_from_c4c6(c4c, c6c)
sage: E.is_isogenous(Ec)
True
Tests if self is integral at the prime ideal , or at all the
primes if
is a list or tuple.
INPUT:
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: P1,P2 = K.primes_above(5)
sage: E = EllipticCurve([i/5,i/5,i/5,i/5,i/5])
sage: E.is_local_integral_model(P1,P2)
False
sage: Emin = E.local_integral_model(P1,P2)
sage: Emin.is_local_integral_model(P1,P2)
True
Returns a list of -isogenies from self, where
is a
prime.
INPUT:
OUTPUT:
(list) -isogenies for the given
or if
is None, all
isogenies of prime degree (see below for the CM case).
Note
Over , the codomains of the isogenies returned are standard
minimal models.
Note
For curves with rational CM, isogenies of primes degree
exist for infinitely many primes , though there are
only finitely many isogenous curves up to isomoprhism. The
list returned only includes one isogeny of prime degree for
each codomain.
EXAMPLES:
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve(K, [0,0,0,0,1])
sage: isogs = E.isogenies_prime_degree()
sage: [phi.degree() for phi in isogs]
[2, 3]
sage: pol = PolynomialRing(QQ,'x')([1,-3,5,-5,5,-3,1])
sage: L.<a> = NumberField(pol)
sage: js = hilbert_class_polynomial(-23).roots(L,multiplicities=False); len(js)
3
sage: E = EllipticCurve(j=js[0])
sage: len(E.isogenies_prime_degree())
3
TESTS:
sage: E.isogenies_prime_degree(4)
Traceback (most recent call last):
...
ValueError: 4 is not prime.
Returns the isogeny class of this elliptic curve.
OUTPUT:
An instance of the class sage.schemes.elliptic_curves.isogeny_class.IsogenyClass_EC_NumberField. From this object may be obtained a list of curves in the class, a matrix of the degrees of the isogenies between them, and the isogenies themselves.
Note
The curves in the isogeny class will all be minimal
models when the class number is .
EXAMPLES:
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve(K, [0,0,0,0,1])
sage: C = E.isogeny_class(); C
Isogeny class of Elliptic Curve defined by y^2 = x^3 + 1 over Number Field in i with defining polynomial x^2 + 1
The curves in the class (sorted):
sage: [E1.ainvs() for E1 in C]
[(0, 0, 0, -135, -594), (0, 0, 0, -15, 22), (0, 0, 0, 0, -27), (0, 0, 0, 0, 1)]
The matrix of degrees of cyclic isogenies between curves:
sage: C.matrix()
[1 3 2 6]
[3 1 6 2]
[2 6 1 3]
[6 2 3 1]
The array of isogenies themselves is not filled out but only
contains those used to construct the class, the other entries
containing the interger 0. This will be changed when the
class EllipticCurveIsogeny allowed composition. In
this case we used -isogenies to go from 0 to 2 and from 1
to 3, and
-isogenies to go from 0 to 1 and from 2 to 3:
sage: isogs = C.isogenies()
sage: [((i,j),isogs[i][j].degree()) for i in range(4) for j in range(4) if isogs[i][j]!=0]
[((0, 1), 3), ((0, 2), 2), ((1, 3), 2), ((2, 3), 3)]
sage: [((i,j),isogs[i][j].x_rational_map()) for i in range(4) for j in range(4) if isogs[i][j]!=0]
[((0, 1), (x^3 + 18*x^2 + 297*x + 1512)/(x^2 + 18*x + 81)),
((0, 2), (x^2 + 6*x - 27)/(x + 6)),
((1, 3), (x^2 - 2*x - 3)/(x - 2)),
((2, 3), (x^3 - 108)/x^2)]
The isogeny class may be visualized by obtaining its graph and plotting it:
sage: G = C.graph()
sage: G.show(edge_labels=True) # long time
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([1+i, -i, i, 1, 0])
sage: C = E.isogeny_class(); C
Isogeny class of Elliptic Curve defined by y^2 + (i+1)*x*y + i*y = x^3 + (-i)*x^2 + x over Number Field in i with defining polynomial x^2 + 1
sage: len(C)
6
sage: C.matrix()
[ 1 2 6 3 9 18]
[ 2 1 3 6 18 9]
[ 6 3 1 2 6 3]
[ 3 6 2 1 3 6]
[ 9 18 6 3 1 2]
[18 9 3 6 2 1]
sage: [E1.ainvs() for E1 in C]
[(i + 1, -i, i, -240*i - 399, 2869*i + 2627),
(i + 1, -i, i, -485/2*i - 1581/4, 22751/8*i + 10805/4),
(i + 1, -i, i, -125/2*i - 61/4, -1425/8*i + 285/4),
(i + 1, -i, i, -5*i - 4, 2*i + 5),
(i + 1, -i, i, 1, 0),
(i + 1, -i, i, -5/2*i + 19/4, -33/8*i - 11/4)]
An example with CM by :
sage: pol = PolynomialRing(QQ,'x')([1,0,3,0,1])
sage: K.<c> = NumberField(pol)
sage: j = 1480640+565760*c^2
sage: E = EllipticCurve(j=j)
sage: E.has_cm()
True
sage: E.has_rational_cm()
True
sage: E.cm_discriminant()
-20
sage: C = E.isogeny_class()
sage: len(C)
2
sage: C.matrix()
[1 2]
[2 1]
sage: [E.ainvs() for E in C]
[(0,
0,
0,
-2142429020160*c^2 - 5608955658240,
-1803656541954375680*c^2 - 4722034125328875520),
(0,
0,
0,
-1688345640960*c^2 - 4420220682240,
-2589731225505628160*c^2 - 6780004123216445440)]
sage: C.isogenies()[1][0]
Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (-1688345640960*c^2-4420220682240)*x + (-2589731225505628160*c^2-6780004123216445440) over Number Field in c with defining polynomial x^4 + 3*x^2 + 1 to Elliptic Curve defined by y^2 = x^3 + (-34278864322560*c^2-89743290531840)*x + (-115434018685080043520*c^2-302210184021048033280) over Number Field in c with defining polynomial x^4 + 3*x^2 + 1
An example with CM by (class number
):
sage: pol = PolynomialRing(QQ,'x')([1,-3,5,-5,5,-3,1])
sage: L.<a> = NumberField(pol)
sage: js = hilbert_class_polynomial(-23).roots(L,multiplicities=False); len(js)
3
sage: E = EllipticCurve(j=js[0])
sage: E.has_rational_cm()
True
sage: len(E.isogenies_prime_degree())
3
sage: C = E.isogeny_class(); len(C)
6
The reason for the isogeny class having size six while the
class number is only is that the class also contains three
curves with CM by the order of discriminant
,
which also has class number
. The curves in the class are
sorted first by CM discriminant (then lexicographically using
a-invariants):
sage: [F.cm_discriminant() for F in C]
[-23, -23, -23, -92, -92, -92]
splits in the order with discriminant
, into two
primes of order
in the class group, each of which induces
a
-isogeny to a curve with the same endomorphism ring; the
third
-isogeny is to a curve with the smaller endomorphism
ring:
sage: [phi.codomain().cm_discriminant() for phi in E.isogenies_prime_degree()]
[-92, -23, -23]
sage: C.matrix()
[1 2 2 4 2 4]
[2 1 2 2 4 4]
[2 2 1 4 4 2]
[4 2 4 1 3 3]
[2 4 4 3 1 3]
[4 4 2 3 3 1]
The graph of this isogeny class has a shape which does not
occur over : a triangular prism. Note that for curves
without CM, the graph has an edge between two curves if and
only if they are connected by an isogeny of prime degree, and
this degree is uniquely determined by the two curves, but in
the CM case this property does not hold, since for pairs of
curves in the class with the same endomorphism ring
, the
set of degrees of isogenies between them is the set of
integers represented by a primitive integral binary quadratic
form of discriminant
, and this form
represents infinitely many primes. In the matrix we give a
small prime represented by the appropriate form. In this
example, the matrix is formed by four
blocks. The
isogenies of degree
indicated by the upper left
block of the matrix could be replaced by isogenies of any
degree represented by the quadratic form
of
discriminant
. Similarly in the lower right block, the
entries of
could be represented by any integers
represented by the quadratic form
of
discriminant
. In the top right block and lower left
blocks, by contrast, the prime entries
are unique
determined:
sage: G = C.graph()
sage: G.adjacency_matrix()
[0 1 1 0 1 0]
[1 0 1 1 0 0]
[1 1 0 0 0 1]
[0 1 0 0 1 1]
[1 0 0 1 0 1]
[0 0 1 1 1 0]
To display the graph without any edge labels:
G.show() # long time
To display the graph with edge labels: by default, for curves with rational CM, the labels are the coefficients of the associated quadratic forms:
G.show(edge_labels=True) # long time
For an alternative view, first relabel the edges using only 2 labels to distinguish between isogenies between curves with the same endomorphism ring and isogenies between curves with different endomorphism rings, then use a 3-dimensional plot which can be rotated:
sage: for i,j,l in G.edge_iterator(): G.set_edge_label(i,j,l.count(','))
sage: G.show3d(color_by_label=True)
A class number example. First we set up the fields: pol
defines the same field as pol26 but is simpler:
sage: pol26 = hilbert_class_polynomial(-4*26)
sage: pol = x^6-x^5+2*x^4+x^3-2*x^2-x-1
sage: K.<a> = NumberField(pol)
sage: L.<b> = K.extension(x^2+26)
Only of the
-invariants with discriminant -104 are in
, though all are in
:
sage: len(pol26.roots(K))
2
sage: len(pol26.roots(L))
6
We create an elliptic curve defined over with one of the
-invariants in
:
sage: j1 = pol26.roots(K)[0][0]
sage: E = EllipticCurve(j=j1)
sage: E.has_cm()
True
sage: E.has_rational_cm()
False
sage: E.has_rational_cm(L)
True
Over the isogeny class has size
, with
curves for
each of the
-rational
-invariants:
sage: C = E.isogeny_class(); len(C) # long time (~11s)
4
sage: C.matrix() # long time
[ 1 2 13 26]
[ 2 1 26 13]
[13 26 1 2]
[26 13 2 1]
sage: len(Set([EE.j_invariant() for EE in C.curves])) # long time
2
Over , the isogeny class grows to size
(the class
number):
sage: EL = E.change_ring(L)
sage: CL = EL.isogeny_class(); len(CL) # long time (~21s)
6
sage: Set([EE.j_invariant() for EE in CL.curves]) == Set(pol26.roots(L,multiplicities=False)) # long time
True
In each position in the matrix of degrees, we see primes (or
). In fact the set of degrees of cyclic isogenies from
curve
to curve
is infinite, and is the set of all
integers represented by one of the primitive binary quadratic
forms of discriminant
, from which we have selected a
small prime:
sage: CL.matrix() # long time
[1 2 3 3 5 5]
[2 1 5 5 3 3]
[3 5 1 3 2 5]
[3 5 3 1 5 2]
[5 3 2 5 1 3]
[5 3 5 2 3 1]
To see the array of binary quadratic forms:
sage: CL.qf_matrix() # long time
[[[1], [2, 0, 13], [3, -2, 9], [3, -2, 9], [5, -4, 6], [5, -4, 6]],
[[2, 0, 13], [1], [5, -4, 6], [5, -4, 6], [3, -2, 9], [3, -2, 9]],
[[3, -2, 9], [5, -4, 6], [1], [3, -2, 9], [2, 0, 13], [5, -4, 6]],
[[3, -2, 9], [5, -4, 6], [3, -2, 9], [1], [5, -4, 6], [2, 0, 13]],
[[5, -4, 6], [3, -2, 9], [2, 0, 13], [5, -4, 6], [1], [3, -2, 9]],
[[5, -4, 6], [3, -2, 9], [5, -4, 6], [2, 0, 13], [3, -2, 9], [1]]]
As in the non-CM case, the isogeny class may be visualized by obtaining its graph and plotting it. Since there are more edges than in the non-CM case, it may be preferable to omit the edge_labels:
sage: G = C.graph()
sage: G.show(edge_labels=False) # long time
It is possible to display a 3-dimensional plot, with colours to represent the different edge labels, in a form which can be rotated!:
sage: G.show3d(color_by_label=True) # long time
Returns the minimal degree of an isogeny between self and other, or 0 if no isogeny exists.
INPUT:
OUTPUT:
(int) The degree of an isogeny from self to other, or 0.
EXAMPLES:
sage: x = QQ['x'].0
sage: F = NumberField(x^2 -2, 's'); F
Number Field in s with defining polynomial x^2 - 2
sage: E = EllipticCurve('14a1')
sage: EE = EllipticCurve('14a2')
sage: E1 = E.change_ring(F)
sage: E2 = EE.change_ring(F)
sage: E1.isogeny_degree(E2)
2
sage: E2.isogeny_degree(E2)
1
sage: E5 = EllipticCurve('14a5').change_ring(F)
sage: E1.isogeny_degree(E5)
6
sage: E = EllipticCurve('11a1')
sage: [E2.label() for E2 in cremona_curves([11..20]) if E.isogeny_degree(E2)]
['11a1', '11a2', '11a3']
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([1+i, -i, i, 1, 0])
sage: C = E.isogeny_class()
sage: [E.isogeny_degree(F) for F in C]
[9, 18, 6, 3, 1, 2]
Returns the Kodaira Symbol of this elliptic curve at the prime .
INPUT:
OUTPUT:
The Kodaira Symbol of the curve at P, represented as a string.
EXAMPLES:
sage: K.<a>=NumberField(x^2-5)
sage: E=EllipticCurve([20, 225, 750, 625*a + 6875, 31250*a + 46875])
sage: bad_primes = E.discriminant().support(); bad_primes
[Fractional ideal (-a), Fractional ideal (7/2*a - 81/2), Fractional ideal (-a - 52), Fractional ideal (2)]
sage: [E.kodaira_symbol(P) for P in bad_primes]
[I0, I1, I1, II]
sage: K.<a> = QuadraticField(-11)
sage: E = EllipticCurve('11a1').change_ring(K)
sage: [E.kodaira_symbol(P) for P in K(11).support()]
[I10]
Returns an LLL-reduced basis from a given basis, with transform matrix.
INPUT:
OUTPUT: A tuple (newpoints, U) where U is a unimodular integer matrix, new_points is the transform of points by U, such that new_points has LLL-reduced height pairing matrix
Note
If the input points are not independent, the output depends on the undocumented behaviour of PARI’s qflllgram() function when applied to a gram matrix which is not positive definite.
EXAMPLES:
Some examples over :
sage: E = EllipticCurve([0, 1, 1, -2, 42])
sage: Pi = E.gens(); Pi
[(-4 : 1 : 1), (-3 : 5 : 1), (-11/4 : 43/8 : 1), (-2 : 6 : 1)]
sage: Qi, U = E.lll_reduce(Pi)
sage: all(sum(U[i,j]*Pi[i] for i in range(4)) == Qi[j] for j in range(4))
True
sage: sorted(Qi)
[(-4 : 1 : 1), (-3 : 5 : 1), (-2 : 6 : 1), (0 : 6 : 1)]
sage: U.det()
1
sage: E.regulator_of_points(Pi)
4.59088036960573
sage: E.regulator_of_points(Qi)
4.59088036960574
sage: E = EllipticCurve([1,0,1,-120039822036992245303534619191166796374,504224992484910670010801799168082726759443756222911415116])
sage: xi = [2005024558054813068, -4690836759490453344, 4700156326649806635, 6785546256295273860, 6823803569166584943, 7788809602110240789, 27385442304350994620556, 54284682060285253719/4, -94200235260395075139/25, -3463661055331841724647/576, -6684065934033506970637/676, -956077386192640344198/2209, -27067471797013364392578/2809, -25538866857137199063309/3721, -1026325011760259051894331/108241, 9351361230729481250627334/1366561, 10100878635879432897339615/1423249, 11499655868211022625340735/17522596, 110352253665081002517811734/21353641, 414280096426033094143668538257/285204544, 36101712290699828042930087436/4098432361, 45442463408503524215460183165/5424617104, 983886013344700707678587482584/141566320009, 1124614335716851053281176544216033/152487126016]
sage: points = [E.lift_x(x) for x in xi]
sage: newpoints, U = E.lll_reduce(points) # long time (35s on sage.math, 2011)
sage: [P[0] for P in newpoints] # long time
[6823803569166584943, 5949539878899294213, 2005024558054813068, 5864879778877955778, 23955263915878682727/4, 5922188321411938518, 5286988283823825378, 175620639884534615751/25, -11451575907286171572, 3502708072571012181, 1500143935183238709184/225, 27180522378120223419/4, -5811874164190604461581/625, 26807786527159569093, 7404442636649562303, 475656155255883588, 265757454726766017891/49, 7272142121019825303, 50628679173833693415/4, 6951643522366348968, 6842515151518070703, 111593750389650846885/16, 2607467890531740394315/9, -1829928525835506297]
An example to show the explicit use of the height pairing matrix:
sage: E = EllipticCurve([0, 1, 1, -2, 42])
sage: Pi = E.gens()
sage: H = E.height_pairing_matrix(Pi,3)
sage: E.lll_reduce(Pi,height_matrix=H)
(
[1 0 0 1]
[0 1 0 1]
[0 0 0 1]
[(-4 : 1 : 1), (-3 : 5 : 1), (-2 : 6 : 1), (1 : -7 : 1)], [0 0 1 1]
)
Some examples over number fields (see trac ticket #9411):
sage: K.<a> = QuadraticField(-23, 'a')
sage: E = EllipticCurve(K, '37')
sage: E.lll_reduce(E.gens())
(
[ 1 -1]
[(0 : 0 : 1), (-2 : -1/2*a - 1/2 : 1)], [ 0 1]
)
sage: K.<a> = QuadraticField(-5)
sage: E = EllipticCurve(K,[0,a])
sage: points = [E.point([-211/841*a - 6044/841,-209584/24389*a + 53634/24389]),E.point([-17/18*a - 1/9, -109/108*a - 277/108]) ]
sage: E.lll_reduce(points)
(
[(-a + 4 : -3*a + 7 : 1), (-17/18*a - 1/9 : 109/108*a + 277/108 : 1)],
[ 1 0]
[ 1 -1]
)
Local data for this elliptic curve at the prime .
INPUT:
OUTPUT:
If is specified, returns the EllipticCurveLocalData
object associated to the prime
for this curve. Otherwise,
returns a list of such objects, one for each prime
in the
support of the discriminant of this model.
Note
The model is not required to be integral on input.
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: E = EllipticCurve([1 + i, 0, 1, 0, 0])
sage: E.local_data()
[Local data at Fractional ideal (2*i + 1):
Reduction type: bad non-split multiplicative
Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1
Minimal discriminant valuation: 1
Conductor exponent: 1
Kodaira Symbol: I1
Tamagawa Number: 1,
Local data at Fractional ideal (-3*i - 2):
Reduction type: bad split multiplicative
Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1
Minimal discriminant valuation: 2
Conductor exponent: 1
Kodaira Symbol: I2
Tamagawa Number: 2]
sage: E.local_data(K.ideal(3))
Local data at Fractional ideal (3):
Reduction type: good
Local minimal model: Elliptic Curve defined by y^2 + (i+1)*x*y + y = x^3 over Number Field in i with defining polynomial x^2 + 1
Minimal discriminant valuation: 0
Conductor exponent: 0
Kodaira Symbol: I0
Tamagawa Number: 1
An example raised in trac ticket #3897:
sage: E = EllipticCurve([1,1])
sage: E.local_data(3)
Local data at Principal ideal (3) of Integer Ring:
Reduction type: good
Local minimal model: Elliptic Curve defined by y^2 = x^3 + x + 1 over Rational Field
Minimal discriminant valuation: 0
Conductor exponent: 0
Kodaira Symbol: I0
Tamagawa Number: 1
Return a model of self which is integral at the prime ideal
.
Note
The integrality at other primes is not affected, even if
is non-principal.
INPUT:
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: P1,P2 = K.primes_above(5)
sage: E = EllipticCurve([i/5,i/5,i/5,i/5,i/5])
sage: E.local_integral_model((P1,P2))
Elliptic Curve defined by y^2 + (-i)*x*y + (-25*i)*y = x^3 + 5*i*x^2 + 125*i*x + 3125*i over Number Field in i with defining polynomial x^2 + 1
Returns a model which is integral at all primes and minimal at .
INPUT:
OUTPUT:
A model of the curve which is minimal (and integral) at .
Note
The model is not required to be integral on input.
For principal , a generator is used as a uniformizer,
and integrality or minimality at other primes is not
affected. For non-principal
, the minimal model
returned will preserve integrality at other primes, but not
minimality.
EXAMPLES:
sage: K.<a>=NumberField(x^2-5)
sage: E=EllipticCurve([20, 225, 750, 1250*a + 6250, 62500*a + 15625])
sage: P=K.ideal(a)
sage: E.local_minimal_model(P).ainvs()
(0, 1, 0, 2*a - 34, -4*a + 66)
Returns the period lattice of the elliptic curve for the given
embedding of its base field with respect to the differential
.
INPUT:
Note
The precision of the embedding is ignored: we only use the given embedding to determine which embedding into QQbar to use. Once the lattice has been initialized, periods can be computed to arbitrary precision.
EXAMPLES:
First define a field with two real embeddings:
sage: K.<a> = NumberField(x^3-2)
sage: E=EllipticCurve([0,0,0,a,2])
sage: embs=K.embeddings(CC); len(embs)
3
For each embedding we have a different period lattice:
sage: E.period_lattice(embs[0])
Period lattice associated to Elliptic Curve defined by y^2 = x^3 + a*x + 2 over Number Field in a with defining polynomial x^3 - 2 with respect to the embedding Ring morphism:
From: Number Field in a with defining polynomial x^3 - 2
To: Algebraic Field
Defn: a |--> -0.6299605249474365? - 1.091123635971722?*I
sage: E.period_lattice(embs[1])
Period lattice associated to Elliptic Curve defined by y^2 = x^3 + a*x + 2 over Number Field in a with defining polynomial x^3 - 2 with respect to the embedding Ring morphism:
From: Number Field in a with defining polynomial x^3 - 2
To: Algebraic Field
Defn: a |--> -0.6299605249474365? + 1.091123635971722?*I
sage: E.period_lattice(embs[2])
Period lattice associated to Elliptic Curve defined by y^2 = x^3 + a*x + 2 over Number Field in a with defining polynomial x^3 - 2 with respect to the embedding Ring morphism:
From: Number Field in a with defining polynomial x^3 - 2
To: Algebraic Field
Defn: a |--> 1.259921049894873?
Although the original embeddings have only the default precision, we can obtain the basis with higher precision later:
sage: L=E.period_lattice(embs[0])
sage: L.basis()
(1.86405007647981 - 0.903761485143226*I, -0.149344633143919 - 2.06619546272945*I)
sage: L.basis(prec=100)
(1.8640500764798108425920506200 - 0.90376148514322594749786960975*I, -0.14934463314391922099120107422 - 2.0661954627294548995621225062*I)
Return the rank of this elliptic curve, if it can be determined.
Note
The optional parameters control the Simon two descent algorithm; see the documentation of simon_two_descent() for more details.
INPUT:
OUTPUT:
If the upper and lower bounds given by Simon two-descent are the same, then the rank has been uniquely identified and we return this. Otherwise, we raise a ValueError with an error message specifying the upper and lower bounds.
Note
For non-quadratic number fields, this code does return, but it takes a long time.
EXAMPLES:
sage: K.<a> = NumberField(x^2 + 23, 'a')
sage: E = EllipticCurve(K, '37')
sage: E == loads(dumps(E))
True
sage: E.rank()
2
Here is a curve with two-torsion in the Tate-Shafarevich group, so here the bounds given by the algorithm do not uniquely determine the rank:
sage: E = EllipticCurve("15a5")
sage: K.<t> = NumberField(x^2-6)
sage: EK = E.base_extend(K)
sage: EK.rank(lim1=1, lim3=1, limtriv=1)
Traceback (most recent call last):
...
ValueError: There is insufficient data to determine the rank -
2-descent gave lower bound 0 and upper bound 2
IMPLEMENTATION:
Uses Denis Simon’s PARI/GP scripts from http://www.math.unicaen.fr/~simon/.
Returns the lower and upper bounds using simon_two_descent(). The results of simon_two_descent() are cached.
Note
The optional parameters control the Simon two descent algorithm; see the documentation of simon_two_descent() for more details.
INPUT:
OUTPUT:
lower and upper bounds for the rank of the Mordell-Weil group
Note
For non-quadratic number fields, this code does return, but it takes a long time.
EXAMPLES:
sage: K.<a> = NumberField(x^2 + 23, 'a')
sage: E = EllipticCurve(K, '37')
sage: E == loads(dumps(E))
True
sage: E.rank_bounds()
(2, 2)
Here is a curve with two-torsion, again the bounds coincide:
sage: Qrt5.<rt5>=NumberField(x^2-5)
sage: E=EllipticCurve([0,5-rt5,0,rt5,0])
sage: E.rank_bounds()
(1, 1)
Finally an example with non-trivial 2-torsion in Sha. So the 2-descent will not be able to determine the rank, but can only give bounds:
sage: E = EllipticCurve("15a5")
sage: K.<t> = NumberField(x^2-6)
sage: EK = E.base_extend(K)
sage: EK.rank_bounds(lim1=1,lim3=1,limtriv=1)
(0, 2)
IMPLEMENTATION:
Uses Denis Simon’s PARI/GP scripts from http://www.math.unicaen.fr/~simon/.
Return the reduction of the elliptic curve at a place of good reduction.
INPUT:
OUTPUT:
An elliptic curve over a finite field, the residue field of the place.
EXAMPLES:
sage: K.<i> = QuadraticField(-1)
sage: EK = EllipticCurve([0,0,0,i,i+3])
sage: v = K.fractional_ideal(2*i+3)
sage: EK.reduction(v)
Elliptic Curve defined by y^2 = x^3 + 5*x + 8 over Residue field of Fractional ideal (2*i + 3)
sage: EK.reduction(K.ideal(1+i))
Traceback (most recent call last):
...
ValueError: The curve must have good reduction at the place.
sage: EK.reduction(K.ideal(2))
Traceback (most recent call last):
...
ValueError: The ideal must be prime.
sage: K=QQ.extension(x^2+x+1,"a")
sage: E=EllipticCurve([1024*K.0,1024*K.0])
sage: E.reduction(2*K)
Elliptic Curve defined by y^2 + (abar+1)*y = x^3 over Residue field in abar of Fractional ideal (2)
Returns the regulator of the given points on this curve.
INPUT:
EXAMPLES:
sage: E = EllipticCurve('37a1')
sage: P = E(0,0)
sage: Q = E(1,0)
sage: E.regulator_of_points([P,Q])
0.000000000000000
sage: 2*P==Q
True
sage: E = EllipticCurve('5077a1')
sage: points = [E.lift_x(x) for x in [-2,-7/4,1]]
sage: E.regulator_of_points(points)
0.417143558758384
sage: E.regulator_of_points(points,precision=100)
0.41714355875838396981711954462
sage: E = EllipticCurve('389a')
sage: E.regulator_of_points()
1.00000000000000
sage: points = [P,Q] = [E(-1,1),E(0,-1)]
sage: E.regulator_of_points(points)
0.152460177943144
sage: E.regulator_of_points(points, precision=100)
0.15246017794314375162432475705
sage: E.regulator_of_points(points, precision=200)
0.15246017794314375162432475704945582324372707748663081784028
sage: E.regulator_of_points(points, precision=300)
0.152460177943143751624324757049455823243727077486630817840280980046053225683562463604114816
Examples over number fields:
sage: K.<a> = QuadraticField(97)
sage: E = EllipticCurve(K,[1,1])
sage: P = E(0,1)
sage: P.height()
0.476223106404866
sage: E.regulator_of_points([P])
0.476223106404866
sage: E = EllipticCurve('11a1')
sage: x = polygen(QQ)
sage: K.<t> = NumberField(x^2+47)
sage: EK = E.base_extend(K)
sage: T = EK(5,5)
sage: T.order()
5
sage: P = EK(-2, -1/2*t - 1/2)
sage: P.order()
+Infinity
sage: EK.regulator_of_points([P,T]) # random very small output
-1.23259516440783e-32
sage: EK.regulator_of_points([P,T]).abs() < 1e-30
True
sage: E = EllipticCurve('389a1')
sage: P,Q = E.gens()
sage: E.regulator_of_points([P,Q])
0.152460177943144
sage: K.<t> = NumberField(x^2+47)
sage: EK = E.base_extend(K)
sage: EK.regulator_of_points([EK(P),EK(Q)])
0.152460177943144
sage: K.<i> = QuadraticField(-1)
sage: E = EllipticCurve([0,0,0,i,i])
sage: P = E(-9+4*i,-18-25*i)
sage: Q = E(i,-i)
sage: E.height_pairing_matrix([P,Q])
[ 2.16941934493768 -0.870059380421505]
[-0.870059380421505 0.424585837470709]
sage: E.regulator_of_points([P,Q])
0.164101403936070
Return lower and upper bounds on the rank of the Mordell-Weil
group and a list of points.
This method is used internally by the rank(), rank_bounds() and gens() methods.
INPUT:
OUTPUT: a triple (lower, upper, list) consisting of
The integer upper is in fact an upper bound on the
dimension of the 2-Selmer group, hence on the dimension of
. It is equal to the dimension of the 2-Selmer
group except possibly if
has dimension 1. In that
case, upper may exceed the dimension of the 2-Selmer group
by an even number, due to the fact that the algorithm does not
perform a second descent.
Note
For non-quadratic number fields, this code does return, but it takes a long time.
ALGORITHM:
Uses Denis Simon’s PARI/GP scripts from http://www.math.unicaen.fr/~simon/.
EXAMPLES:
sage: K.<a> = NumberField(x^2 + 23, 'a')
sage: E = EllipticCurve(K, '37')
sage: E == loads(dumps(E))
True
sage: E.simon_two_descent()
(2, 2, [(0 : 0 : 1), (1/8*a + 5/8 : -3/16*a - 7/16 : 1)])
sage: E.simon_two_descent(lim1=3, lim3=20, limtriv=5, maxprob=7, limbigprime=10)
(2, 2, [(-1 : 0 : 1), (-1/8*a + 5/8 : -3/16*a - 9/16 : 1)])
sage: K.<a> = NumberField(x^2 + 7, 'a')
sage: E = EllipticCurve(K, [0,0,0,1,a]); E
Elliptic Curve defined by y^2 = x^3 + x + a over Number Field in a with defining polynomial x^2 + 7
sage: v = E.simon_two_descent(verbose=1); v
elliptic curve: Y^2 = x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)
Trivial points on the curve = [[1, 1, 0], [Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7), 1]]
#S(E/K)[2] = 2
#E(K)/2E(K) = 2
#III(E/K)[2] = 1
rank(E/K) = 1
listpoints = [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7), 1]]
(1, 1, [(1/2*a + 3/2 : -a - 2 : 1)])
sage: v = E.simon_two_descent(verbose=2)
K = bnfinit(y^2 + 7);
a = Mod(y,K.pol);
bnfellrank(K, [0, 0, 0, 1, a], [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]]);
elliptic curve: Y^2 = x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)
A = 0
B = Mod(1, y^2 + 7)
C = Mod(y, y^2 + 7)
Computing L(S,2)
L(S,2) = [Mod(Mod(-1, y^2 + 7)*x^2 + Mod(-1/2*y + 1/2, y^2 + 7)*x + 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(Mod(-1, y^2 + 7)*x^2 + Mod(-1/2*y - 1/2, y^2 + 7)*x + 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(-1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(x^2 + 2, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(Mod(1, y^2 + 7)*x + Mod(1/2*y + 3/2, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(Mod(1, y^2 + 7)*x + Mod(1/2*y - 3/2, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))]
Computing the Selmer group
#LS2gen = 2
LS2gen = [Mod(Mod(-5, y^2 + 7)*x^2 + Mod(-3*y, y^2 + 7)*x + Mod(8, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7)), Mod(Mod(1, y^2 + 7)*x^2 + Mod(1/2*y - 1/2, y^2 + 7)*x - 1, x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))]
Search for trivial points on the curve
Trivial points on the curve = [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)], [1, 1, 0], [Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7), 1]]
zc = Mod(Mod(-5, y^2 + 7)*x^2 + Mod(-3*y, y^2 + 7)*x + Mod(8, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
Hilbert symbol (Mod(2, y^2 + 7),Mod(-5, y^2 + 7)) =
zc = Mod(Mod(1, y^2 + 7)*x^2 + Mod(1/2*y - 1/2, y^2 + 7)*x + Mod(-1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
Hilbert symbol (Mod(-2*y + 2, y^2 + 7),Mod(1, y^2 + 7)) =
sol of quadratic equation = [1, 0, 1]~
zc*z1^2 = Mod(Mod(2*y - 2, y^2 + 7)*x + Mod(2*y + 10, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
quartic: (-1/2*y + 1/2)*Y^2 = x^4 + (-3*y - 15)*x^2 + (-8*y - 16)*x + (-11/2*y - 15/2)
reduced: Y^2 = (-1/2*y + 1/2)*x^4 - 4*x^3 + (-3*y + 3)*x^2 + (2*y - 2)*x + (1/2*y + 3/2)
not ELS at [2, [0, 1]~, 1, 1, [1, -2; 1, 0]]
zc = Mod(Mod(1, y^2 + 7)*x^2 + Mod(1/2*y + 1/2, y^2 + 7)*x + Mod(-1, y^2 + 7), x^3 + Mod(1, y^2 + 7)*x + Mod(y, y^2 + 7))
comes from the trivial point [Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]
m1 = 1
m2 = 1
#S(E/K)[2] = 2
#E(K)/2E(K) = 2
#III(E/K)[2] = 1
rank(E/K) = 1
listpoints = [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]]
v = [1, 1, [[Mod(1/2*y + 3/2, y^2 + 7), Mod(-y - 2, y^2 + 7)]]]
sage: v
(1, 1, [(1/2*a + 3/2 : -a - 2 : 1)])
A curve with 2-torsion:
sage: K.<a> = NumberField(x^2 + 7)
sage: E = EllipticCurve(K, '15a')
sage: E.simon_two_descent() # long time (3s on sage.math, 2013), points can vary
(1, 3, [...])
Check that the bug reported in trac ticket #15483 is fixed:
sage: K.<s> = QuadraticField(229)
sage: c4 = 2173 - 235*(1 - s)/2
sage: c6 = -124369 + 15988*(1 - s)/2
sage: E = EllipticCurve([-c4/48, -c6/864])
sage: E.simon_two_descent()
(0, 0, [])
sage: R.<t> = QQ[]
sage: L.<g> = NumberField(t^3 - 9*t^2 + 13*t - 4)
sage: E1 = EllipticCurve(L,[1-g*(g-1),-g^2*(g-1),-g^2*(g-1),0,0])
sage: E1.rank() # long time (about 5 s)
0
sage: K = CyclotomicField(43).subfields(3)[0][0]
sage: E = EllipticCurve(K, '37')
sage: E.simon_two_descent() # long time (4s on sage.math, 2013)
(3, 3, [(0 : 0 : 1), (-1/4*zeta43_0^2 - 1/2*zeta43_0 + 3 : -3/8*zeta43_0^2 - 3/4*zeta43_0 + 4 : 1)])
Returns the Tamagawa index of this elliptic curve at the prime .
INPUT:
OUTPUT:
(positive integer) The Tamagawa index of the curve at P.
EXAMPLES:
sage: K.<a>=NumberField(x^2-5)
sage: E=EllipticCurve([20, 225, 750, 625*a + 6875, 31250*a + 46875])
sage: [E.tamagawa_exponent(P) for P in E.discriminant().support()]
[1, 1, 1, 1]
sage: K.<a> = QuadraticField(-11)
sage: E = EllipticCurve('11a1').change_ring(K)
sage: [E.tamagawa_exponent(P) for P in K(11).support()]
[10]
Returns the Tamagawa number of this elliptic curve at the prime .
INPUT:
OUTPUT:
(positive integer) The Tamagawa number of the curve at .
EXAMPLES:
sage: K.<a>=NumberField(x^2-5)
sage: E=EllipticCurve([20, 225, 750, 625*a + 6875, 31250*a + 46875])
sage: [E.tamagawa_number(P) for P in E.discriminant().support()]
[1, 1, 1, 1]
sage: K.<a> = QuadraticField(-11)
sage: E = EllipticCurve('11a1').change_ring(K)
sage: [E.tamagawa_number(P) for P in K(11).support()]
[10]
Return a list of all Tamagawa numbers for all prime divisors of the conductor (in order).
EXAMPLES:
sage: e = EllipticCurve('30a1')
sage: e.tamagawa_numbers()
[2, 3, 1]
sage: vector(e.tamagawa_numbers())
(2, 3, 1)
sage: K.<a>=NumberField(x^2+3)
sage: eK = e.base_extend(K)
sage: eK.tamagawa_numbers()
[4, 6, 1]
Given an elliptic curve over a number field
, this function returns the
integer
that appears in the Birch and Swinnerton-Dyer conjecture accounting
for the local information at finite places. If the model is a global minimal model then
is
simply the product of the Tamagawa numbers
where
runs over all prime ideals of
. Otherwise, if the model has to be changed at a place
a correction factor appears.
The definition is such that
times the periods at the infinite places is invariant
under change of the Weierstrass model. See [Ta2] and [Do] for details.
Note
This definition is slightly different from the definition of tamagawa_product
for curves defined over . Over the rational number it is always defined to be the product
of the Tamagawa numbers, so the two definitions only agree when the model is global minimal.
OUTPUT:
A rational number
EXAMPLES:
sage: K.<i> = NumberField(x^2+1)
sage: E = EllipticCurve([0,2+i])
sage: E.tamagawa_product_bsd()
1
sage: E = EllipticCurve([(2*i+1)^2,i*(2*i+1)^7])
sage: E.tamagawa_product_bsd()
4
An example where the Neron model changes over K:
sage: K.<t> = NumberField(x^5-10*x^3+5*x^2+10*x+1)
sage: E = EllipticCurve(K,'75a1')
sage: E.tamagawa_product_bsd()
5
sage: da = E.local_data()
sage: [dav.tamagawa_number() for dav in da]
[1, 1]
An example over (trac ticket #9413):
sage: E = EllipticCurve('30a')
sage: E.tamagawa_product_bsd()
6
REFERENCES:
Returns the order of the torsion subgroup of this elliptic curve.
OUTPUT:
(integer) the order of the torsion subgroup of this elliptic curve.
EXAMPLES:
sage: E = EllipticCurve('11a1')
sage: K.<t> = NumberField(x^4 + x^3 + 11*x^2 + 41*x + 101)
sage: EK = E.base_extend(K)
sage: EK.torsion_order() # long time (2s on sage.math, 2014)
25
sage: E = EllipticCurve('15a1')
sage: K.<t> = NumberField(x^2 + 2*x + 10)
sage: EK = E.base_extend(K)
sage: EK.torsion_order()
16
sage: E = EllipticCurve('19a1')
sage: K.<t> = NumberField(x^9-3*x^8-4*x^7+16*x^6-3*x^5-21*x^4+5*x^3+7*x^2-7*x+1)
sage: EK = E.base_extend(K)
sage: EK.torsion_order()
9
sage: K.<i> = QuadraticField(-1)
sage: EK = EllipticCurve([0,0,0,i,i+3])
sage: EK.torsion_order()
1
Returns a list of the torsion points of this elliptic curve.
OUTPUT:
(list) A sorted list of the torsion points.
EXAMPLES:
sage: E = EllipticCurve('11a1')
sage: E.torsion_points()
[(0 : 1 : 0), (5 : -6 : 1), (5 : 5 : 1), (16 : -61 : 1), (16 : 60 : 1)]
sage: K.<t> = NumberField(x^4 + x^3 + 11*x^2 + 41*x + 101)
sage: EK = E.base_extend(K)
sage: EK.torsion_points() # long time (1s on sage.math, 2014)
[(16 : 60 : 1),
(5 : 5 : 1),
(5 : -6 : 1),
(16 : -61 : 1),
(t : 1/11*t^3 + 6/11*t^2 + 19/11*t + 48/11 : 1),
(-3/55*t^3 - 7/55*t^2 - 2/55*t - 133/55 : 6/55*t^3 + 3/55*t^2 + 25/11*t + 156/55 : 1),
(-9/121*t^3 - 21/121*t^2 - 127/121*t - 377/121 : -7/121*t^3 + 24/121*t^2 + 197/121*t + 16/121 : 1),
(5/121*t^3 - 14/121*t^2 - 158/121*t - 453/121 : -49/121*t^3 - 129/121*t^2 - 315/121*t - 207/121 : 1),
(10/121*t^3 + 49/121*t^2 + 168/121*t + 73/121 : 32/121*t^3 + 60/121*t^2 - 261/121*t - 807/121 : 1),
(1/11*t^3 - 5/11*t^2 + 19/11*t - 40/11 : -6/11*t^3 - 3/11*t^2 - 26/11*t - 321/11 : 1),
(14/121*t^3 - 15/121*t^2 + 90/121*t + 232/121 : 16/121*t^3 - 69/121*t^2 + 293/121*t - 46/121 : 1),
(3/55*t^3 + 7/55*t^2 + 2/55*t + 78/55 : 7/55*t^3 - 24/55*t^2 + 9/11*t + 17/55 : 1),
(-5/121*t^3 + 36/121*t^2 - 84/121*t + 24/121 : 34/121*t^3 - 27/121*t^2 + 305/121*t + 708/121 : 1),
(-26/121*t^3 + 20/121*t^2 - 219/121*t - 995/121 : 15/121*t^3 + 156/121*t^2 - 232/121*t + 2766/121 : 1),
(1/11*t^3 - 5/11*t^2 + 19/11*t - 40/11 : 6/11*t^3 + 3/11*t^2 + 26/11*t + 310/11 : 1),
(-26/121*t^3 + 20/121*t^2 - 219/121*t - 995/121 : -15/121*t^3 - 156/121*t^2 + 232/121*t - 2887/121 : 1),
(-5/121*t^3 + 36/121*t^2 - 84/121*t + 24/121 : -34/121*t^3 + 27/121*t^2 - 305/121*t - 829/121 : 1),
(3/55*t^3 + 7/55*t^2 + 2/55*t + 78/55 : -7/55*t^3 + 24/55*t^2 - 9/11*t - 72/55 : 1),
(14/121*t^3 - 15/121*t^2 + 90/121*t + 232/121 : -16/121*t^3 + 69/121*t^2 - 293/121*t - 75/121 : 1),
(t : -1/11*t^3 - 6/11*t^2 - 19/11*t - 59/11 : 1),
(10/121*t^3 + 49/121*t^2 + 168/121*t + 73/121 : -32/121*t^3 - 60/121*t^2 + 261/121*t + 686/121 : 1),
(5/121*t^3 - 14/121*t^2 - 158/121*t - 453/121 : 49/121*t^3 + 129/121*t^2 + 315/121*t + 86/121 : 1),
(-9/121*t^3 - 21/121*t^2 - 127/121*t - 377/121 : 7/121*t^3 - 24/121*t^2 - 197/121*t - 137/121 : 1),
(-3/55*t^3 - 7/55*t^2 - 2/55*t - 133/55 : -6/55*t^3 - 3/55*t^2 - 25/11*t - 211/55 : 1),
(0 : 1 : 0)]
sage: E = EllipticCurve('15a1')
sage: K.<t> = NumberField(x^2 + 2*x + 10)
sage: EK = E.base_extend(K)
sage: EK.torsion_points()
[(-7 : -5*t - 2 : 1),
(-7 : 5*t + 8 : 1),
(-13/4 : 9/8 : 1),
(-2 : -2 : 1),
(-2 : 3 : 1),
(-t - 2 : -t - 7 : 1),
(-t - 2 : 2*t + 8 : 1),
(-1 : 0 : 1),
(t : t - 5 : 1),
(t : -2*t + 4 : 1),
(0 : 1 : 0),
(1/2 : -5/4*t - 2 : 1),
(1/2 : 5/4*t + 1/2 : 1),
(3 : -2 : 1),
(8 : -27 : 1),
(8 : 18 : 1)]
sage: K.<i> = QuadraticField(-1)
sage: EK = EllipticCurve(K,[0,0,0,0,-1])
sage: EK.torsion_points ()
[(-2 : -3*i : 1), (-2 : 3*i : 1), (0 : -i : 1), (0 : i : 1), (0 : 1 : 0), (1 : 0 : 1)]
Returns the torsion subgroup of this elliptic curve.
OUTPUT:
(EllipticCurveTorsionSubgroup) The EllipticCurveTorsionSubgroup associated to this elliptic curve.
EXAMPLES:
sage: E = EllipticCurve('11a1')
sage: K.<t>=NumberField(x^4 + x^3 + 11*x^2 + 41*x + 101)
sage: EK = E.base_extend(K)
sage: tor = EK.torsion_subgroup() # long time (2s on sage.math, 2014)
sage: tor # long time
Torsion Subgroup isomorphic to Z/5 + Z/5 associated to the Elliptic Curve defined by y^2 + y = x^3 + (-1)*x^2 + (-10)*x + (-20) over Number Field in t with defining polynomial x^4 + x^3 + 11*x^2 + 41*x + 101
sage: tor.gens() # long time
((16 : 60 : 1), (t : 1/11*t^3 + 6/11*t^2 + 19/11*t + 48/11 : 1))
sage: E = EllipticCurve('15a1')
sage: K.<t>=NumberField(x^2 + 2*x + 10)
sage: EK=E.base_extend(K)
sage: EK.torsion_subgroup()
Torsion Subgroup isomorphic to Z/4 + Z/4 associated to the Elliptic Curve defined by y^2 + x*y + y = x^3 + x^2 + (-10)*x + (-10) over Number Field in t with defining polynomial x^2 + 2*x + 10
sage: E = EllipticCurve('19a1')
sage: K.<t>=NumberField(x^9-3*x^8-4*x^7+16*x^6-3*x^5-21*x^4+5*x^3+7*x^2-7*x+1)
sage: EK=E.base_extend(K)
sage: EK.torsion_subgroup()
Torsion Subgroup isomorphic to Z/9 associated to the Elliptic Curve defined by y^2 + y = x^3 + x^2 + (-9)*x + (-15) over Number Field in t with defining polynomial x^9 - 3*x^8 - 4*x^7 + 16*x^6 - 3*x^5 - 21*x^4 + 5*x^3 + 7*x^2 - 7*x + 1
sage: K.<i> = QuadraticField(-1)
sage: EK = EllipticCurve([0,0,0,i,i+3])
sage: EK.torsion_subgroup ()
Torsion Subgroup isomorphic to Trivial group associated to the Elliptic Curve defined by y^2 = x^3 + i*x + (i+3) over Number Field in i with defining polynomial x^2 + 1