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

Class representing a Weierstrass isomorphism between two elliptic curves.

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: w = WeierstrassIsomorphism(E, (CyclotomicField(3).gen(),0,0,0))
sage: (w.dual() * w).rational_maps()
(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

kernel_polynomial()#

Return the kernel polynomial of this isomorphism.

Isomorphisms have trivial kernel by definition, hence this method always returns $$1$$.

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])
sage: w = E.isomorphism_to(E.short_weierstrass_model())
sage: f,g = w.rational_maps()
sage: P = E.random_point()
sage: w(P).xy() == (f(P.xy()), g(P.xy()))
True

scaling_factor()#

Return the Weierstrass scaling factor associated to this Weierstrass isomorphism.

The scaling factor is the constant $$u$$ (in the base field) such that $$\varphi^* \omega_2 = u \omega_1$$, where $$\varphi: E_1\to E_2$$ is this isomorphism and $$\omega_i$$ are the standard Weierstrass differentials on $$E_i$$ defined by $$\mathrm dx/(2y+a_1x+a_3)$$.

EXAMPLES:

sage: E = EllipticCurve(QQbar, [0,1])
sage: all(f.scaling_factor() == f.formal()[1] for f in E.automorphisms())
True


ALGORITHM: The scaling factor equals the $$u$$ component of the tuple $$(u,r,s,t)$$ defining the isomorphism.

x_rational_map()#

Return the $$x$$-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 $$[u,r,s,t]$$ (with $$u\not=0$$) which specifies a transformation $$(x,y) \mapsto (x',y')$$ where

$$(x,y) = (u^2x'+r , u^3y' + su^2x' + t).$$

INPUT:

• u,r,s,t (default (1,0,0,0)) – 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 $$u,r,s,t$$ 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.isomorphisms(E, F, JustOne=False)#

Return one or all isomorphisms between two elliptic curves.

INPUT:

• E, F (EllipticCurve) – Two elliptic curves.

• JustOne (bool) If True, returns one isomorphism, or None if the curves are not isomorphic. If False, returns a (possibly empty) list of isomorphisms.

OUTPUT:

Either None, or a 4-tuple $$(u,r,s,t)$$ representing an isomorphism, or a list of these.

Note

This function is not intended for users, who should use the interface provided by ell_generic.

EXAMPLES:

sage: from sage.schemes.elliptic_curves.weierstrass_morphism import *
sage: isomorphisms(EllipticCurve_from_j(0),EllipticCurve('27a3'))
[(-1, 0, 0, -1), (1, 0, 0, 0)]
sage: isomorphisms(EllipticCurve_from_j(0),EllipticCurve('27a3'),JustOne=True)
(1, 0, 0, 0)
sage: isomorphisms(EllipticCurve_from_j(0),EllipticCurve('27a1'))
[]
sage: isomorphisms(EllipticCurve_from_j(0),EllipticCurve('27a1'),JustOne=True)