# Subschemes of toric space#

AUTHORS:

• David Kohel (2005): initial version.

• William Stein (2005): initial version.

• Andrey Novoseltsev (2010-05-17): subschemes of toric varieties.

class sage.schemes.toric.toric_subscheme.AlgebraicScheme_subscheme_affine_toric(toric_variety, polynomials)#

Construct an algebraic subscheme of an affine toric variety.

Warning

You should not create objects of this class directly. The preferred method to construct such subschemes is to use subscheme() method of toric varieties.

INPUT:

• toric_variety – ambient affine toric variety;

• polynomials – single polynomial, list, or ideal of defining polynomials in the coordinate ring of toric_variety.

OUTPUT:

dimension()#

Return the dimension of self.

OUTPUT: An integer.

EXAMPLES:

sage: P1xP1.<s0,s1,t0,t1> = toric_varieties.P1xP1()
sage: P1 = P1xP1.subscheme(s0 - s1)
sage: P1.dimension()
1


A more complicated example where the ambient toric variety is not smooth:

sage: X.<x,y> = toric_varieties.A2_Z2()
sage: X.is_smooth()
False
sage: Y = X.subscheme([x*y, x^2])
sage: Y
Closed subscheme of 2-d affine toric variety defined by:
x*y,
x^2
sage: Y.dimension()
1

is_smooth(point=None)#

Test whether the algebraic subscheme is smooth.

INPUT:

• point – A point or None (default). The point to test smoothness at.

OUTPUT:

Boolean. If no point was specified, returns whether the algebraic subscheme is smooth everywhere. Otherwise, smoothness at the specified point is tested.

EXAMPLES:

sage: A2.<x,y> = toric_varieties.A2()
sage: cuspidal_curve = A2.subscheme([y^2 - x^3])
sage: cuspidal_curve
Closed subscheme of 2-d affine toric variety defined by:
-x^3 + y^2
sage: cuspidal_curve.is_smooth([1,1])
True
sage: cuspidal_curve.is_smooth([0,0])
False
sage: cuspidal_curve.is_smooth()
False
sage: circle = A2.subscheme(x^2 + y^2 - 1)
sage: circle.is_smooth([1,0])
True
sage: circle.is_smooth()
True


A more complicated example where the ambient toric variety is not smooth:

sage: X.<x,y> = toric_varieties.A2_Z2()    # 2-d affine space mod Z/2
sage: X.is_smooth()
False
sage: Y = X.subscheme([x*y, x^2])   # (twice the x=0 curve) mod Z/2
sage: Y
Closed subscheme of 2-d affine toric variety defined by:
x*y,
x^2
sage: Y.dimension()   # Y is a Weil divisor but not Cartier
1
sage: Y.is_smooth()
True
sage: Y.is_smooth([0,0])
True

class sage.schemes.toric.toric_subscheme.AlgebraicScheme_subscheme_toric(toric_variety, polynomials)#

Construct an algebraic subscheme of a toric variety.

Warning

You should not create objects of this class directly. The preferred method to construct such subschemes is to use subscheme() method of toric varieties.

INPUT:

• toric_variety – ambient toric variety.

• polynomials – single polynomial, list, or ideal of defining polynomials in the coordinate ring of toric_variety.

affine_algebraic_patch(cone=None, names=None)#

Return the affine patch corresponding to cone as an affine algebraic scheme.

INPUT:

• cone – a Cone $$\sigma$$ of the fan. It can be omitted for an affine toric variety, in which case the single generating cone is used.

OUTPUT:

An affine algebraic subscheme corresponding to the patch $$\mathop{Spec}(\sigma^\vee \cap M)$$ associated to the cone $$\sigma$$.

See also affine_patch(), which expresses the patches as subvarieties of affine toric varieties instead.

REFERENCES:

David A. Cox, “The Homogeneous Coordinate Ring of a Toric Variety”, Lemma 2.2. arXiv alg-geom/9210008v2

EXAMPLES:

sage: P2.<x,y,z> = toric_varieties.P2()
sage: cone = P2.fan().generating_cone(0)
sage: V = P2.subscheme(x^3 + y^3 + z^3)
sage: V.affine_algebraic_patch(cone)
Closed subscheme of Affine Space of dimension 2 over Rational Field defined by:
z0^3 + z1^3 + 1

sage: cone = Cone([(0,1), (2,1)])
sage: A2Z2.<x,y> = AffineToricVariety(cone)
sage: A2Z2.affine_algebraic_patch()
Closed subscheme of Affine Space of dimension 3 over Rational Field defined by:
-z0*z1 + z2^2
sage: V = A2Z2.subscheme(x^2 + y^2 - 1)
sage: patch = V.affine_algebraic_patch();  patch
Closed subscheme of Affine Space of dimension 3 over Rational Field defined by:
-z0*z1 + z2^2,
z0 + z1 - 1
sage: nbhd_patch = V.neighborhood([1,0]).affine_algebraic_patch();  nbhd_patch
Closed subscheme of Affine Space of dimension 3 over Rational Field defined by:
-z0*z1 + z2^2,
z0 + z1 - 1
sage: nbhd_patch.embedding_center()
(0, 1, 0)


Here we got two defining equations. The first one describes the singularity of the ambient space and the second is the pull-back of $$x^2+y^2-1$$

sage: lp = LatticePolytope([(1,0,0), (1,1,0), (1,1,1), (1,0,1), (-2,-1,-1)],
....:                      lattice=ToricLattice(3))
sage: X.<x,y,u,v,t> = CPRFanoToricVariety(Delta_polar=lp)
sage: Y = X.subscheme(x*v + y*u + t)
sage: cone = Cone([(1,0,0), (1,1,0), (1,1,1), (1,0,1)])
sage: Y.affine_algebraic_patch(cone)
Closed subscheme of Affine Space of dimension 4 over Rational Field defined by:
z0*z2 - z1*z3,
z1 + z3 + 1

affine_patch(i)#

Return the i-th affine patch of self as an affine toric algebraic scheme.

INPUT:

• i – integer, index of a generating cone of the fan of the ambient space of self.

OUTPUT:

The result is cached, so the i-th patch is always the same object in memory.

EXAMPLES:

sage: P1xP1 = toric_varieties.P1xP1()
sage: patch1 = P1xP1.affine_patch(1)
sage: patch1.embedding_morphism()
Scheme morphism:
From: 2-d affine toric variety
To:   2-d CPR-Fano toric variety covered by 4 affine patches
Defn: Defined on coordinates by sending [t : x] to [1 : t : x : 1]
sage: P1xP1.inject_variables()
Defining s, t, x, y
sage: P1 = P1xP1.subscheme(x - y)
sage: subpatch = P1.affine_patch(1)
sage: subpatch
Closed subscheme of 2-d affine toric variety defined by:
x - 1

dimension()#

Return the dimension of self.

OUTPUT: An integer. If self is empty, $$-1$$ is returned.

EXAMPLES:

sage: P1xP1 = toric_varieties.P1xP1()
sage: P1xP1.inject_variables()
Defining s, t, x, y
sage: P1 = P1xP1.subscheme(s - t)
sage: P1.dimension()
1
sage: P1xP1.subscheme([s - t, (s-t)^2]).dimension()
1
sage: P1xP1.subscheme([s, t]).dimension()
-1

fan()#

Return the fan of the ambient space.

OUTPUT: A fan.

EXAMPLES:

sage: P2.<x,y,z> = toric_varieties.P(2)
sage: E = P2.subscheme([x^2 + y^2 + z^2])
sage: E.fan()
Rational polyhedral fan in 2-d lattice N

is_nondegenerate()#

Check if self is nondegenerate.

OUTPUT:

Whether the variety is nondegenerate, that is, the intersection with every open torus orbit is smooth and transversal.

EXAMPLES:

sage: P2.<x,y,z> = toric_varieties.P2()
sage: P2.subscheme([x^3 + y^3 + z^3]).is_nondegenerate()
True
sage: P2.subscheme([x*y*z]).is_nondegenerate()
False
sage: X = P2.subscheme([(x-y)^2*(x+y) + x*y*z + z^3])
sage: X.is_smooth()
True
sage: X.is_nondegenerate()
False


A K3 surface in $$\mathbf{P}^1 \times \mathbf{P}^1 \times \mathbf{P}^1$$:

sage: diamond = lattice_polytope.cross_polytope(3)
sage: fan = FaceFan(diamond)
sage: P1xP1xP1 = ToricVariety(fan)
sage: z0, z1, z2, z3, z4, z5 = P1xP1xP1.gens()
sage: t = 5
sage: F = z0^2*z1^2*z2^2 + z1^2*z2^2*z3^2 + z0^2*z2^2*z4^2\
....: + z2^2*z3^2*z4^2 + t*z0*z1*z2*z3*z4*z5 + z0^2*z1^2*z5^2\
....: + z1^2*z3^2*z5^2 + z0^2*z4^2*z5^2 + z3^2*z4^2*z5^2
sage: X = P1xP1xP1.subscheme([F])
sage: X.is_smooth()
True
sage: X.is_nondegenerate()
False


Taking a random change of variables breaks the symmetry, but makes the surface nondegenerate:

sage: F1 = F.subs(z0=1*z0 + 1*z3, z3=1*z0 + 2*z3,
....:             z1=-2*z1 + -1*z4, z4=1*z1 + 2*z4,
....:             z2=-3*z2 + -1*z5, z5=-3*z2 + 2*z5)
sage: Y = P1xP1xP1.subscheme([F1])
sage: Y.is_smooth()
True
sage: Y.is_nondegenerate()
True


This example is from Hamm, arXiv 1106.1826v1. It addresses an issue raised at github issue #15239:

sage: X = toric_varieties.WP([1,4,2,3], names='z0 z1 z2 z3')
sage: X.inject_variables()
Defining z0, z1, z2, z3
sage: g0 = z1^3 + z2^6 + z3^4
sage: g = g0 - 2*z3^2*z0^6 + z2*z0^10 + z0^12
sage: Y = X.subscheme([g])
sage: Y.is_nondegenerate()
False


It handles nonzero characteristic:

sage: P2.<x,y,z> = toric_varieties.P2()
sage: f = x^5 + 2*x*y^4 + y^5 - 2*y^3*z^2 + x*z^4 - 2*z^5
sage: P2.change_ring(GF(5)).subscheme([f]).is_nondegenerate()               # optional - sage.rings.finite_rings
True
sage: P2.change_ring(GF(7)).subscheme([f]).is_nondegenerate()               # optional - sage.rings.finite_rings
False

is_schon()#

Check if self is schon (nondegenerate).

See is_nondegenerate() for further documentation.

EXAMPLES:

sage: P2.<x,y,z> = toric_varieties.P2()
sage: X = P2.subscheme([(x-y)^2*(x+y) + x*y*z + z^3])
sage: X.is_smooth()
True
sage: X.is_schon()
False

is_smooth(point=None)#

Test whether the algebraic subscheme is smooth.

INPUT:

• point – A point or None (default). The point to test smoothness at.

OUTPUT:

Boolean. If no point was specified, returns whether the algebraic subscheme is smooth everywhere. Otherwise, smoothness at the specified point is tested.

EXAMPLES:

sage: P2.<x,y,z> = toric_varieties.P2()
sage: cuspidal_curve = P2.subscheme([y^2*z - x^3])
sage: cuspidal_curve
Closed subscheme of 2-d CPR-Fano toric variety covered by 3 affine patches defined by:
-x^3 + y^2*z
sage: cuspidal_curve.is_smooth([1,1,1])
True
sage: cuspidal_curve.is_smooth([0,0,1])
False
sage: cuspidal_curve.is_smooth()
False


Any sufficiently generic cubic hypersurface is smooth:

sage: P2.subscheme([y^2*z-x^3+z^3+1/10*x*y*z]).is_smooth()
True


A more complicated example:

sage: dP6.<x0,x1,x2,x3,x4,x5> = toric_varieties.dP6()
sage: disjointP1s = dP6.subscheme(x0*x3)
sage: disjointP1s.is_smooth()
True
sage: intersectingP1s = dP6.subscheme(x0*x1)
sage: intersectingP1s.is_smooth()
False


A smooth hypersurface in a compact singular toric variety:

sage: lp = LatticePolytope([(1,0,0), (1,1,0), (1,1,1), (1,0,1), (-2,-1,-1)],
....:                      lattice=ToricLattice(3))
sage: X.<x,y,u,v,t> = CPRFanoToricVariety(Delta_polar=lp)
sage: Y = X.subscheme(x*v + y*u + t)
sage: cone = Cone([(1,0,0), (1,1,0), (1,1,1), (1,0,1)])
sage: Y.is_smooth()
True

neighborhood(point)#

Return an toric algebraic scheme isomorphic to neighborhood of the point.

INPUT:

• point – a point of the toric algebraic scheme.

OUTPUT:

An affine toric algebraic scheme (polynomial equations in an affine toric variety) with fixed embedding_morphism() and embedding_center().

EXAMPLES:

sage: P.<x,y,z> = toric_varieties.P2()
sage: S = P.subscheme(x + 2*y + 3*z)
sage: s = S.point([0,-3,2]); s
[0 : -3 : 2]
sage: patch = S.neighborhood(s); patch
Closed subscheme of 2-d affine toric variety defined by:
x + 2*y + 6
sage: patch.embedding_morphism()
Scheme morphism:
From: Closed subscheme of 2-d affine toric variety defined by: x + 2*y + 6
To:   Closed subscheme of 2-d CPR-Fano toric variety
covered by 3 affine patches defined by: x + 2*y + 3*z
Defn: Defined on coordinates by sending [x : y] to [-2*y - 6 : y : 2]
sage: patch.embedding_center()
[0 : -3]
sage: patch.embedding_morphism()(patch.embedding_center())
[0 : -3 : 2]


A more complicated example:

sage: dP6.<x0,x1,x2,x3,x4,x5> = toric_varieties.dP6()
sage: twoP1 = dP6.subscheme(x0*x3)
sage: patch = twoP1.neighborhood([0,1,2, 3,4,5]); patch
Closed subscheme of 2-d affine toric variety defined by:
3*x0
sage: patch.embedding_morphism()
Scheme morphism:
From: Closed subscheme of 2-d affine toric variety defined by: 3*x0
To:   Closed subscheme of 2-d CPR-Fano toric variety
covered by 6 affine patches defined by: x0*x3
Defn: Defined on coordinates by sending [x0 : x1] to [0 : x1 : 2 : 3 : 4 : 5]
sage: patch.embedding_center()
[0 : 1]
sage: patch.embedding_morphism()(patch.embedding_center())
[0 : 1 : 2 : 3 : 4 : 5]