Elliptic curves over a general field¶
This module defines the class EllipticCurve_field
, based on
EllipticCurve_generic
, for elliptic curves over general fields.
- class sage.schemes.elliptic_curves.ell_field.EllipticCurve_field(K, ainvs)¶
Bases:
sage.schemes.elliptic_curves.ell_generic.EllipticCurve_generic
,sage.schemes.curves.projective_curve.ProjectivePlaneCurve_field
- base_field()¶
Return the base ring of the elliptic curve.
EXAMPLES:
sage: E = EllipticCurve(GF(49, 'a'), [3,5]) sage: E.base_ring() Finite Field in a of size 7^2
sage: E = EllipticCurve([1,1]) sage: E.base_ring() Rational Field
sage: E = EllipticCurve(ZZ, [3,5]) sage: E.base_ring() Integer Ring
- descend_to(K, f=None)¶
Given an elliptic curve self defined over a field \(L\) and a subfield \(K\) of \(L\), return all elliptic curves over \(K\) which are isomorphic over \(L\) to self.
INPUT:
\(K\) – a field which embeds into the base field \(L\) of self.
\(f\) (optional) – an embedding of \(K\) into \(L\). Ignored if \(K\) is \(\QQ\).
OUTPUT:
A list (possibly empty) of elliptic curves defined over \(K\) which are isomorphic to self over \(L\), up to isomorphism over \(K\).
Note
Currently only implemented over number fields. To extend to other fields of characteristic not 2 or 3, what is needed is a method giving the preimages in \(K^*/(K^*)^m\) of an element of the base field, for \(m=2,4,6\).
EXAMPLES:
sage: E = EllipticCurve([1,2,3,4,5]) sage: E.descend_to(ZZ) Traceback (most recent call last): ... TypeError: Input must be a field.
sage: F.<b> = QuadraticField(23) sage: G.<a> = F.extension(x^3+5) sage: E = EllipticCurve(j=1728*b).change_ring(G) sage: EF = E.descend_to(F); EF [Elliptic Curve defined by y^2 = x^3 + (27*b-621)*x + (-1296*b+2484) over Number Field in b with defining polynomial x^2 - 23 with b = 4.795831523312720?] sage: all(Ei.change_ring(G).is_isomorphic(E) for Ei in EF) True
sage: L.<a> = NumberField(x^4 - 7) sage: K.<b> = NumberField(x^2 - 7, embedding=a^2) sage: E = EllipticCurve([a^6,0]) sage: EK = E.descend_to(K); EK [Elliptic Curve defined by y^2 = x^3 + b*x over Number Field in b with defining polynomial x^2 - 7 with b = a^2, Elliptic Curve defined by y^2 = x^3 + 7*b*x over Number Field in b with defining polynomial x^2 - 7 with b = a^2] sage: all(Ei.change_ring(L).is_isomorphic(E) for Ei in EK) True
sage: K.<a> = QuadraticField(17) sage: E = EllipticCurve(j = 2*a) sage: E.descend_to(QQ) []
- genus()¶
Return 1 for elliptic curves.
EXAMPLES:
sage: E = EllipticCurve(GF(3), [0, -1, 0, -346, 2652]) sage: E.genus() 1 sage: R = FractionField(QQ['z']) sage: E = EllipticCurve(R, [0, -1, 0, -346, 2652]) sage: E.genus() 1
- hasse_invariant()¶
Return the Hasse invariant of this elliptic curve.
OUTPUT:
The Hasse invariant of this elliptic curve, as an element of the base field. This is only defined over fields of positive characteristic, and is an element of the field which is zero if and only if the curve is supersingular. Over a field of characteristic zero, where the Hasse invariant is undefined, a
ValueError
is returned.EXAMPLES:
sage: E = EllipticCurve([Mod(1,2),Mod(1,2),0,0,Mod(1,2)]) sage: E.hasse_invariant() 1 sage: E = EllipticCurve([0,0,Mod(1,3),Mod(1,3),Mod(1,3)]) sage: E.hasse_invariant() 0 sage: E = EllipticCurve([0,0,Mod(1,5),0,Mod(2,5)]) sage: E.hasse_invariant() 0 sage: E = EllipticCurve([0,0,Mod(1,5),Mod(1,5),Mod(2,5)]) sage: E.hasse_invariant() 2
Some examples over larger fields:
sage: EllipticCurve(GF(101),[0,0,0,0,1]).hasse_invariant() 0 sage: EllipticCurve(GF(101),[0,0,0,1,1]).hasse_invariant() 98 sage: EllipticCurve(GF(103),[0,0,0,0,1]).hasse_invariant() 20 sage: EllipticCurve(GF(103),[0,0,0,1,1]).hasse_invariant() 17 sage: F.<a> = GF(107^2) sage: EllipticCurve(F,[0,0,0,a,1]).hasse_invariant() 62*a + 75 sage: EllipticCurve(F,[0,0,0,0,a]).hasse_invariant() 0
Over fields of characteristic zero, the Hasse invariant is undefined:
sage: E = EllipticCurve([0,0,0,0,1]) sage: E.hasse_invariant() Traceback (most recent call last): ... ValueError: Hasse invariant only defined in positive characteristic
- is_isogenous(other, field=None)¶
Return whether or not self is isogenous to other.
INPUT:
other
– another elliptic curve.field
(default None) – Currently not implemented. A field containing the base fields of the two elliptic curves onto which the two curves may be extended to test if they are isogenous over this field. By default is_isogenous will not try to find this field unless one of the curves can be be extended into the base field of the other, in which case it will test over the larger base field.
OUTPUT:
(bool) True if there is an isogeny from curve
self
to curveother
defined overfield
.METHOD:
Over general fields this is only implemented in trivial cases.
EXAMPLES:
sage: E1 = EllipticCurve(CC, [1,18]); E1 Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 18.0000000000000 over Complex Field with 53 bits of precision sage: E2 = EllipticCurve(CC, [2,7]); E2 Elliptic Curve defined by y^2 = x^3 + 2.00000000000000*x + 7.00000000000000 over Complex Field with 53 bits of precision sage: E1.is_isogenous(E2) Traceback (most recent call last): ... NotImplementedError: Only implemented for isomorphic curves over general fields. sage: E1 = EllipticCurve(Frac(PolynomialRing(ZZ,'t')), [2,19]); E1 Elliptic Curve defined by y^2 = x^3 + 2*x + 19 over Fraction Field of Univariate Polynomial Ring in t over Integer Ring sage: E2 = EllipticCurve(CC, [23,4]); E2 Elliptic Curve defined by y^2 = x^3 + 23.0000000000000*x + 4.00000000000000 over Complex Field with 53 bits of precision sage: E1.is_isogenous(E2) Traceback (most recent call last): ... NotImplementedError: Only implemented for isomorphic curves over general fields.
- is_quadratic_twist(other)¶
Determine whether this curve is a quadratic twist of another.
INPUT:
other
– an elliptic curves with the same base field as self.
OUTPUT:
Either 0, if the curves are not quadratic twists, or \(D\) if
other
isself.quadratic_twist(D)
(up to isomorphism). Ifself
andother
are isomorphic, returns 1.If the curves are defined over \(\QQ\), the output \(D\) is a squarefree integer.
Note
Not fully implemented in characteristic 2, or in characteristic 3 when both \(j\)-invariants are 0.
EXAMPLES:
sage: E = EllipticCurve('11a1') sage: Et = E.quadratic_twist(-24) sage: E.is_quadratic_twist(Et) -6 sage: E1=EllipticCurve([0,0,1,0,0]) sage: E1.j_invariant() 0 sage: E2=EllipticCurve([0,0,0,0,2]) sage: E1.is_quadratic_twist(E2) 2 sage: E1.is_quadratic_twist(E1) 1 sage: type(E1.is_quadratic_twist(E1)) == type(E1.is_quadratic_twist(E2)) #trac 6574 True
sage: E1=EllipticCurve([0,0,0,1,0]) sage: E1.j_invariant() 1728 sage: E2=EllipticCurve([0,0,0,2,0]) sage: E1.is_quadratic_twist(E2) 0 sage: E2=EllipticCurve([0,0,0,25,0]) sage: E1.is_quadratic_twist(E2) 5
sage: F = GF(101) sage: E1 = EllipticCurve(F,[4,7]) sage: E2 = E1.quadratic_twist() sage: D = E1.is_quadratic_twist(E2); D!=0 True sage: F = GF(101) sage: E1 = EllipticCurve(F,[4,7]) sage: E2 = E1.quadratic_twist() sage: D = E1.is_quadratic_twist(E2) sage: E1.quadratic_twist(D).is_isomorphic(E2) True sage: E1.is_isomorphic(E2) False sage: F2 = GF(101^2,'a') sage: E1.change_ring(F2).is_isomorphic(E2.change_ring(F2)) True
A characteristic 3 example:
sage: F = GF(3^5,'a') sage: E1 = EllipticCurve_from_j(F(1)) sage: E2 = E1.quadratic_twist(-1) sage: D = E1.is_quadratic_twist(E2); D!=0 True sage: E1.quadratic_twist(D).is_isomorphic(E2) True
sage: E1 = EllipticCurve_from_j(F(0)) sage: E2 = E1.quadratic_twist() sage: D = E1.is_quadratic_twist(E2); D 1 sage: E1.is_isomorphic(E2) True
- is_quartic_twist(other)¶
Determine whether this curve is a quartic twist of another.
INPUT:
other
– an elliptic curves with the same base field as self.
OUTPUT:
Either 0, if the curves are not quartic twists, or \(D\) if
other
isself.quartic_twist(D)
(up to isomorphism). Ifself
andother
are isomorphic, returns 1.Note
Not fully implemented in characteristics 2 or 3.
EXAMPLES:
sage: E = EllipticCurve_from_j(GF(13)(1728)) sage: E1 = E.quartic_twist(2) sage: D = E.is_quartic_twist(E1); D!=0 True sage: E.quartic_twist(D).is_isomorphic(E1) True
sage: E = EllipticCurve_from_j(1728) sage: E1 = E.quartic_twist(12345) sage: D = E.is_quartic_twist(E1); D 15999120 sage: (D/12345).is_perfect_power(4) True
- is_sextic_twist(other)¶
Determine whether this curve is a sextic twist of another.
INPUT:
other
– an elliptic curves with the same base field as self.
OUTPUT:
Either 0, if the curves are not sextic twists, or \(D\) if
other
isself.sextic_twist(D)
(up to isomorphism). Ifself
andother
are isomorphic, returns 1.Note
Not fully implemented in characteristics 2 or 3.
EXAMPLES:
sage: E = EllipticCurve_from_j(GF(13)(0)) sage: E1 = E.sextic_twist(2) sage: D = E.is_sextic_twist(E1); D!=0 True sage: E.sextic_twist(D).is_isomorphic(E1) True
sage: E = EllipticCurve_from_j(0) sage: E1 = E.sextic_twist(12345) sage: D = E.is_sextic_twist(E1); D 575968320 sage: (D/12345).is_perfect_power(6) True
- isogenies_prime_degree(l=None, max_l=31)¶
Return a list of all separable isogenies of given prime degree(s) with domain equal to
self
, which are defined over the base field ofself
.INPUT:
l
– a prime or a list of primes.max_l
– (default: 31) a bound on the primes to be tested. This is only used ifl
is None.
OUTPUT:
(list) All separable \(l\)-isogenies for the given \(l\) with domain self.
ALGORITHM:
Calls the generic function
isogenies_prime_degree()
. This is generic code, valid for all fields. It requires that certain operations have been implemented over the base field, such as root-finding for univariate polynomials.EXAMPLES:
Examples over finite fields:
sage: E = EllipticCurve(GF(next_prime(1000000)), [7,8]) sage: E.isogenies_prime_degree(2) [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 970389*x + 794257 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 29783*x + 206196 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 999960*x + 78 over Finite Field of size 1000003] sage: E.isogenies_prime_degree(3) [] sage: E.isogenies_prime_degree(5) [] sage: E.isogenies_prime_degree(7) [] sage: E.isogenies_prime_degree(11) [] sage: E.isogenies_prime_degree(13) [Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 878063*x + 845666 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 375648*x + 342776 over Finite Field of size 1000003] sage: E.isogenies_prime_degree(max_l=13) [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 970389*x + 794257 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 29783*x + 206196 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 999960*x + 78 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 878063*x + 845666 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 375648*x + 342776 over Finite Field of size 1000003] sage: E.isogenies_prime_degree() # Default limit of 31 [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 970389*x + 794257 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 29783*x + 206196 over Finite Field of size 1000003, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 999960*x + 78 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 878063*x + 845666 over Finite Field of size 1000003, Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 375648*x + 342776 over Finite Field of size 1000003, Isogeny of degree 17 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 347438*x + 594729 over Finite Field of size 1000003, Isogeny of degree 17 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 674846*x + 7392 over Finite Field of size 1000003, Isogeny of degree 23 from Elliptic Curve defined by y^2 = x^3 + 7*x + 8 over Finite Field of size 1000003 to Elliptic Curve defined by y^2 = x^3 + 390065*x + 605596 over Finite Field of size 1000003] sage: E = EllipticCurve(GF(17), [2,0]) sage: E.isogenies_prime_degree(3) [] sage: E.isogenies_prime_degree(2) [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x over Finite Field of size 17 to Elliptic Curve defined by y^2 = x^3 + 9*x over Finite Field of size 17, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x over Finite Field of size 17 to Elliptic Curve defined by y^2 = x^3 + 5*x + 9 over Finite Field of size 17, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x over Finite Field of size 17 to Elliptic Curve defined by y^2 = x^3 + 5*x + 8 over Finite Field of size 17]
The base field matters, over a field extension we find more isogenies:
sage: E = EllipticCurve(GF(13), [2,8]) sage: E.isogenies_prime_degree(max_l=3) [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field of size 13 to Elliptic Curve defined by y^2 = x^3 + 7*x + 4 over Finite Field of size 13, Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field of size 13 to Elliptic Curve defined by y^2 = x^3 + 9*x + 11 over Finite Field of size 13] sage: E = EllipticCurve(GF(13^6), [2,8]) sage: E.isogenies_prime_degree(max_l=3) [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + 7*x + 4 over Finite Field in z6 of size 13^6, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + (2*z6^5+6*z6^4+9*z6^3+8*z6+7)*x + (3*z6^5+9*z6^4+7*z6^3+12*z6+7) over Finite Field in z6 of size 13^6, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + (11*z6^5+7*z6^4+4*z6^3+5*z6+9)*x + (10*z6^5+4*z6^4+6*z6^3+z6+10) over Finite Field in z6 of size 13^6, Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + 9*x + 11 over Finite Field in z6 of size 13^6, Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + (3*z6^5+5*z6^4+8*z6^3+11*z6^2+5*z6+12)*x + (12*z6^5+6*z6^4+8*z6^3+4*z6^2+7*z6+6) over Finite Field in z6 of size 13^6, Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + (7*z6^4+12*z6^3+7*z6^2+4)*x + (6*z6^5+10*z6^3+12*z6^2+10*z6+8) over Finite Field in z6 of size 13^6, Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field in z6 of size 13^6 to Elliptic Curve defined by y^2 = x^3 + (10*z6^5+z6^4+6*z6^3+8*z6^2+8*z6)*x + (8*z6^5+7*z6^4+8*z6^3+10*z6^2+9*z6+7) over Finite Field in z6 of size 13^6]
If the degree equals the characteristic, we find only separable isogenies:
sage: E = EllipticCurve(GF(13), [2,8]) sage: E.isogenies_prime_degree(13) [Isogeny of degree 13 from Elliptic Curve defined by y^2 = x^3 + 2*x + 8 over Finite Field of size 13 to Elliptic Curve defined by y^2 = x^3 + 6*x + 5 over Finite Field of size 13] sage: E = EllipticCurve(GF(5), [1,1]) sage: E.isogenies_prime_degree(5) [Isogeny of degree 5 from Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 5 to Elliptic Curve defined by y^2 = x^3 + x + 4 over Finite Field of size 5] sage: k.<a> = GF(3^4) sage: E = EllipticCurve(k, [0,1,0,0,a]) sage: E.isogenies_prime_degree(3) [Isogeny of degree 3 from Elliptic Curve defined by y^2 = x^3 + x^2 + a over Finite Field in a of size 3^4 to Elliptic Curve defined by y^2 = x^3 + x^2 + (2*a^3+a^2+2)*x + (a^2+2) over Finite Field in a of size 3^4]
In the supersingular case, there are no separable isogenies of degree equal to the characteristic:
sage: E = EllipticCurve(GF(5), [0,1]) sage: E.isogenies_prime_degree(5) []
An example over a rational function field:
sage: R.<t> = GF(5)[] sage: K = R.fraction_field() sage: E = EllipticCurve(K, [1, t^5]) sage: E.isogenies_prime_degree(5) [Isogeny of degree 5 from Elliptic Curve defined by y^2 = x^3 + x + t^5 over Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 5 to Elliptic Curve defined by y^2 = x^3 + x + 4*t over Fraction Field of Univariate Polynomial Ring in t over Finite Field of size 5]
Examples over number fields (other than QQ):
sage: QQroot2.<e> = NumberField(x^2-2) sage: E = EllipticCurve(QQroot2, j=8000) sage: E.isogenies_prime_degree() [Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (-150528000)*x + (-629407744000) over Number Field in e with defining polynomial x^2 - 2 to Elliptic Curve defined by y^2 = x^3 + (-36750)*x + 2401000 over Number Field in e with defining polynomial x^2 - 2, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (-150528000)*x + (-629407744000) over Number Field in e with defining polynomial x^2 - 2 to Elliptic Curve defined by y^2 = x^3 + (220500*e-257250)*x + (54022500*e-88837000) over Number Field in e with defining polynomial x^2 - 2, Isogeny of degree 2 from Elliptic Curve defined by y^2 = x^3 + (-150528000)*x + (-629407744000) over Number Field in e with defining polynomial x^2 - 2 to Elliptic Curve defined by y^2 = x^3 + (-220500*e-257250)*x + (-54022500*e-88837000) over Number Field in e with defining polynomial x^2 - 2] sage: E = EllipticCurve(QQroot2, [1,0,1,4, -6]); E Elliptic Curve defined by y^2 + x*y + y = x^3 + 4*x + (-6) over Number Field in e with defining polynomial x^2 - 2 sage: E.isogenies_prime_degree(2) [Isogeny of degree 2 from Elliptic Curve defined by y^2 + x*y + y = x^3 + 4*x + (-6) over Number Field in e with defining polynomial x^2 - 2 to Elliptic Curve defined by y^2 + x*y + y = x^3 + (-36)*x + (-70) over Number Field in e with defining polynomial x^2 - 2] sage: E.isogenies_prime_degree(3) [Isogeny of degree 3 from Elliptic Curve defined by y^2 + x*y + y = x^3 + 4*x + (-6) over Number Field in e with defining polynomial x^2 - 2 to Elliptic Curve defined by y^2 + x*y + y = x^3 + (-1)*x over Number Field in e with defining polynomial x^2 - 2, Isogeny of degree 3 from Elliptic Curve defined by y^2 + x*y + y = x^3 + 4*x + (-6) over Number Field in e with defining polynomial x^2 - 2 to Elliptic Curve defined by y^2 + x*y + y = x^3 + (-171)*x + (-874) over Number Field in e with defining polynomial x^2 - 2]
These are not implemented yet:
sage: E = EllipticCurve(QQbar, [1,18]); E Elliptic Curve defined by y^2 = x^3 + x + 18 over Algebraic Field sage: E.isogenies_prime_degree() Traceback (most recent call last): ... NotImplementedError: This code could be implemented for QQbar, but has not been yet. sage: E = EllipticCurve(CC, [1,18]); E Elliptic Curve defined by y^2 = x^3 + 1.00000000000000*x + 18.0000000000000 over Complex Field with 53 bits of precision sage: E.isogenies_prime_degree(11) Traceback (most recent call last): ... NotImplementedError: This code could be implemented for general complex fields, but has not been yet.
- isogeny(kernel, codomain=None, degree=None, model=None, check=True)¶
Return an elliptic curve isogeny from self.
The isogeny can be determined in two ways, either by a polynomial or a set of torsion points. The methods used are:
Velu’s Formulas: Velu’s original formulas for computing isogenies. This algorithm is selected by giving as the
kernel
parameter a point or a list of points which generate a finite subgroup.Kohel’s Formulas: Kohel’s original formulas for computing isogenies. This algorithm is selected by giving as the
kernel
parameter a polynomial (or a coefficient list (little endian)) which will define the kernel of the isogeny.
INPUT:
E
- an elliptic curve, the domain of the isogeny toinitialize.
kernel
- a kernel, either a point inE
, a list ofpoints in
E
, a univariate kernel polynomial orNone
. If initiating from a domain/codomain, this must be set to None. Validity of input is checked (unless check=False).
codomain
- an elliptic curve (default:None). Ifkernel
isNone, then this must be the codomain of a separable normalized isogeny, furthermore,
degree
must be the degree of the isogeny fromE
tocodomain
. Ifkernel
is not None, then this must be isomorphic to the codomain of the normalized separable isogeny defined bykernel
, in this case, the isogeny is post composed with an isomorphism so that this parameter is the codomain.
degree
- an integer (default:None). Ifkernel
is None,then this is the degree of the isogeny from
E
tocodomain
. Ifkernel
is not None, then this is used to determine whether or not to skip a gcd of the kernel polynomial with the two torsion polynomial ofE
.
model
- a string (default:None). Only supportedvariable is “minimal”, in which case if``E`` is a curve over the rationals or over a number field, then the codomain is a global minimum model where this exists.
check
(default: True) checks that the input is valid,i.e., that the polynomial provided is a kernel polynomial, meaning that its roots are the x-coordinates of a finite subgroup.
OUTPUT:
An isogeny between elliptic curves. This is a morphism of curves.
EXAMPLES:
sage: F = GF(2^5, 'alpha'); alpha = F.gen() sage: E = EllipticCurve(F, [1,0,1,1,1]) sage: R.<x> = F[] sage: phi = E.isogeny(x+1) sage: phi.rational_maps() ((x^2 + x + 1)/(x + 1), (x^2*y + x)/(x^2 + 1)) sage: E = EllipticCurve('11a1') sage: P = E.torsion_points()[1] sage: E.isogeny(P) Isogeny of degree 5 from Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational Field to Elliptic Curve defined by y^2 + y = x^3 - x^2 - 7820*x - 263580 over Rational Field sage: E = EllipticCurve(GF(19),[1,1]) sage: P = E(15,3); Q = E(2,12); sage: (P.order(), Q.order()) (7, 3) sage: phi = E.isogeny([P,Q]); phi Isogeny of degree 21 from Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 19 to Elliptic Curve defined by y^2 = x^3 + x + 1 over Finite Field of size 19 sage: phi(E.random_point()) # all points defined over GF(19) are in the kernel (0 : 1 : 0)
Not all polynomials define a finite subgroup (trac ticket #6384):
sage: E = EllipticCurve(GF(31),[1,0,0,1,2]) sage: phi = E.isogeny([14,27,4,1]) Traceback (most recent call last): ... ValueError: The polynomial x^3 + 4*x^2 + 27*x + 14 does not define a finite subgroup of Elliptic Curve defined by y^2 + x*y = x^3 + x + 2 over Finite Field of size 31.
Until the checking of kernel polynomials was implemented in trac ticket #23222, the following raised no error but returned an invalid morphism. See also trac ticket #11578:
sage: R.<x> = QQ[] sage: K.<a> = NumberField(x^2-x-1) sage: E = EllipticCurve(K, [-13392, -1080432]) sage: R.<x> = K[] sage: phi = E.isogeny( (x-564)*(x - 396/5*a + 348/5) ) Traceback (most recent call last): ... ValueError: The polynomial x^2 + (-396/5*a - 2472/5)*x + 223344/5*a - 196272/5 does not define a finite subgroup of Elliptic Curve defined by y^2 = x^3 + (-13392)*x + (-1080432) over Number Field in a with defining polynomial x^2 - x - 1.
- isogeny_codomain(kernel, degree=None)¶
Return the codomain of the isogeny from self with given kernel.
INPUT:
kernel
- Either a list of points in the kernel of the isogeny,or a kernel polynomial (specified as a either a univariate polynomial or a coefficient list.)
degree
- an integer, (default:None) optionally specified degreeof the kernel.
OUTPUT:
An elliptic curve, the codomain of the separable normalized isogeny from this kernel
EXAMPLES:
sage: E = EllipticCurve('17a1') sage: R.<x> = QQ[] sage: E2 = E.isogeny_codomain(x - 11/4); E2 Elliptic Curve defined by y^2 + x*y + y = x^3 - x^2 - 1461/16*x - 19681/64 over Rational Field
- isogeny_ell_graph(l, directed=True, label_by_j=False)¶
Return a graph representing the
l
-degreeK
-isogenies betweenK
-isomorphism classes of elliptic curves forK = self.base_field()
.INPUT:
l
– prime degree of isogeniesdirected
– boolean (default:True
); whether to return a directed or undirected graph. In the undirected case, the in-degrees and out-degrees of the vertices must be balanced and therefore the number of out-edges from the vertices corresponding to j-invariants 0 and 1728 (if they are part of the graph) are reduced to match the number of in-edges.label_by_j
– boolean (default:False
); whether to label graph vertices by the j-invariant corresponding to the isomorphism class of curves. If the j-invariant is not unique in the isogeny class, append*
to it to indicate a twist. Otherwise, ifFalse
label vertices by the equation of a representative curve.
OUTPUT:
A
Graph
orDigraph
EXAMPLES:
Ordinary curve over finite extension field of degree 2:
sage: E = EllipticCurve(GF(59^2, "i", x^2 + 1), j=5) sage: G = E.isogeny_ell_graph(5, directed=False, label_by_j=True) sage: G Graph on 20 vertices sage: G.vertices() ['1', '12', ... 'i + 55'] sage: G.edges() [('1', '28*i + 11', None), ('1', '31*i + 11', None), ... ('8', 'i + 1', None)]
Supersingular curve over prime field:
sage: E = EllipticCurve(GF(419), j=1728) sage: G3 = E.isogeny_ell_graph(3, directed=False, label_by_j=True) sage: G3 Graph on 27 vertices sage: G3.vertices() ['0', '0*', ... '98*'] sage: G3.edges() [('0', '0*', None), ('0', '13', None), ... ('48*', '98*', None)] sage: G5 = E.isogeny_ell_graph(5, directed=False, label_by_j=True) sage: G5 Graph on 9 vertices sage: G5.vertices() ['13', '13*', '407', '407*', '52', '62', '62*', '98', '98*'] sage: G5.edges() [('13', '52', None), ('13', '98', None), ... ('62*', '98*', None)]
Supersingular curve over finite extension field of degree 2:
sage: K = GF(431^2, "i", x^2 + 1) sage: E = EllipticCurve(K, j=0) sage: E.is_supersingular() True sage: G = E.isogeny_ell_graph(2, directed=True, label_by_j=True) sage: G Looped multi-digraph on 37 vertices sage: G.vertices() ['0', '102', ... '87*i + 190'] sage: G.edges() [('0', '125', None), ('0', '125', None), ... '81*i + 65', None)] sage: H = E.isogeny_ell_graph(2, directed=False, label_by_j=True) sage: H Looped multi-graph on 37 vertices sage: H.vertices() ['0', '102', ... '87*i + 190'] sage: H.edges() [('0', '125', None), ('102', '125', None), ... ('81*i + 65', '87*i + 190', None)]
Curve over a quadratic number field:
sage: K.<e> = NumberField(x^2 - 2) sage: E = EllipticCurve(K, [1,0,1,4, -6]) sage: G2 = E.isogeny_ell_graph(2, directed=False) sage: G2.vertices() ['y^2 + x*y + y = x^3 + (-130*e-356)*x + (-2000*e-2038)', 'y^2 + x*y + y = x^3 + (-36)*x + (-70)', 'y^2 + x*y + y = x^3 + (130*e-356)*x + (2000*e-2038)', 'y^2 + x*y + y = x^3 + 4*x + (-6)'] sage: G2.edges() [('y^2 + x*y + y = x^3 + (-130*e-356)*x + (-2000*e-2038)', 'y^2 + x*y + y = x^3 + (-36)*x + (-70)', None), ('y^2 + x*y + y = x^3 + (-36)*x + (-70)', 'y^2 + x*y + y = x^3 + (130*e-356)*x + (2000*e-2038)', None), ('y^2 + x*y + y = x^3 + (-36)*x + (-70)', 'y^2 + x*y + y = x^3 + 4*x + (-6)', None)] sage: G3 = E.isogeny_ell_graph(3, directed=False) sage: G3.vertices() ['y^2 + x*y + y = x^3 + (-1)*x', 'y^2 + x*y + y = x^3 + (-171)*x + (-874)', 'y^2 + x*y + y = x^3 + 4*x + (-6)'] sage: G3.edges() [('y^2 + x*y + y = x^3 + (-1)*x', 'y^2 + x*y + y = x^3 + 4*x + (-6)', None), ('y^2 + x*y + y = x^3 + (-171)*x + (-874)', 'y^2 + x*y + y = x^3 + 4*x + (-6)', None)]
- quadratic_twist(D=None)¶
Return the quadratic twist of this curve by
D
.INPUT:
D
(default None) the twisting parameter (see below).
In characteristics other than 2, \(D\) must be nonzero, and the twist is isomorphic to self after adjoining \(\sqrt(D)\) to the base.
In characteristic 2, \(D\) is arbitrary, and the twist is isomorphic to self after adjoining a root of \(x^2+x+D\) to the base.
In characteristic 2 when \(j=0\), this is not implemented.
If the base field \(F\) is finite, \(D\) need not be specified, and the curve returned is the unique curve (up to isomorphism) defined over \(F\) isomorphic to the original curve over the quadratic extension of \(F\) but not over \(F\) itself. Over infinite fields, an error is raised if \(D\) is not given.
EXAMPLES:
sage: E = EllipticCurve([GF(1103)(1), 0, 0, 107, 340]); E Elliptic Curve defined by y^2 + x*y = x^3 + 107*x + 340 over Finite Field of size 1103 sage: F=E.quadratic_twist(-1); F Elliptic Curve defined by y^2 = x^3 + 1102*x^2 + 609*x + 300 over Finite Field of size 1103 sage: E.is_isomorphic(F) False sage: E.is_isomorphic(F,GF(1103^2,'a')) True
A characteristic 2 example:
sage: E=EllipticCurve(GF(2),[1,0,1,1,1]) sage: E1=E.quadratic_twist(1) sage: E.is_isomorphic(E1) False sage: E.is_isomorphic(E1,GF(4,'a')) True
Over finite fields, the twisting parameter may be omitted:
sage: k.<a> = GF(2^10) sage: E = EllipticCurve(k,[a^2,a,1,a+1,1]) sage: Et = E.quadratic_twist() sage: Et # random (only determined up to isomorphism) Elliptic Curve defined by y^2 + x*y = x^3 + (a^7+a^4+a^3+a^2+a+1)*x^2 + (a^8+a^6+a^4+1) over Finite Field in a of size 2^10 sage: E.is_isomorphic(Et) False sage: E.j_invariant()==Et.j_invariant() True sage: p=next_prime(10^10) sage: k = GF(p) sage: E = EllipticCurve(k,[1,2,3,4,5]) sage: Et = E.quadratic_twist() sage: Et # random (only determined up to isomorphism) Elliptic Curve defined by y^2 = x^3 + 7860088097*x^2 + 9495240877*x + 3048660957 over Finite Field of size 10000000019 sage: E.is_isomorphic(Et) False sage: k2 = GF(p^2,'a') sage: E.change_ring(k2).is_isomorphic(Et.change_ring(k2)) True
- quartic_twist(D)¶
Return the quartic twist of this curve by \(D\).
INPUT:
D
(must be nonzero) – the twisting parameter..
Note
The characteristic must not be 2 or 3, and the \(j\)-invariant must be 1728.
EXAMPLES:
sage: E=EllipticCurve_from_j(GF(13)(1728)); E Elliptic Curve defined by y^2 = x^3 + x over Finite Field of size 13 sage: E1=E.quartic_twist(2); E1 Elliptic Curve defined by y^2 = x^3 + 5*x over Finite Field of size 13 sage: E.is_isomorphic(E1) False sage: E.is_isomorphic(E1,GF(13^2,'a')) False sage: E.is_isomorphic(E1,GF(13^4,'a')) True
- sextic_twist(D)¶
Return the quartic twist of this curve by \(D\).
INPUT:
D
(must be nonzero) – the twisting parameter..
Note
The characteristic must not be 2 or 3, and the \(j\)-invariant must be 0.
EXAMPLES:
sage: E=EllipticCurve_from_j(GF(13)(0)); E Elliptic Curve defined by y^2 = x^3 + 1 over Finite Field of size 13 sage: E1=E.sextic_twist(2); E1 Elliptic Curve defined by y^2 = x^3 + 11 over Finite Field of size 13 sage: E.is_isomorphic(E1) False sage: E.is_isomorphic(E1,GF(13^2,'a')) False sage: E.is_isomorphic(E1,GF(13^4,'a')) False sage: E.is_isomorphic(E1,GF(13^6,'a')) True
- two_torsion_rank()¶
Return the dimension of the 2-torsion subgroup of \(E(K)\).
This will be 0, 1 or 2.
EXAMPLES:
sage: E=EllipticCurve('11a1') sage: E.two_torsion_rank() 0 sage: K.<alpha>=QQ.extension(E.division_polynomial(2).monic()) sage: E.base_extend(K).two_torsion_rank() 1 sage: E.reduction(53).two_torsion_rank() 2
sage: E = EllipticCurve('14a1') sage: E.two_torsion_rank() 1 sage: K.<alpha>=QQ.extension(E.division_polynomial(2).monic().factor()[1][0]) sage: E.base_extend(K).two_torsion_rank() 2
sage: EllipticCurve('15a1').two_torsion_rank() 2
- weierstrass_p(prec=20, algorithm=None)¶
Computes the Weierstrass \(\wp\)-function of the elliptic curve.
INPUT:
mprec
- precisionalgorithm
- string (default:None
) an algorithm identifierindicating using the
pari
,fast
orquadratic
algorithm. If the algorithm isNone
, then this function determines the best algorithm to use.
OUTPUT:
a Laurent series in one variable \(z\) with coefficients in the base field \(k\) of \(E\).
EXAMPLES:
sage: E = EllipticCurve('11a1') sage: E.weierstrass_p(prec=10) z^-2 + 31/15*z^2 + 2501/756*z^4 + 961/675*z^6 + 77531/41580*z^8 + O(z^10) sage: E.weierstrass_p(prec=8) z^-2 + 31/15*z^2 + 2501/756*z^4 + 961/675*z^6 + O(z^8) sage: Esh = E.short_weierstrass_model() sage: Esh.weierstrass_p(prec=8) z^-2 + 13392/5*z^2 + 1080432/7*z^4 + 59781888/25*z^6 + O(z^8) sage: E.weierstrass_p(prec=20, algorithm='fast') z^-2 + 31/15*z^2 + 2501/756*z^4 + 961/675*z^6 + 77531/41580*z^8 + 1202285717/928746000*z^10 + 2403461/2806650*z^12 + 30211462703/43418875500*z^14 + 3539374016033/7723451736000*z^16 + 413306031683977/1289540602350000*z^18 + O(z^20) sage: E.weierstrass_p(prec=20, algorithm='pari') z^-2 + 31/15*z^2 + 2501/756*z^4 + 961/675*z^6 + 77531/41580*z^8 + 1202285717/928746000*z^10 + 2403461/2806650*z^12 + 30211462703/43418875500*z^14 + 3539374016033/7723451736000*z^16 + 413306031683977/1289540602350000*z^18 + O(z^20) sage: E.weierstrass_p(prec=20, algorithm='quadratic') z^-2 + 31/15*z^2 + 2501/756*z^4 + 961/675*z^6 + 77531/41580*z^8 + 1202285717/928746000*z^10 + 2403461/2806650*z^12 + 30211462703/43418875500*z^14 + 3539374016033/7723451736000*z^16 + 413306031683977/1289540602350000*z^18 + O(z^20)