Isomorphisms between Weierstrass models of elliptic curves#
AUTHORS:
Robert Bradshaw (2007): initial version
John Cremona (Jan 2008): isomorphisms, automorphisms and twists in all characteristics
Lorenz Panny (2021):
EllipticCurveHom
interface
- class sage.schemes.elliptic_curves.weierstrass_morphism.WeierstrassIsomorphism(E=None, urst=None, F=None)#
Bases:
EllipticCurveHom
,baseWI
Class representing a Weierstrass isomorphism between two elliptic curves.
INPUT:
E
– anEllipticCurve
, orNone
(see below).urst
– a 4-tuple , abaseWI
object, orNone
(see below).F
– anEllipticCurve
, orNone
(see below).
Given two Elliptic Curves
E
andF
(represented by Weierstrass models as usual), and a transformationurst
fromE
toF
, construct an isomorphism fromE
toF
. An exception is raised ifurst(E) != F
. At most one ofE
,F
,urst
can beNone
. In this case, the missing input is constructed from the others in such a way thaturst(E) == F
holds, and an exception is raised if this is impossible (typically becauseE
andF
are not isomorphic).Users will not usually need to use this class directly, but instead use methods such as
isomorphism_to()
orisomorphisms()
.Explicitly, the isomorphism defined by
maps a point to the pointIf the domain
has Weierstrass coefficients , the codomain is given byEXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import * sage: WeierstrassIsomorphism(EllipticCurve([0,1,2,3,4]), (-1,2,3,4)) Elliptic-curve morphism: From: Elliptic Curve defined by y^2 + 2*y = x^3 + x^2 + 3*x + 4 over Rational Field To: Elliptic Curve defined by y^2 - 6*x*y - 10*y = x^3 - 2*x^2 - 11*x - 2 over Rational Field Via: (u,r,s,t) = (-1, 2, 3, 4) sage: E = EllipticCurve([0,1,2,3,4]) sage: F = EllipticCurve(E.cremona_label()) sage: WeierstrassIsomorphism(E, None, F) Elliptic-curve morphism: From: Elliptic Curve defined by y^2 + 2*y = x^3 + x^2 + 3*x + 4 over Rational Field To: Elliptic Curve defined by y^2 = x^3 + x^2 + 3*x + 5 over Rational Field Via: (u,r,s,t) = (1, 0, 0, -1) sage: w = WeierstrassIsomorphism(None, (1,0,0,-1), F) sage: w._domain == E True
- dual()#
Return the dual isogeny of this isomorphism.
For isomorphisms, the dual is just the inverse.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import WeierstrassIsomorphism sage: E = EllipticCurve(QuadraticField(-3), [0,1]) # optional - sage.rings.number_field sage: w = WeierstrassIsomorphism(E, (CyclotomicField(3).gen(),0,0,0)) # optional - sage.rings.number_field sage: (w.dual() * w).rational_maps() # optional - sage.rings.number_field (x, y)
sage: E1 = EllipticCurve([11,22,33,44,55]) sage: E2 = E1.short_weierstrass_model() sage: iso = E1.isomorphism_to(E2) sage: iso.dual() == ~iso True
- is_separable()#
Determine whether or not this isogeny is separable.
Since
WeierstrassIsomorphism
only implements isomorphisms, this method always returnsTrue
.EXAMPLES:
sage: E = EllipticCurve(GF(31337), [0,1]) # optional - sage.rings.finite_rings sage: {f.is_separable() for f in E.automorphisms()} # optional - sage.rings.finite_rings {True}
- kernel_polynomial()#
Return the kernel polynomial of this isomorphism.
Isomorphisms have trivial kernel by definition, hence this method always returns
.EXAMPLES:
sage: E1 = EllipticCurve([11,22,33,44,55]) sage: E2 = EllipticCurve_from_j(E1.j_invariant()) sage: iso = E1.isomorphism_to(E2) sage: iso.kernel_polynomial() 1 sage: psi = E1.isogeny(iso.kernel_polynomial(), codomain=E2); psi Isogeny of degree 1 from Elliptic Curve defined by y^2 + 11*x*y + 33*y = x^3 + 22*x^2 + 44*x + 55 over Rational Field to Elliptic Curve defined by y^2 + x*y = x^3 + x^2 - 684*x + 6681 over Rational Field sage: psi in {iso, -iso} True
- rational_maps()#
Return the pair of rational maps defining this isomorphism.
EXAMPLES:
sage: E1 = EllipticCurve([11,22,33,44,55]) sage: E2 = EllipticCurve_from_j(E1.j_invariant()) sage: iso = E1.isomorphism_to(E2); iso Elliptic-curve morphism: From: Elliptic Curve defined by y^2 + 11*x*y + 33*y = x^3 + 22*x^2 + 44*x + 55 over Rational Field To: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 - 684*x + 6681 over Rational Field Via: (u,r,s,t) = (1, -17, -5, 77) sage: iso.rational_maps() (x + 17, 5*x + y + 8) sage: f = E2.defining_polynomial()(*iso.rational_maps(), 1) sage: I = E1.defining_ideal() sage: x,y,z = I.ring().gens() sage: f in I + Ideal(z-1) True
sage: E = EllipticCurve(GF(65537), [1,1,1,1,1]) # optional - sage.rings.finite_rings sage: w = E.isomorphism_to(E.short_weierstrass_model()) # optional - sage.rings.finite_rings sage: f,g = w.rational_maps() # optional - sage.rings.finite_rings sage: P = E.random_point() # optional - sage.rings.finite_rings sage: w(P).xy() == (f(P.xy()), g(P.xy())) # optional - sage.rings.finite_rings True
- scaling_factor()#
Return the Weierstrass scaling factor associated to this Weierstrass isomorphism.
The scaling factor is the constant
(in the base field) such that , where is this isomorphism and are the standard Weierstrass differentials on defined by .EXAMPLES:
sage: E = EllipticCurve(QQbar, [0,1]) # optional - sage.rings.number_field sage: all(f.scaling_factor() == f.formal()[1] for f in E.automorphisms()) # optional - sage.rings.number_field True
ALGORITHM: The scaling factor equals the
component of the tuple defining the isomorphism.
- x_rational_map()#
Return the
-coordinate rational map of this isomorphism.EXAMPLES:
sage: E1 = EllipticCurve([11,22,33,44,55]) sage: E2 = EllipticCurve_from_j(E1.j_invariant()) sage: iso = E1.isomorphism_to(E2); iso Elliptic-curve morphism: From: Elliptic Curve defined by y^2 + 11*x*y + 33*y = x^3 + 22*x^2 + 44*x + 55 over Rational Field To: Elliptic Curve defined by y^2 + x*y = x^3 + x^2 - 684*x + 6681 over Rational Field Via: (u,r,s,t) = (1, -17, -5, 77) sage: iso.x_rational_map() x + 17 sage: iso.x_rational_map() == iso.rational_maps()[0] True
- class sage.schemes.elliptic_curves.weierstrass_morphism.baseWI(u=1, r=0, s=0, t=0)#
Bases:
object
This class implements the basic arithmetic of isomorphisms between Weierstrass models of elliptic curves.
These are specified by lists of the form
(with ) which specifies a transformation whereINPUT:
u,r,s,t
(default ) – standard parameters of an isomorphism between Weierstrass models.
EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import * sage: baseWI() (1, 0, 0, 0) sage: baseWI(2,3,4,5) (2, 3, 4, 5) sage: R.<u,r,s,t> = QQ[] sage: baseWI(u,r,s,t) (u, r, s, t)
- is_identity()#
Return
True
if this is the identity isomorphism.EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import * sage: w = baseWI(); w.is_identity() True sage: w = baseWI(2,3,4,5); w.is_identity() False
- tuple()#
Return the parameters
as a tuple.EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import * sage: w = baseWI(2,3,4,5) sage: w.tuple() (2, 3, 4, 5)
- sage.schemes.elliptic_curves.weierstrass_morphism.identity_morphism(E)#
Given an elliptic curve
, return the identity morphism on as aWeierstrassIsomorphism
.EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import identity_morphism sage: E = EllipticCurve([5,6,7,8,9]) sage: id_ = identity_morphism(E) sage: id_.rational_maps() (x, y)
- sage.schemes.elliptic_curves.weierstrass_morphism.negation_morphism(E)#
Given an elliptic curve
, return the negation endomorphism of as aWeierstrassIsomorphism
.EXAMPLES:
sage: from sage.schemes.elliptic_curves.weierstrass_morphism import negation_morphism sage: E = EllipticCurve([5,6,7,8,9]) sage: neg = negation_morphism(E) sage: neg.rational_maps() (x, -5*x - y - 7)