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(ainvs, extra=None)
base_field()

Twists: rewritten by John Cremona as follows:

The following twists are implemented:

  • Quadratic twist: except when char=2 and j=0.
  • Quartic twist: only if j=1728\not=0 (so not if char=2,3).
  • Sextic twist: only if j=0\not=1728 (so not if char=2,3).

More complicated twists exist in theory for char=2,3 and j=0=1728, but are not implemented.

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 is self.quadratic_twist(D) (up to isomorphism). If self and other are isomorphic, returns 1.

If the curves are defined over \mathbb{Q}, 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 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
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 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
isogeny(kernel, codomain=None, degree=None, model=None, algorithm=None)

Returns an elliptic curve isogeny from self. This redirects to the EllipticCurveIsogeny constructor, see that function for more information.

INPUT:

  • kernel - a kernel, either a list of points in self, or a kernel polynomial.

    If initiating from a domain/codomain, this must be set to None.

  • codomain - an elliptic curve (default:None). If kernel is 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.

  • degree - an integer (default:None).

    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.

  • model - a string (default:None). Only supported variable is “minimal”, in which case if

    self is a curve over the rationals, then the codomain is set to be the unique global minimum model.

  • algorithm - a string (default:None). If this parameter is None, then the algorithm is determined from the input.

    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))
isogeny_codomain(kernel, degree=None, algorithm=None)

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:

  • 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 degree of the kernel.
  • algorithm - See the options in the constructor of the EllipticCurveIsogeny class.

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
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

Previous topic

Elliptic curves over a general ring.

Next topic

Elliptic curves over the rational numbers

This Page