There are 16 reflexive polygons in 2-d. Each defines a toric Fano
variety, which (since it is 2-d) has a unique crepant resolution to a smooth
toric surface. An anticanonical hypersurface defines a genus one curve
in this ambient space, with Jacobian elliptic curve
which
can be defined by the Weierstrass model
. The
coefficients
and
can be computed with the
weierstrass module. The purpose of this
model is to give an explicit rational map
. This is an
-cover, where
is the minimal multi-section of
.
Since it is technically often easier to deal with polynomials than
with fractions, we return the rational map in terms of homogeneous
coordinates. That is, the ambient space for the Weierstrass model is
the weighted projective space with homogeneous
coordinates
. The
homogenized Weierstrass equation is
EXAMPLES:
sage: R.<x,y> = QQ[]
sage: cubic = x^3 + y^3 + 1
sage: f, g = WeierstrassForm(cubic); (f,g)
(0, -27/4)
That is, this hypersurface has a Weierstrass
equation
where
are projective coordinates on
. The
form of the map
is:
sage: X,Y,Z = WeierstrassForm(cubic, transformation=True); (X,Y,Z)
(-x^3*y^3 - x^3 - y^3,
1/2*x^6*y^3 - 1/2*x^3*y^6 - 1/2*x^6 + 1/2*y^6 + 1/2*x^3 - 1/2*y^3,
x*y)
Note that plugging in to the Weierstrass equation is a
complicated polynomial, but contains the hypersurface equation as a
factor:
sage: -Y^2 + X^3 + f*X*Z^4 + g*Z^6
-1/4*x^12*y^6 - 1/2*x^9*y^9 - 1/4*x^6*y^12 + 1/2*x^12*y^3
- 7/2*x^9*y^6 - 7/2*x^6*y^9 + 1/2*x^3*y^12 - 1/4*x^12 - 7/2*x^9*y^3
- 45/4*x^6*y^6 - 7/2*x^3*y^9 - 1/4*y^12 - 1/2*x^9 - 7/2*x^6*y^3
- 7/2*x^3*y^6 - 1/2*y^9 - 1/4*x^6 + 1/2*x^3*y^3 - 1/4*y^6
sage: cubic.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
True
If you prefer you can also use homogeneous coordinates for
sage: R.<x,y,z> = QQ[]
sage: cubic = x^3 + y^3 + z^3
sage: f, g = WeierstrassForm(cubic); (f,g)
(0, -27/4)
sage: X,Y,Z = WeierstrassForm(cubic, transformation=True)
sage: cubic.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
True
The 16 toric surfaces corresponding to the 16 reflexive polygons can
all be blown down to ,
,
or
. Their (and hence in all 16 cases)
anticanonical hypersurface can equally be brought into Weierstrass
form. For example, here is an anticanonical hypersurface in
sage: P2_112 = toric_varieties.P2_112()
sage: C = P2_112.anticanonical_hypersurface(coefficients=[1]*4); C
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
z0^4 + z2^4 + z0*z1*z2 + z1^2
sage: eq = C.defining_polynomials()[0]
sage: f, g = WeierstrassForm(eq)
sage: X,Y,Z = WeierstrassForm(eq, transformation=True)
sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(C.defining_ideal())
0
Finally, you sometimes have to manually specify the variables to use. This is either because the equation is degenerate or because it contains additional variables that you want to treat as coefficients:
sage: R.<a, x,y,z> = QQ[]
sage: cubic = x^3 + y^3 + z^3 + a*x*y*z
sage: f, g = WeierstrassForm(cubic, variables=[x,y,z])
sage: X,Y,Z = WeierstrassForm(cubic, variables=[x,y,z], transformation=True)
sage: cubic.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
True
REFERENCES:
[AnEtAl] | An, Sang Yook et al: Jacobians of Genus One Curves, Journal of Number Theory 90 (2002), pp.304–315, http://www.math.arizona.edu/~wmc/Research/JacobianFinal.pdf |
Return the Weierstrass form of an anticanonical hypersurface.
You should use sage.schemes.toric.weierstrass.WeierstrassForm() with transformation=True to get the transformation. This function is only for internal use.
INPUT:
OUTPUT:
A triple of polynomials defining a rational map of the
toric hypersurface to its Weierstrass form in
. That is, the triple satisfies
when restricted to the toric hypersurface.
EXAMPLES:
sage: R.<x,y,z> = QQ[]
sage: cubic = x^3 + y^3 + z^3
sage: X,Y,Z = WeierstrassForm(cubic, transformation=True); (X,Y,Z)
(-x^3*y^3 - x^3*z^3 - y^3*z^3,
1/2*x^6*y^3 - 1/2*x^3*y^6 - 1/2*x^6*z^3 + 1/2*y^6*z^3
+ 1/2*x^3*z^6 - 1/2*y^3*z^6,
x*y*z)
sage: f, g = WeierstrassForm(cubic); (f,g)
(0, -27/4)
sage: cubic.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
True
Only the affine span of the Newton polytope of the polynomial matters. For example:
sage: WeierstrassForm(cubic.subs(z=1), transformation=True)
(-x^3*y^3 - x^3 - y^3,
1/2*x^6*y^3 - 1/2*x^3*y^6 - 1/2*x^6
+ 1/2*y^6 + 1/2*x^3 - 1/2*y^3,
x*y)
sage: WeierstrassForm(x * cubic, transformation=True)
(-x^3*y^3 - x^3*z^3 - y^3*z^3,
1/2*x^6*y^3 - 1/2*x^3*y^6 - 1/2*x^6*z^3 + 1/2*y^6*z^3
+ 1/2*x^3*z^6 - 1/2*y^3*z^6,
x*y*z)
This allows you to work with either homogeneous or inhomogeneous variables. For example, here is the del Pezzo surface of degree 8:
sage: dP8 = toric_varieties.dP8()
sage: dP8.inject_variables()
Defining t, x, y, z
sage: WeierstrassForm(x*y^2 + y^2*z + t^2*x^3 + t^2*z^3, transformation=True)
(-1/27*t^4*x^6 - 2/27*t^4*x^5*z - 5/27*t^4*x^4*z^2
- 8/27*t^4*x^3*z^3 - 5/27*t^4*x^2*z^4 - 2/27*t^4*x*z^5
- 1/27*t^4*z^6 - 4/81*t^2*x^4*y^2 - 4/81*t^2*x^3*y^2*z
- 4/81*t^2*x*y^2*z^3 - 4/81*t^2*y^2*z^4 - 2/81*x^2*y^4
- 4/81*x*y^4*z - 2/81*y^4*z^2,
0,
1/3*t^2*x^2*z + 1/3*t^2*x*z^2 - 1/9*x*y^2 - 1/9*y^2*z)
sage: WeierstrassForm(x*y^2 + y^2 + x^3 + 1, transformation=True)
(-1/27*x^6 - 4/81*x^4*y^2 - 2/81*x^2*y^4 - 2/27*x^5
- 4/81*x^3*y^2 - 4/81*x*y^4 - 5/27*x^4 - 2/81*y^4 - 8/27*x^3
- 4/81*x*y^2 - 5/27*x^2 - 4/81*y^2 - 2/27*x - 1/27,
0,
-1/9*x*y^2 + 1/3*x^2 - 1/9*y^2 + 1/3*x)
By specifying only certain variables we can compute the
Weierstrass form over the function field generated by the
remaining variables. For example, here is a cubic over
sage: R.<a, x,y,z> = QQ[]
sage: cubic = x^3 + a*y^3 + a^2*z^3
sage: WeierstrassForm(cubic, variables=[x,y,z], transformation=True)
(-a^9*y^3*z^3 - a^8*x^3*z^3 - a^7*x^3*y^3,
-1/2*a^14*y^3*z^6 + 1/2*a^13*y^6*z^3 + 1/2*a^13*x^3*z^6
- 1/2*a^11*x^3*y^6 - 1/2*a^11*x^6*z^3 + 1/2*a^10*x^6*y^3,
a^3*x*y*z)
TESTS:
sage: for P in ReflexivePolytopes(2):
....: S = ToricVariety(FaceFan(P))
....: p = sum( (-S.K()).sections_monomials() )
....: f, g = WeierstrassForm(p)
....: X,Y,Z = WeierstrassForm(p, transformation=True)
....: print P, p.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
Reflexive polytope 0: 2-dimensional, 3 vertices. True
Reflexive polytope 1: 2-dimensional, 3 vertices. True
Reflexive polytope 2: 2-dimensional, 4 vertices. True
Reflexive polytope 3: 2-dimensional, 4 vertices. True
Reflexive polytope 4: 2-dimensional, 4 vertices. True
Reflexive polytope 5: 2-dimensional, 5 vertices. True
Reflexive polytope 6: 2-dimensional, 3 vertices. True
Reflexive polytope 7: 2-dimensional, 4 vertices. True
Reflexive polytope 8: 2-dimensional, 5 vertices. True
Reflexive polytope 9: 2-dimensional, 6 vertices. True
Reflexive polytope 10: 2-dimensional, 4 vertices. True
Reflexive polytope 11: 2-dimensional, 5 vertices. True
Reflexive polytope 12: 2-dimensional, 3 vertices. True
Reflexive polytope 13: 2-dimensional, 4 vertices. True
Reflexive polytope 14: 2-dimensional, 4 vertices. True
Reflexive polytope 15: 2-dimensional, 3 vertices. True
Map an anticanonical hypersurface in
into Weierstrass form.
Input/output is the same as WeierstrassMap(), except that
the input polynomial must be a standard anticanonical hypersurface
in the toric surface :
EXAMPLES:
sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P1xP1
sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P1xP1
sage: R.<x0,x1,y0,y1,a>= QQ[]
sage: biquadric = ( x0^2*y0^2 + x1^2*y0^2 + x0^2*y1^2 + x1^2*y1^2 +
....: a * x0*x1*y0*y1*5 )
sage: f, g = WeierstrassForm_P1xP1(biquadric, [x0, x1, y0, y1]); (f,g)
(-625/48*a^4 + 25/3*a^2 - 16/3, 15625/864*a^6 - 625/36*a^4 - 100/9*a^2 + 128/27)
sage: X, Y, Z = WeierstrassMap_P1xP1(biquadric, [x0, x1, y0, y1])
sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(biquadric))
0
sage: R = PolynomialRing(QQ, 'x,y,s,t', order='lex')
sage: R.inject_variables()
Defining x, y, s, t
sage: equation = ( s^2*(x^2+2*x*y+3*y^2) + s*t*(4*x^2+5*x*y+6*y^2)
....: + t^2*(7*x^2+8*x*y+9*y^2) )
sage: X, Y, Z = WeierstrassMap_P1xP1(equation, [x,y,s,t])
sage: f, g = WeierstrassForm_P1xP1(equation, variables=[x,y,s,t])
sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
0
sage: R = PolynomialRing(QQ, 'x,s', order='lex')
sage: R.inject_variables()
Defining x, s
sage: equation = s^2*(x^2+2*x+3) + s*(4*x^2+5*x+6) + (7*x^2+8*x+9)
sage: X, Y, Z = WeierstrassMap_P1xP1(equation)
sage: f, g = WeierstrassForm_P1xP1(equation)
sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
0
Map a cubic to its Weierstrass form
Input/output is the same as WeierstrassMap(), except that
the input polynomial must be a cubic in ,
EXAMPLES:
sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2
sage: R.<x,y,z> = QQ[]
sage: equation = x^3+y^3+z^3+x*y*z
sage: f, g = WeierstrassForm_P2(equation)
sage: X,Y,Z = WeierstrassMap_P2(equation)
sage: equation.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
True
sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2
sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2
sage: R.<x,y> = QQ[]
sage: equation = x^3+y^3+1
sage: f, g = WeierstrassForm_P2(equation)
sage: X,Y,Z = WeierstrassMap_P2(equation)
sage: equation.divides(-Y^2 + X^3 + f*X*Z^4 + g*Z^6)
True
Map an anticanonical hypersurface in into Weierstrass form.
Input/output is the same as WeierstrassMap(), except that
the input polynomial must be a standard anticanonical hypersurface
in weighted projective space :
EXAMPLES:
sage: from sage.schemes.toric.weierstrass_covering import WeierstrassMap_P2_112
sage: from sage.schemes.toric.weierstrass import WeierstrassForm_P2_112
sage: R = PolynomialRing(QQ, 'x,y,a0,a1,a2,a3,a4', order='lex')
sage: R.inject_variables()
Defining x, y, a0, a1, a2, a3, a4
sage: equation = y^2 + a0*x^4 + 4*a1*x^3 + 6*a2*x^2 + 4*a3*x + a4
sage: X, Y, Z = WeierstrassMap_P2_112(equation, [x,y])
sage: f, g = WeierstrassForm_P2_112(equation, variables=[x,y])
sage: (-Y^2 + X^3 + f*X*Z^4 + g*Z^6).reduce(R.ideal(equation))
0
Another example, this time in homogeneous coordinates:
sage: fan = Fan(rays=[(1,0),(0,1),(-1,-2),(0,-1)],cones=[[0,1],[1,2],[2,3],[3,0]])
sage: P112.<x,y,z,t> = ToricVariety(fan)
sage: (-P112.K()).sections_monomials()
(z^4*t^2, x*z^3*t^2, x^2*z^2*t^2, x^3*z*t^2,
x^4*t^2, y*z^2*t, x*y*z*t, x^2*y*t, y^2)
sage: C_eqn = sum(_)
sage: C = P112.subscheme(C_eqn)
sage: WeierstrassForm_P2_112(C_eqn, [x,y,z,t])
(-97/48, 17/864)
sage: X, Y, Z = WeierstrassMap_P2_112(C_eqn, [x,y,z,t])
sage: (-Y^2 + X^3 - 97/48*X*Z^4 + 17/864*Z^6).reduce(C.defining_ideal())
0