Morphism to bring a genus-one curve into Weierstrass form¶
You should use
EllipticCurve_from_cubic()
or
EllipticCurve_from_curve()
to construct the transformation starting with a cubic or with a genus
one curve.
EXAMPLES:
sage: R.<u,v,w> = QQ[]
sage: f = EllipticCurve_from_cubic(u^3 + v^3 + w^3, [1,-1,0], morphism=True); f
Scheme morphism:
From: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3
To: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field
Defn: Defined on coordinates by sending (u : v : w) to
(-w : 3*u : 1/3*u + 1/3*v)
sage: finv = f.inverse(); finv
Scheme morphism:
From: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field
To: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3
Defn: Defined on coordinates by sending (x : y : z) to
(1/3*y : -1/3*y + 3*z : -x)
sage: (u^3 + v^3 + w^3)(f.inverse().defining_polynomials()) * f.inverse().post_rescaling()
-x^3 + y^2*z - 9*y*z^2 + 27*z^3
sage: E = finv.domain()
sage: E.defining_polynomial()(f.defining_polynomials()) * f.post_rescaling()
u^3 + v^3 + w^3
sage: f([1,-1,0])
(0 : 1 : 0)
sage: f([1,0,-1])
(3 : 9 : 1)
sage: f([0,1,-1])
(3 : 0 : 1)
>>> from sage.all import *
>>> R = QQ['u, v, w']; (u, v, w,) = R._first_ngens(3)
>>> f = EllipticCurve_from_cubic(u**Integer(3) + v**Integer(3) + w**Integer(3), [Integer(1),-Integer(1),Integer(0)], morphism=True); f
Scheme morphism:
From: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3
To: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field
Defn: Defined on coordinates by sending (u : v : w) to
(-w : 3*u : 1/3*u + 1/3*v)
>>> finv = f.inverse(); finv
Scheme morphism:
From: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field
To: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3
Defn: Defined on coordinates by sending (x : y : z) to
(1/3*y : -1/3*y + 3*z : -x)
>>> (u**Integer(3) + v**Integer(3) + w**Integer(3))(f.inverse().defining_polynomials()) * f.inverse().post_rescaling()
-x^3 + y^2*z - 9*y*z^2 + 27*z^3
>>> E = finv.domain()
>>> E.defining_polynomial()(f.defining_polynomials()) * f.post_rescaling()
u^3 + v^3 + w^3
>>> f([Integer(1),-Integer(1),Integer(0)])
(0 : 1 : 0)
>>> f([Integer(1),Integer(0),-Integer(1)])
(3 : 9 : 1)
>>> f([Integer(0),Integer(1),-Integer(1)])
(3 : 0 : 1)
R.<u,v,w> = QQ[] f = EllipticCurve_from_cubic(u^3 + v^3 + w^3, [1,-1,0], morphism=True); f finv = f.inverse(); finv (u^3 + v^3 + w^3)(f.inverse().defining_polynomials()) * f.inverse().post_rescaling() E = finv.domain() E.defining_polynomial()(f.defining_polynomials()) * f.post_rescaling() f([1,-1,0]) f([1,0,-1]) f([0,1,-1])
- class sage.schemes.elliptic_curves.weierstrass_transform.WeierstrassTransformation(domain, codomain, defining_polynomials, post_multiplication)[source]¶
Bases:
SchemeMorphism_polynomial
A morphism of a genus-one curve to/from the Weierstrass form.
INPUT:
domain
,codomain
– two schemes, one of which is an elliptic curvedefining_polynomials
– triplet of polynomials that define the transformationpost_multiplication
– a polynomial to homogeneously rescale after substituting the defining polynomials
EXAMPLES:
sage: P2.<u,v,w> = ProjectiveSpace(2,QQ) sage: C = P2.subscheme(u^3 + v^3 + w^3) sage: E = EllipticCurve([2, -1, -1/3, 1/3, -1/27]) sage: from sage.schemes.elliptic_curves.weierstrass_transform import WeierstrassTransformation sage: f = WeierstrassTransformation(C, E, [w, -v-w, -3*u-3*v], 1); f Scheme morphism: From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by: u^3 + v^3 + w^3 To: Elliptic Curve defined by y^2 + 2*x*y - 1/3*y = x^3 - x^2 + 1/3*x - 1/27 over Rational Field Defn: Defined on coordinates by sending (u : v : w) to (w : -v - w : -3*u - 3*v) sage: f([-1, 1, 0]) (0 : 1 : 0) sage: f([-1, 0, 1]) (1/3 : -1/3 : 1) sage: f([ 0,-1, 1]) (1/3 : 0 : 1) sage: A2.<a,b> = AffineSpace(2,QQ) sage: C = A2.subscheme(a^3 + b^3 + 1) sage: f = WeierstrassTransformation(C, E, [1, -b-1, -3*a-3*b], 1); f Scheme morphism: From: Closed subscheme of Affine Space of dimension 2 over Rational Field defined by: a^3 + b^3 + 1 To: Elliptic Curve defined by y^2 + 2*x*y - 1/3*y = x^3 - x^2 + 1/3*x - 1/27 over Rational Field Defn: Defined on coordinates by sending (a, b) to (1 : -b - 1 : -3*a - 3*b) sage: f([-1,0]) (1/3 : -1/3 : 1) sage: f([0,-1]) (1/3 : 0 : 1)
>>> from sage.all import * >>> P2 = ProjectiveSpace(Integer(2),QQ, names=('u', 'v', 'w',)); (u, v, w,) = P2._first_ngens(3) >>> C = P2.subscheme(u**Integer(3) + v**Integer(3) + w**Integer(3)) >>> E = EllipticCurve([Integer(2), -Integer(1), -Integer(1)/Integer(3), Integer(1)/Integer(3), -Integer(1)/Integer(27)]) >>> from sage.schemes.elliptic_curves.weierstrass_transform import WeierstrassTransformation >>> f = WeierstrassTransformation(C, E, [w, -v-w, -Integer(3)*u-Integer(3)*v], Integer(1)); f Scheme morphism: From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by: u^3 + v^3 + w^3 To: Elliptic Curve defined by y^2 + 2*x*y - 1/3*y = x^3 - x^2 + 1/3*x - 1/27 over Rational Field Defn: Defined on coordinates by sending (u : v : w) to (w : -v - w : -3*u - 3*v) >>> f([-Integer(1), Integer(1), Integer(0)]) (0 : 1 : 0) >>> f([-Integer(1), Integer(0), Integer(1)]) (1/3 : -1/3 : 1) >>> f([ Integer(0),-Integer(1), Integer(1)]) (1/3 : 0 : 1) >>> A2 = AffineSpace(Integer(2),QQ, names=('a', 'b',)); (a, b,) = A2._first_ngens(2) >>> C = A2.subscheme(a**Integer(3) + b**Integer(3) + Integer(1)) >>> f = WeierstrassTransformation(C, E, [Integer(1), -b-Integer(1), -Integer(3)*a-Integer(3)*b], Integer(1)); f Scheme morphism: From: Closed subscheme of Affine Space of dimension 2 over Rational Field defined by: a^3 + b^3 + 1 To: Elliptic Curve defined by y^2 + 2*x*y - 1/3*y = x^3 - x^2 + 1/3*x - 1/27 over Rational Field Defn: Defined on coordinates by sending (a, b) to (1 : -b - 1 : -3*a - 3*b) >>> f([-Integer(1),Integer(0)]) (1/3 : -1/3 : 1) >>> f([Integer(0),-Integer(1)]) (1/3 : 0 : 1)
P2.<u,v,w> = ProjectiveSpace(2,QQ) C = P2.subscheme(u^3 + v^3 + w^3) E = EllipticCurve([2, -1, -1/3, 1/3, -1/27]) from sage.schemes.elliptic_curves.weierstrass_transform import WeierstrassTransformation f = WeierstrassTransformation(C, E, [w, -v-w, -3*u-3*v], 1); f f([-1, 1, 0]) f([-1, 0, 1]) f([ 0,-1, 1]) A2.<a,b> = AffineSpace(2,QQ) C = A2.subscheme(a^3 + b^3 + 1) f = WeierstrassTransformation(C, E, [1, -b-1, -3*a-3*b], 1); f f([-1,0]) f([0,-1])
- post_rescaling()[source]¶
Return the homogeneous rescaling to apply after the coordinate substitution.
OUTPUT: a polynomial; see the example below
EXAMPLES:
sage: R.<a,b,c> = QQ[] sage: cubic = a^3+7*b^3+64*c^3 sage: P = [2,2,-1] sage: f = EllipticCurve_from_cubic(cubic, P, morphism=True).inverse() sage: f.post_rescaling() -1/7
>>> from sage.all import * >>> R = QQ['a, b, c']; (a, b, c,) = R._first_ngens(3) >>> cubic = a**Integer(3)+Integer(7)*b**Integer(3)+Integer(64)*c**Integer(3) >>> P = [Integer(2),Integer(2),-Integer(1)] >>> f = EllipticCurve_from_cubic(cubic, P, morphism=True).inverse() >>> f.post_rescaling() -1/7
R.<a,b,c> = QQ[] cubic = a^3+7*b^3+64*c^3 P = [2,2,-1] f = EllipticCurve_from_cubic(cubic, P, morphism=True).inverse() f.post_rescaling()
So here is what it does. If we just plug in the coordinate transformation, we get the defining polynomial up to scale. This method returns the overall rescaling of the equation to bring the result into the standard form:
sage: cubic(f.defining_polynomials()) 7*x^3 - 7*y^2*z + 1806336*y*z^2 - 155373797376*z^3 sage: cubic(f.defining_polynomials()) * f.post_rescaling() -x^3 + y^2*z - 258048*y*z^2 + 22196256768*z^3
>>> from sage.all import * >>> cubic(f.defining_polynomials()) 7*x^3 - 7*y^2*z + 1806336*y*z^2 - 155373797376*z^3 >>> cubic(f.defining_polynomials()) * f.post_rescaling() -x^3 + y^2*z - 258048*y*z^2 + 22196256768*z^3
cubic(f.defining_polynomials()) cubic(f.defining_polynomials()) * f.post_rescaling()
- sage.schemes.elliptic_curves.weierstrass_transform.WeierstrassTransformationWithInverse(domain, codomain, defining_polynomials, post_multiplication, inv_defining_polynomials, inv_post_multiplication)[source]¶
Construct morphism of a genus-one curve to/from the Weierstrass form with its inverse.
EXAMPLES:
sage: R.<u,v,w> = QQ[] sage: f = EllipticCurve_from_cubic(u^3 + v^3 + w^3, [1,-1,0], morphism=True); f Scheme morphism: From: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3 To: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field Defn: Defined on coordinates by sending (u : v : w) to (-w : 3*u : 1/3*u + 1/3*v) Scheme morphism: From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by: u^3 + v^3 + w^3 To: Elliptic Curve defined by y^2 + 2*x*y + 1/3*y = x^3 - x^2 - 1/3*x - 1/27 over Rational Field Defn: Defined on coordinates by sending (u : v : w) to (-w : -v + w : 3*u + 3*v)
>>> from sage.all import * >>> R = QQ['u, v, w']; (u, v, w,) = R._first_ngens(3) >>> f = EllipticCurve_from_cubic(u**Integer(3) + v**Integer(3) + w**Integer(3), [Integer(1),-Integer(1),Integer(0)], morphism=True); f Scheme morphism: From: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3 To: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field Defn: Defined on coordinates by sending (u : v : w) to (-w : 3*u : 1/3*u + 1/3*v) Scheme morphism: From: Closed subscheme of Projective Space of dimension 2 over Rational Field defined by: u^3 + v^3 + w^3 To: Elliptic Curve defined by y^2 + 2*x*y + 1/3*y = x^3 - x^2 - 1/3*x - 1/27 over Rational Field Defn: Defined on coordinates by sending (u : v : w) to (-w : -v + w : 3*u + 3*v)
R.<u,v,w> = QQ[] f = EllipticCurve_from_cubic(u^3 + v^3 + w^3, [1,-1,0], morphism=True); f
- class sage.schemes.elliptic_curves.weierstrass_transform.WeierstrassTransformationWithInverse_class(domain, codomain, defining_polynomials, post_multiplication)[source]¶
Bases:
WeierstrassTransformation
- inverse()[source]¶
Return the inverse.
OUTPUT:
A morphism in the opposite direction. This may be a rational inverse or an analytic inverse.
EXAMPLES:
sage: R.<u,v,w> = QQ[] sage: f = EllipticCurve_from_cubic(u^3 + v^3 + w^3, [1,-1,0], morphism=True) sage: f.inverse() Scheme morphism: From: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field To: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3 Defn: Defined on coordinates by sending (x : y : z) to (1/3*y : -1/3*y + 3*z : -x)
>>> from sage.all import * >>> R = QQ['u, v, w']; (u, v, w,) = R._first_ngens(3) >>> f = EllipticCurve_from_cubic(u**Integer(3) + v**Integer(3) + w**Integer(3), [Integer(1),-Integer(1),Integer(0)], morphism=True) >>> f.inverse() Scheme morphism: From: Elliptic Curve defined by y^2 - 9*y = x^3 - 27 over Rational Field To: Projective Plane Curve over Rational Field defined by u^3 + v^3 + w^3 Defn: Defined on coordinates by sending (x : y : z) to (1/3*y : -1/3*y + 3*z : -x)
R.<u,v,w> = QQ[] f = EllipticCurve_from_cubic(u^3 + v^3 + w^3, [1,-1,0], morphism=True) f.inverse()