This module defines the class EllipticCurve_field, based on EllipticCurve_generic, for elliptic curves over general fields.
Twists: rewritten by John Cremona as follows:
The following twists are implemented:
More complicated twists exist in theory for char=2,3 and j=0=1728, but are not implemented.
Determine whether this curve is a quadratic twist of another.
INPUT:
OUTPUT:
Either 0, if the curves are not quadratic twists, or if
other is self.quadratic_twist(D) (up to isomorphism).
If self and other are isomorphic, returns 1.
If the curves are defined over , the output
is a squarefree integer.
Note
Not fully implemented in characteristic 2, or in
characteristic 3 when both -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
Determine whether this curve is a quartic twist of another.
INPUT:
OUTPUT:
Either 0, if the curves are not quartic twists, or if
other is self.quartic_twist(D) (up to isomorphism).
If self and other 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
Determine whether this curve is a sextic twist of another.
INPUT:
OUTPUT:
Either 0, if the curves are not sextic twists, or if
other is self.sextic_twist(D) (up to isomorphism).
If self and other 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
Returns an elliptic curve isogeny from self. This redirects to the EllipticCurveIsogeny constructor, see that function for more information.
INPUT:
If initiating from a domain/codomain, this must be set to None.
then this must be the codomain of a separable normalized isogeny, furthermore, degree must be the degree of the isogeny from self to codomain. If kernel is not None, then this must be isomorphic to the codomain of the normalized separable isogeny defined by kernel, in this case, the isogeny is post composed with an isomorphism so that this parameter is the codomain.
If kernel is None, then this is the degree of the isogeny from self to codomain. If kernel 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 of self.
self is a curve over the rationals, then the codomain is set to be the unique global minimum model.
The valid values are “velu” and “kohel”. If “velu” is set, then kernel must be a list of points in self that define a kernel of an isogeny. If “kohel” is set, then the kernel must be either a kernel polynomial or a list of coefficients of a kernel polynomial.
OUTPUT:
(elliptic curve isogeny) the isogeny initialized from the parameters.
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))
Returns the codomain of the isogeny from self with given kernel. This redirects to the isogeny_codomain_from_kernel function, see that function for more information.
INPUT:
OUTPUT:
(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
Return the quadratic twist of this curve by D.
INPUT:
In characteristics other than 2, must be nonzero, and the twist is
isomorphic to self after adjoining
to the base.
In characteristic 2, is arbitrary, and the twist is isomorphic
to self after adjoining a root of
to the base.
In characteristic 2 when , this is not implemented.
If the base field is finite,
need not be specified, and
the curve returned is the unique curve (up to isomorphism)
defined over
isomorphic to the original curve over the
quadratic extension of
but not over
itself. Over infinite
fields, an error is raised if
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
Return the quartic twist of this curve by .
INPUT:
Note
The characteristic must not be 2 or 3, and the -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
Return the quartic twist of this curve by .
INPUT:
Note
The characteristic must not be 2 or 3, and the -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