This module provides support for (Crepant Partial Resolutions of) Fano toric varieties, corresponding to crepant subdivisions of face fans of reflexive lattice polytopes. The interface is provided via CPRFanoToricVariety().
A careful exposition of different flavours of Fano varieties can be found in the paper by Benjamin Nill [Nill2005]. The main goal of this module is to support work with Gorenstein weak Fano toric varieties. Such a variety corresponds to a coherent crepant refinement of the normal fan of a reflexive polytope \(\Delta\), where crepant means that primitive generators of the refining rays lie on the facets of the polar polytope \(\Delta^\circ\) and coherent (a.k.a. regular or projective) means that there exists a strictly upper convex piecewise linear function whose domains of linearity are precisely the maximal cones of the subdivision. These varieties are important for string theory in physics, as they serve as ambient spaces for mirror pairs of Calabi-Yau manifolds via constructions due to Victor V. Batyrev [Batyrev1994] and Lev A. Borisov [Borisov1993].
From the combinatorial point of view “crepant” requirement is much more simple and natural to work with than “coherent.” For this reason, the code in this module will allow work with arbitrary crepant subdivisions without checking whether they are coherent or not. We refer to corresponding toric varieties as CPR-Fano toric varieties.
REFERENCES:
[Batyrev1994] | Victor V. Batyrev, “Dual polyhedra and mirror symmetry for Calabi-Yau hypersurfaces in toric varieties”, J. Algebraic Geom. 3 (1994), no. 3, 493-535. arXiv:alg-geom/9310003v1 |
[Borisov1993] | Lev A. Borisov, “Towards the mirror symmetry for Calabi-Yau complete intersections in Gorenstein Fano toric varieties”, 1993. arXiv:alg-geom/9310001v1 |
[CD2007] | Adrian Clingher and Charles F. Doran, “Modular invariants for lattice polarized K3 surfaces”, Michigan Math. J. 55 (2007), no. 2, 355-393. arXiv:math/0602146v1 [math.AG] |
[Nill2005] | Benjamin Nill, “Gorenstein toric Fano varieties”, Manuscripta Math. 116 (2005), no. 2, 183-210. arXiv:math/0405448v1 [math.AG] |
AUTHORS:
EXAMPLES:
Most of the functions available for Fano toric varieties are the same as for general toric varieties, so here we will concentrate only on Calabi-Yau subvarieties, which were the primary goal for creating this module.
For our first example we realize the projective plane as a Fano toric variety:
sage: simplex = LatticePolytope([(1,0), (0,1), (-1,-1)])
sage: P2 = CPRFanoToricVariety(Delta_polar=simplex)
Its anticanonical “hypersurface” is a one-dimensional Calabi-Yau manifold:
sage: P2.anticanonical_hypersurface(
... monomial_points="all")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a0*z0^3 + a9*z0^2*z1 + a7*z0*z1^2
+ a1*z1^3 + a8*z0^2*z2 + a6*z0*z1*z2
+ a4*z1^2*z2 + a5*z0*z2^2
+ a3*z1*z2^2 + a2*z2^3
In many cases it is sufficient to work with the “simplified polynomial moduli space” of anticanonical hypersurfaces:
sage: P2.anticanonical_hypersurface(
... monomial_points="simplified")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a0*z0^3 + a1*z1^3 + a6*z0*z1*z2 + a2*z2^3
The mirror family to these hypersurfaces lives inside the Fano toric variety obtained using simplex as Delta instead of Delta_polar:
sage: FTV = CPRFanoToricVariety(Delta=simplex,
... coordinate_points="all")
sage: FTV.anticanonical_hypersurface(
... monomial_points="simplified")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 9 affine patches defined by:
a2*z2^3*z3^2*z4*z5^2*z8
+ a1*z1^3*z3*z4^2*z7^2*z9
+ a3*z0*z1*z2*z3*z4*z5*z7*z8*z9
+ a0*z0^3*z5*z7*z8^2*z9^2
Here we have taken the resolved version of the ambient space for the mirror family, but in fact we don’t have to resolve singularities corresponding to the interior points of facets - they are singular points which do not lie on a generic anticanonical hypersurface:
sage: FTV = CPRFanoToricVariety(Delta=simplex,
... coordinate_points="all but facets")
sage: FTV.anticanonical_hypersurface(
... monomial_points="simplified")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a0*z0^3 + a1*z1^3 + a3*z0*z1*z2 + a2*z2^3
This looks very similar to our second version of the anticanonical hypersurface of the projective plane, as expected, since all one-dimensional Calabi-Yau manifolds are elliptic curves!
Now let’s take a look at a toric realization of \(M\)-polarized K3 surfaces studied by Adrian Clingher and Charles F. Doran in [CD2007]:
sage: p4318 = ReflexivePolytope(3, 4318) # long time
sage: FTV = CPRFanoToricVariety(Delta_polar=p4318) # long time
sage: FTV.anticanonical_hypersurface() # long time
Closed subscheme of 3-d CPR-Fano toric variety
covered by 4 affine patches defined by:
a3*z2^12 + a4*z2^6*z3^6 + a2*z3^12
+ a8*z0*z1*z2*z3 + a0*z1^3 + a1*z0^2
Below you will find detailed descriptions of available functions. Current functionality of this module is very basic, but it is under active development and hopefully will improve in future releases of Sage. If there are some particular features that you would like to see implemented ASAP, please consider reporting them to the Sage Development Team or even implementing them on your own as a patch for inclusion!
Bases: sage.schemes.generic.algebraic_scheme.AlgebraicScheme_subscheme_toric
Construct an anticanonical hypersurface of a CPR-Fano toric variety.
INPUT:
OUTPUT:
EXAMPLES:
sage: P1xP1 = toric_varieties.P1xP1()
sage: import sage.schemes.toric.fano_variety as ftv
sage: ftv.AnticanonicalHypersurface(P1xP1)
Closed subscheme of 2-d CPR-Fano toric variety
covered by 4 affine patches defined by:
a1*s^2*x^2 + a0*t^2*x^2 + a6*s*t*x*y + a3*s^2*y^2 + a2*t^2*y^2
See anticanonical_hypersurface() for a more elaborate example.
Construct a CPR-Fano toric variety.
Note
See documentation of the module fano_variety for the used definitions and supported varieties.
Due to the large number of available options, it is recommended to always use keyword parameters.
INPUT:
OUTPUT:
EXAMPLES:
We start with the product of two projective lines:
sage: diamond = lattice_polytope.cross_polytope(2)
sage: diamond.vertices_pc()
M( 1, 0),
M( 0, 1),
M(-1, 0),
M( 0, -1)
in 2-d lattice M
sage: P1xP1 = CPRFanoToricVariety(Delta_polar=diamond)
sage: P1xP1
2-d CPR-Fano toric variety covered by 4 affine patches
sage: P1xP1.fan()
Rational polyhedral fan in 2-d lattice M
sage: P1xP1.fan().rays()
M( 1, 0),
M( 0, 1),
M(-1, 0),
M( 0, -1)
in 2-d lattice M
“Unfortunately,” this variety is smooth to start with and we cannot perform any subdivisions of the underlying fan without leaving the category of CPR-Fano toric varieties. Our next example starts with a square:
sage: square = diamond.polar()
sage: square.vertices_pc()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1)
in 2-d lattice N
sage: square.points_pc()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1),
N(-1, 0),
N( 0, -1),
N( 0, 0),
N( 0, 1),
N( 1, 0)
in 2-d lattice N
We will construct several varieties associated to it:
sage: FTV = CPRFanoToricVariety(Delta_polar=square)
sage: FTV.fan().rays()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1)
in 2-d lattice N
sage: FTV.gens()
(z0, z1, z2, z3)
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,8])
sage: FTV.fan().rays()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1),
N( 1, 0)
in 2-d lattice N
sage: FTV.gens()
(z0, z1, z2, z3, z8)
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[8,0,2,1,3],
... coordinate_names="x+")
sage: FTV.fan().rays()
N( 1, 0),
N(-1, 1),
N(-1, -1),
N( 1, 1),
N( 1, -1)
in 2-d lattice N
sage: FTV.gens()
(x8, x0, x2, x1, x3)
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points="all",
... coordinate_names="x y Z+")
sage: FTV.fan().rays()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1),
N(-1, 0),
N( 0, -1),
N( 0, 1),
N( 1, 0)
in 2-d lattice N
sage: FTV.gens()
(x, y, Z2, Z3, Z4, Z5, Z7, Z8)
Note that Z6 is “missing”. This is due to the fact that the 6-th point of square is the origin, and all automatically created names have the same indices as corresponding points of Delta_polar(). This is usually very convenient, especially if you have to work with several partial resolutions of the same Fano toric variety. However, you can change it, if you want:
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points="all",
... coordinate_names="x y Z+",
... coordinate_name_indices=range(8))
sage: FTV.gens()
(x, y, Z2, Z3, Z4, Z5, Z6, Z7)
Note that you have to provide indices for all variables, including those that have “completely custom” names. Again, this is usually convenient, because you can add or remove “custom” variables without disturbing too much “automatic” ones:
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points="all",
... coordinate_names="x Z+",
... coordinate_name_indices=range(8))
sage: FTV.gens()
(x, Z1, Z2, Z3, Z4, Z5, Z6, Z7)
If you prefer to always start from zero, you will have to shift indices accordingly:
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points="all",
... coordinate_names="x Z+",
... coordinate_name_indices=[0] + range(7))
sage: FTV.gens()
(x, Z0, Z1, Z2, Z3, Z4, Z5, Z6)
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points="all",
... coordinate_names="x y Z+",
... coordinate_name_indices=[0]*2 + range(6))
sage: FTV.gens()
(x, y, Z0, Z1, Z2, Z3, Z4, Z5)
So you always can get any names you want, somewhat complicated default behaviour was designed with the hope that in most cases you will have no desire to provide different names.
Now we will use the possibility to specify initial charts:
sage: charts = [(0,1), (1,3), (3,2), (2,0)]
(these charts actually form exactly the face fan of our square)
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,4],
... charts=charts)
sage: FTV.fan().rays()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1),
N(-1, 0)
in 2-d lattice N
sage: [cone.ambient_ray_indices() for cone in FTV.fan()]
[(0, 1), (1, 3), (2, 3), (2, 4), (0, 4)]
If charts are wrong, it should be detected:
sage: bad_charts = charts + [(2,0)]
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,4],
... charts=bad_charts)
Traceback (most recent call last):
...
ValueError: you have provided 5 cones, but only 4 of them are maximal!
Use discard_faces=True if you indeed need to construct a fan from
these cones.
These charts are technically correct, they just happened to list one of them twice, but it is assumed that such a situation will not happen. It is especially important when you try to speed up your code:
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,4],
... charts=bad_charts,
... check=False)
sage: FTV.fan().rays()
N(-1, 1),
N( 1, 1),
N(-1, -1),
N( 1, -1),
N(-1, 0)
in 2-d lattice N
sage: [cone.ambient_ray_indices() for cone in FTV.fan()]
[(0, 1), (1, 3), (2, 3), (2, 4), (0, 4), (2, 4), (0, 4)]
The last line shows two of the generating cones twice. While “everything still works” in the sense “it does not crash,” any work with such a variety may lead to mathematically wrong results, so use check=False carefully!
Here are some other possible mistakes:
sage: bad_charts = charts + [(0,3)]
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,4],
... charts=bad_charts)
Traceback (most recent call last):
...
ValueError: (0, 3) does not form a chart of a subdivision of
the face fan of 2-d reflexive polytope #14 in 2-d lattice N!
sage: bad_charts = charts[:-1]
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,4],
... charts=bad_charts)
Traceback (most recent call last):
...
ValueError: given charts do not form a complete fan!
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[1,2,3,4])
Traceback (most recent call last):
...
ValueError: all 4 vertices of Delta_polar
must be used for coordinates!
Got: [1, 2, 3, 4]
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,0,1,2,3,4])
Traceback (most recent call last):
...
ValueError: no repetitions are
allowed for coordinate points!
Got: [0, 0, 1, 2, 3, 4]
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,6])
Traceback (most recent call last):
...
ValueError: the origin (point #6)
cannot be used for a coordinate!
Got: [0, 1, 2, 3, 6]
Here is a shorthand for defining the toric variety and homogeneous coordinates in one go:
sage: P1xP1.<a,b,c,d> = CPRFanoToricVariety(Delta_polar=diamond)
sage: (a^2+b^2) * (c+d)
a^2*c + b^2*c + a^2*d + b^2*d
Bases: sage.schemes.toric.variety.ToricVariety_field
Construct a CPR-Fano toric variety associated to a reflexive polytope.
Warning
This class does not perform any checks of correctness of input and it does assume that the internal structure of the given parameters is coordinated in a certain way. Use CPRFanoToricVariety() to construct CPR-Fano toric varieties.
Note
See documentation of the module fano_variety for the used definitions and supported varieties.
INPUT:
OUTPUT:
TESTS:
sage: P1xP1 = CPRFanoToricVariety(
... Delta_polar=lattice_polytope.cross_polytope(2))
sage: P1xP1
2-d CPR-Fano toric variety covered by 4 affine patches
Return the reflexive polytope associated to self.
OUTPUT:
EXAMPLES:
sage: diamond = lattice_polytope.cross_polytope(2)
sage: P1xP1 = CPRFanoToricVariety(Delta_polar=diamond)
sage: P1xP1.Delta()
2-d reflexive polytope #14 in 2-d lattice N
sage: P1xP1.Delta() is diamond.polar()
True
Return polar of Delta().
OUTPUT:
EXAMPLES:
sage: diamond = lattice_polytope.cross_polytope(2)
sage: P1xP1 = CPRFanoToricVariety(Delta_polar=diamond)
sage: P1xP1.Delta_polar()
2-d reflexive polytope #3 in 2-d lattice M
sage: P1xP1.Delta_polar() is diamond
True
sage: P1xP1.Delta_polar() is P1xP1.Delta().polar()
True
Return an anticanonical hypersurface of self.
Note
The returned hypersurface may be actually a subscheme of another CPR-Fano toric variety: if the base field of self does not include all of the required names for generic monomial coefficients, it will be automatically extended.
Below \(\Delta\) is the reflexive polytope corresponding to self, i.e. the fan of self is a refinement of the normal fan of \(\Delta\). This function accepts only keyword parameters.
INPUT:
OUTPUT:
EXAMPLES:
We realize the projective plane as a Fano toric variety:
sage: simplex = LatticePolytope([(1,0), (0,1), (-1,-1)])
sage: P2 = CPRFanoToricVariety(Delta_polar=simplex)
Its anticanonical “hypersurface” is a one-dimensional Calabi-Yau manifold:
sage: P2.anticanonical_hypersurface(
... monomial_points="all")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a0*z0^3 + a9*z0^2*z1 + a7*z0*z1^2
+ a1*z1^3 + a8*z0^2*z2 + a6*z0*z1*z2
+ a4*z1^2*z2 + a5*z0*z2^2
+ a3*z1*z2^2 + a2*z2^3
In many cases it is sufficient to work with the “simplified polynomial moduli space” of anticanonical hypersurfaces:
sage: P2.anticanonical_hypersurface(
... monomial_points="simplified")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a0*z0^3 + a1*z1^3 + a6*z0*z1*z2 + a2*z2^3
The mirror family to these hypersurfaces lives inside the Fano toric variety obtained using simplex as Delta instead of Delta_polar:
sage: FTV = CPRFanoToricVariety(Delta=simplex,
... coordinate_points="all")
sage: FTV.anticanonical_hypersurface(
... monomial_points="simplified")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 9 affine patches defined by:
a2*z2^3*z3^2*z4*z5^2*z8
+ a1*z1^3*z3*z4^2*z7^2*z9
+ a3*z0*z1*z2*z3*z4*z5*z7*z8*z9
+ a0*z0^3*z5*z7*z8^2*z9^2
Here we have taken the resolved version of the ambient space for the mirror family, but in fact we don’t have to resolve singularities corresponding to the interior points of facets - they are singular points which do not lie on a generic anticanonical hypersurface:
sage: FTV = CPRFanoToricVariety(Delta=simplex,
... coordinate_points="all but facets")
sage: FTV.anticanonical_hypersurface(
... monomial_points="simplified")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a0*z0^3 + a1*z1^3 + a3*z0*z1*z2 + a2*z2^3
This looks very similar to our second anticanonical hypersurface of the projective plane, as expected, since all one-dimensional Calabi-Yau manifolds are elliptic curves!
All anticanonical hypersurfaces constructed above were generic with automatically generated coefficients. If you want, you can specify your own names
sage: FTV.anticanonical_hypersurface(
... coefficient_names="a b c d")
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
a*z0^3 + b*z1^3 + d*z0*z1*z2 + c*z2^3
or give concrete coefficients
sage: FTV.anticanonical_hypersurface(
... coefficients=[1, 2, 3, 4])
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
z0^3 + 2*z1^3 + 4*z0*z1*z2 + 3*z2^3
or even mix numerical coefficients with some expressions
sage: H = FTV.anticanonical_hypersurface(
... coefficients=[0, "t", "1/t", "psi/(psi^2 + phi)"])
sage: H
Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by:
t*z1^3 + (psi/(psi^2 + phi))*z0*z1*z2 + 1/t*z2^3
sage: R = H.ambient_space().base_ring()
sage: R
Fraction Field of
Multivariate Polynomial Ring in phi, psi, t
over Rational Field
Return the Cartesian product of self with other.
INPUT:
OUTPUT:
EXAMPLES:
sage: P1 = toric_varieties.P1()
sage: P2 = toric_varieties.P2()
sage: P1xP2 = P1.cartesian_product(P2); P1xP2
3-d CPR-Fano toric variety covered by 6 affine patches
sage: P1xP2.fan().rays()
N+N( 1, 0, 0),
N+N(-1, 0, 0),
N+N( 0, 1, 0),
N+N( 0, 0, 1),
N+N( 0, -1, -1)
in 3-d lattice N+N
sage: P1xP2.Delta_polar()
3-d reflexive polytope in 3-d lattice N+N
Return a CPR-Fano toric variety over field F, otherwise the same as self.
INPUT:
OUTPUT:
Note
There is no need to have any relation between F and the base field of self. If you do want to have such a relation, use base_extend() instead.
EXAMPLES:
sage: P1xP1 = toric_varieties.P1xP1()
sage: P1xP1.base_ring()
Rational Field
sage: P1xP1_RR = P1xP1.change_ring(RR)
sage: P1xP1_RR.base_ring()
Real Field with 53 bits of precision
sage: P1xP1_QQ = P1xP1_RR.change_ring(QQ)
sage: P1xP1_QQ.base_ring()
Rational Field
sage: P1xP1_RR.base_extend(QQ)
Traceback (most recent call last):
...
ValueError: no natural map from the base ring
(=Real Field with 53 bits of precision)
to R (=Rational Field)!
sage: R = PolynomialRing(QQ, 2, 'a')
sage: P1xP1.change_ring(R)
Traceback (most recent call last):
...
TypeError: need a field to construct a Fano toric variety!
Got Multivariate Polynomial Ring in a0, a1 over Rational Field
Return the variable of the coordinate ring corresponding to point.
INPUT:
OUTPUT:
EXAMPLES:
sage: diamond = lattice_polytope.cross_polytope(2)
sage: FTV = CPRFanoToricVariety(diamond,
... coordinate_points=[0,1,2,3,8])
sage: FTV.coordinate_points()
(0, 1, 2, 3, 8)
sage: FTV.gens()
(z0, z1, z2, z3, z8)
sage: FTV.coordinate_point_to_coordinate(8)
z8
Return indices of points of Delta_polar() used for coordinates.
OUTPUT:
EXAMPLES:
sage: diamond = lattice_polytope.cross_polytope(2)
sage: square = diamond.polar()
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points=[0,1,2,3,8])
sage: FTV.coordinate_points()
(0, 1, 2, 3, 8)
sage: FTV.gens()
(z0, z1, z2, z3, z8)
sage: FTV = CPRFanoToricVariety(Delta_polar=square,
... coordinate_points="all")
sage: FTV.coordinate_points()
(0, 1, 2, 3, 4, 5, 7, 8)
sage: FTV.gens()
(z0, z1, z2, z3, z4, z5, z7, z8)
Note that one point is missing, namely
sage: square.origin()
6
Return a nef complete intersection in self.
Note
The returned complete intersection may be actually a subscheme of another CPR-Fano toric variety: if the base field of self does not include all of the required names for monomial coefficients, it will be automatically extended.
Below \(\Delta\) is the reflexive polytope corresponding to self, i.e. the fan of self is a refinement of the normal fan of \(\Delta\). Other polytopes are described in the documentation of nef-partitions of reflexive polytopes.
Except for the first argument, nef_partition, this method accepts only keyword parameters.
INPUT:
nef_partition – a \(k\)-part nef-partition of \(\Delta^\circ\), all other parameters (if given) must be lists of length \(k\);
monomial_points – the \(i\)-th element of this list is either a list of integers or a string. A list will be interpreted as indices of points of \(\Delta_i\) which should be used for monomials of the \(i\)-th polynomial of this complete intersection. A string must be one of the following descriptions of points of \(\Delta_i\):
when using this description, it is also OK to pass a single string as monomial_points instead of repeating it \(k\) times;
coefficient_names – the \(i\)-th element of this list specifies names for the monomial coefficients of the \(i\)-th polynomial, see normalize_names() for acceptable formats. If not given, indexed coefficient names will be created automatically;
coefficient_name_indices – the \(i\)-th element of this list specifies indices for indexed coefficients of the \(i\)-th polynomial. If not given, the index of each coefficient will coincide with the index of the corresponding point of \(\Delta_i\);
coefficients – as an alternative to specifying coefficient names and/or indices, you can give the coefficients themselves as arbitrary expressions and/or strings. Using strings allows you to easily add “parameters”: the base field of self will be extended to include all necessary names.
OUTPUT:
EXAMPLES:
We construct several complete intersections associated to the same nef-partition of the 3-dimensional reflexive polytope #2254:
sage: p = ReflexivePolytope(3, 2254) # long time (7s on sage.math, 2011)
sage: np = p.nef_partitions()[1] # long time
sage: np # long time
Nef-partition {2, 3, 4, 7, 8} U {0, 1, 5, 6}
sage: X = CPRFanoToricVariety(Delta_polar=p) # long time
sage: X.nef_complete_intersection(np) # long time
Closed subscheme of 3-d CPR-Fano toric variety
covered by 10 affine patches defined by:
a2*z1*z4^2*z5^2*z7^3 + a1*z2*z4*z5*z6*z7^2*z8^2
+ a3*z2*z3*z4*z7*z8 + a0*z0*z2,
b2*z1*z4*z5^2*z6^2*z7^2*z8^2 + b0*z2*z5*z6^3*z7*z8^4
+ b5*z1*z3*z4*z5*z6*z7*z8 + b3*z2*z3*z6^2*z8^3
+ b1*z1*z3^2*z4 + b4*z0*z1*z5*z6
Now we include only monomials associated to vertices of \(\Delta_i\):
sage: X.nef_complete_intersection(np, monomial_points="vertices") # long time
Closed subscheme of 3-d CPR-Fano toric variety
covered by 10 affine patches defined by:
a2*z1*z4^2*z5^2*z7^3 + a1*z2*z4*z5*z6*z7^2*z8^2
+ a3*z2*z3*z4*z7*z8 + a0*z0*z2,
b2*z1*z4*z5^2*z6^2*z7^2*z8^2 + b0*z2*z5*z6^3*z7*z8^4
+ b3*z2*z3*z6^2*z8^3 + b1*z1*z3^2*z4 + b4*z0*z1*z5*z6
(effectively, we set b5=0). Next we provide coefficients explicitly instead of using default generic names:
sage: X.nef_complete_intersection(np, # long time
... monomial_points="vertices",
... coefficients=[("a", "a^2", "a/e", "c_i"), range(1,6)])
Closed subscheme of 3-d CPR-Fano toric variety
covered by 10 affine patches defined by:
a/e*z1*z4^2*z5^2*z7^3 + a^2*z2*z4*z5*z6*z7^2*z8^2
+ c_i*z2*z3*z4*z7*z8 + a*z0*z2,
3*z1*z4*z5^2*z6^2*z7^2*z8^2 + z2*z5*z6^3*z7*z8^4
+ 4*z2*z3*z6^2*z8^3 + 2*z1*z3^2*z4 + 5*z0*z1*z5*z6
Finally, we take a look at the generic representative of these complete intersections in a completely resolved ambient toric variety:
sage: X = CPRFanoToricVariety(Delta_polar=p, # long time
... coordinate_points="all")
sage: X.nef_complete_intersection(np) # long time
Closed subscheme of 3-d CPR-Fano toric variety
covered by 22 affine patches defined by:
a1*z2*z4*z5*z6*z7^2*z8^2*z9^2*z10^2*z11*z12*z13
+ a2*z1*z4^2*z5^2*z7^3*z9*z10^2*z12*z13
+ a3*z2*z3*z4*z7*z8*z9*z10*z11*z12 + a0*z0*z2,
b0*z2*z5*z6^3*z7*z8^4*z9^3*z10^2*z11^2*z12*z13^2
+ b2*z1*z4*z5^2*z6^2*z7^2*z8^2*z9^2*z10^2*z11*z12*z13^2
+ b3*z2*z3*z6^2*z8^3*z9^2*z10*z11^2*z12*z13
+ b5*z1*z3*z4*z5*z6*z7*z8*z9*z10*z11*z12*z13
+ b1*z1*z3^2*z4*z11*z12 + b4*z0*z1*z5*z6*z13
Construct a toric variety whose fan subdivides the fan of self.
This function accepts only keyword arguments, none of which are mandatory.
INPUT:
OUTPUT:
EXAMPLES:
sage: diamond = lattice_polytope.cross_polytope(2)
sage: FTV = CPRFanoToricVariety(Delta=diamond)
sage: FTV.coordinate_points()
(0, 1, 2, 3)
sage: FTV.gens()
(z0, z1, z2, z3)
sage: FTV_res = FTV.resolve(new_points=[6,8])
Traceback (most recent call last):
...
ValueError: the origin (point #6)
cannot be used for subdivision!
sage: FTV_res = FTV.resolve(new_points=[8,5])
sage: FTV_res
2-d CPR-Fano toric variety covered by 6 affine patches
sage: FTV_res.coordinate_points()
(0, 1, 2, 3, 8, 5)
sage: FTV_res.gens()
(z0, z1, z2, z3, z8, z5)
sage: TV_res = FTV.resolve(new_rays=[(1,2)])
sage: TV_res
2-d toric variety covered by 5 affine patches
sage: TV_res.gens()
(z0, z1, z2, z3, z4)
Bases: sage.schemes.generic.algebraic_scheme.AlgebraicScheme_subscheme_toric
Construct a nef complete intersection in a CPR-Fano toric variety.
INPUT:
OUTPUT:
EXAMPLES:
sage: o = lattice_polytope.cross_polytope(3)
sage: np = o.nef_partitions()[0]
sage: np
Nef-partition {0, 1, 3} U {2, 4, 5}
sage: X = CPRFanoToricVariety(Delta_polar=o)
sage: X.nef_complete_intersection(np)
Closed subscheme of 3-d CPR-Fano toric variety
covered by 8 affine patches defined by:
a1*z0^2*z1 + a4*z0*z1*z3 + a3*z1*z3^2
+ a0*z0^2*z4 + a5*z0*z3*z4 + a2*z3^2*z4,
b0*z1*z2^2 + b1*z2^2*z4 + b4*z1*z2*z5
+ b5*z2*z4*z5 + b3*z1*z5^2 + b2*z4*z5^2
See CPRFanoToricVariety_field.nef_complete_intersection() for a more elaborate example.
Return the nef-partition associated to self.
OUTPUT:
EXAMPLES:
sage: o = lattice_polytope.cross_polytope(3)
sage: np = o.nef_partitions()[0]
sage: np
Nef-partition {0, 1, 3} U {2, 4, 5}
sage: X = CPRFanoToricVariety(Delta_polar=o)
sage: CI = X.nef_complete_intersection(np)
sage: CI
Closed subscheme of 3-d CPR-Fano toric variety
covered by 8 affine patches defined by:
a1*z0^2*z1 + a4*z0*z1*z3 + a3*z1*z3^2
+ a0*z0^2*z4 + a5*z0*z3*z4 + a2*z3^2*z4,
b0*z1*z2^2 + b1*z2^2*z4 + b4*z1*z2*z5
+ b5*z2*z4*z5 + b3*z1*z5^2 + b2*z4*z5^2
sage: CI.nef_partition()
Nef-partition {0, 1, 3} U {2, 4, 5}
sage: CI.nef_partition() is np
True
Extend field to include all variables.
INPUT:
OUTPUT:
EXAMPLES:
We start with the rational field and slowly add more variables:
sage: from sage.schemes.toric.fano_variety import *
sage: F = add_variables(QQ, []); F # No extension
Rational Field
sage: F = add_variables(QQ, ["a"]); F
Fraction Field of Univariate Polynomial Ring
in a over Rational Field
sage: F = add_variables(F, ["a"]); F
Fraction Field of Univariate Polynomial Ring
in a over Rational Field
sage: F = add_variables(F, ["b", "c"]); F
Fraction Field of Multivariate Polynomial Ring
in a, b, c over Rational Field
sage: F = add_variables(F, ["c", "d", "b", "c", "d"]); F
Fraction Field of Multivariate Polynomial Ring
in a, b, c, d over Rational Field
Check if x is a CPR-Fano toric variety.
INPUT:
OUTPUT:
Note
While projective spaces are Fano toric varieties mathematically, they are not toric varieties in Sage due to efficiency considerations, so this function will return False.
EXAMPLES:
sage: from sage.schemes.toric.fano_variety import (
... is_CPRFanoToricVariety)
sage: is_CPRFanoToricVariety(1)
False
sage: FTV = toric_varieties.P2()
sage: FTV
2-d CPR-Fano toric variety covered by 3 affine patches
sage: is_CPRFanoToricVariety(FTV)
True
sage: is_CPRFanoToricVariety(ProjectiveSpace(2))
False