# Enumerate points of a toric variety#

The classes here are not meant to be instantiated manually. Instead, you should always use the methods of the point set of the variety.

In this module, points are always represented by tuples instead of Sage’s class for points of the toric variety. All Sage library code must then convert it to proper point objects before returning it to the user.

EXAMPLES:

sage: P2 = toric_varieties.P2(base_ring=GF(3))                                      # optional - sage.rings.finite_rings
sage: point_set = P2.point_set()                                                    # optional - sage.rings.finite_rings
sage: point_set.cardinality()                                                       # optional - sage.rings.finite_rings
13
sage: next(iter(point_set))                                                         # optional - sage.rings.finite_rings
[0 : 0 : 1]
sage: list(point_set)[0:5]                                                          # optional - sage.rings.finite_rings
[[0 : 0 : 1], [1 : 0 : 0], [0 : 1 : 0], [0 : 1 : 1], [0 : 1 : 2]]

class sage.schemes.toric.points.FiniteFieldPointEnumerator(fan, ring)#
cardinality()#

Return the cardinality of the point set.

OUTPUT: An integer. The number of points.

EXAMPLES:

sage: fan = NormalFan(ReflexivePolytope(2, 0))
sage: X = ToricVariety(fan, base_ring=GF(7))                                # optional - sage.rings.finite_rings
sage: point_set = X.point_set()                                             # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: ffe.cardinality()                                                     # optional - sage.rings.finite_rings
21

cone_points_iter()#

Iterate over the open torus orbits and yield distinct points.

OUTPUT:

For each open torus orbit (cone): A triple consisting of the cone, the nonzero homogeneous coordinates in that orbit (list of integers), and the nonzero log coordinates of distinct points as a cokernel.

EXAMPLES:

sage: fan = NormalFan(ReflexivePolytope(2, 0))
sage: X = ToricVariety(fan, base_ring=GF(7))                                # optional - sage.rings.finite_rings
sage: point_set = X.point_set()                                             # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: cpi = ffe.cone_points_iter()                                          # optional - sage.rings.finite_rings
sage: cone, nonzero_points, cokernel = list(cpi)[5]                         # optional - sage.rings.finite_rings
sage: cone                                                                  # optional - sage.rings.finite_rings
1-d cone of Rational polyhedral fan in 2-d lattice N
sage: cone.ambient_ray_indices()                                            # optional - sage.rings.finite_rings
(2,)
sage: nonzero_points                                                        # optional - sage.rings.finite_rings
[0, 1]
sage: cokernel                                                              # optional - sage.rings.finite_rings
Finitely generated module V/W over Integer Ring with invariants (2)
sage: list(cokernel)                                                        # optional - sage.rings.finite_rings
[(0), (1)]
sage: [p.lift() for p in cokernel]                                          # optional - sage.rings.finite_rings
[(0, 0), (0, 1)]

exp(powers)#

Return the component-wise exp of z

INPUT:

• powers – a list/tuple/iterable of integers.

OUTPUT:

Tuple of finite field elements. The powers of the multiplicative_generator().

EXAMPLES:

sage: F.<a> = GF(5^2)                                                       # optional - sage.rings.finite_rings
sage: point_set = toric_varieties.P2_123(base_ring=F).point_set()           # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: powers = list(range(24))                                              # optional - sage.rings.finite_rings
sage: ffe.exp(powers)                                                       # optional - sage.rings.finite_rings
(1, a, a + 3, 4*a + 3, 2*a + 2, 4*a + 1, 2, 2*a, 2*a + 1, 3*a + 1,
4*a + 4, 3*a + 2, 4, 4*a, 4*a + 2, a + 2, 3*a + 3, a + 4, 3, 3*a,
3*a + 4, 2*a + 4, a + 1, 2*a + 3)
sage: ffe.log(ffe.exp(powers)) == tuple(powers)                             # optional - sage.rings.finite_rings
True

log(z)#

Return the component-wise log of z

INPUT:

• z – a list/tuple/iterable of non-zero finite field elements.

OUTPUT:

Tuple of integers. The logarithm with base the multiplicative_generator().

EXAMPLES:

sage: F.<a> = GF(5^2)                                                       # optional - sage.rings.finite_rings
sage: point_set = toric_varieties.P2_123(base_ring=F).point_set()           # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: z = tuple(a^i for i in range(25));  z                                 # optional - sage.rings.finite_rings
(1, a, a + 3, 4*a + 3, 2*a + 2, 4*a + 1, 2, 2*a, 2*a + 1, 3*a + 1,
4*a + 4, 3*a + 2, 4, 4*a, 4*a + 2, a + 2, 3*a + 3, a + 4, 3, 3*a,
3*a + 4, 2*a + 4, a + 1, 2*a + 3, 1)
sage: ffe.log(z)                                                            # optional - sage.rings.finite_rings
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 0)
sage: ffe.exp(ffe.log(z)) == z                                              # optional - sage.rings.finite_rings
True
sage: ffe.log(ffe.exp(range(24))) == tuple(range(24))                       # optional - sage.rings.finite_rings
True

multiplicative_generator()#

Return the multiplicative generator of the finite field.

OUTPUT: A finite field element.

EXAMPLES:

sage: point_set = toric_varieties.P2(base_ring=GF(5^2, 'a')).point_set()    # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: ffe.multiplicative_generator()                                        # optional - sage.rings.finite_rings
a

multiplicative_group_order()#

EXAMPLES:

sage: class Foo:
....:     def __init__(self, x):
....:         self._x = x
....:     @cached_method
....:     def f(self):
....:         return self._x^2
sage: a = Foo(2)
sage: print(a.f.cache)
None
sage: a.f()
4
sage: a.f.cache
4

rescaling_log_generators()#

Return the log generators of rescalings().

OUTPUT:

A tuple containing the logarithms (see log()) of the generators of the multiplicative group of rescalings().

EXAMPLES:

sage: point_set = toric_varieties.P2_123(base_ring=GF(5)).point_set()       # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: ffe.rescalings()                                                      # optional - sage.rings.finite_rings
((1, 1, 1), (1, 4, 4), (4, 2, 3), (4, 3, 2))
sage: list(map(ffe.log, ffe.rescalings()))                                  # optional - sage.rings.finite_rings
[(0, 0, 0), (0, 2, 2), (2, 1, 3), (2, 3, 1)]
sage: ffe.rescaling_log_generators()                                        # optional - sage.rings.finite_rings
((2, 3, 1),)

root_generator(n)#

Return a generator for roots().

INPUT:

• n integer.

OUTPUT: A multiplicative generator for roots().

EXAMPLES:

sage: point_set = toric_varieties.P2(base_ring=GF(5)).point_set()           # optional - sage.rings.finite_rings
sage: ffe = point_set._finite_field_enumerator()                            # optional - sage.rings.finite_rings
sage: ffe.root_generator(2)                                                 # optional - sage.rings.finite_rings
4
sage: ffe.root_generator(3)                                                 # optional - sage.rings.finite_rings
1
sage: ffe.root_generator(4)                                                 # optional - sage.rings.finite_rings
2

class sage.schemes.toric.points.FiniteFieldSubschemePointEnumerator(polynomials, ambient)#
cardinality()#

Return the cardinality of the point set.

OUTPUT: An integer. The number of points.

EXAMPLES:

sage: fan = NormalFan(ReflexivePolytope(2, 0))
sage: X.<u,v,w> = ToricVariety(fan, base_ring=GF(7))                        # optional - sage.rings.finite_rings
sage: Y = X.subscheme(u^3 + v^3 + w^3 + u*v*w)                              # optional - sage.rings.finite_rings
sage: point_set = Y.point_set()                                             # optional - sage.rings.finite_rings
sage: list(point_set)                                                       # optional - sage.rings.finite_rings
[[0 : 1 : 3],
[1 : 0 : 3],
[1 : 3 : 0],
[1 : 1 : 6],
[1 : 1 : 4],
[1 : 3 : 2],
[1 : 3 : 5]]
sage: ffe = point_set._enumerator()                                         # optional - sage.rings.finite_rings
sage: ffe.cardinality()                                                     # optional - sage.rings.finite_rings
7

homogeneous_coordinates(log_t, nonzero_coordinates, cokernel)#

Convert the log of inhomogeneous coordinates back to homogeneous coordinates

INPUT:

• log_t – log of inhomogeneous coordinates of a point.

• nonzero_coordinates – the nonzero homogeneous coordinates in the patch.

• cokernel – the logs of the nonzero coordinates of all distinct points as a cokernel. See FiniteFieldPointEnumerator.cone_points_iter().

OUTPUT:

The same point, but as a tuple of homogeneous coordinates.

EXAMPLES:

sage: P2.<x,y,z> = toric_varieties.P2(base_ring=GF(7))                                  # optional - sage.rings.finite_rings
sage: X = P2.subscheme([x^3 + 2*y^3 + 3*z^3, x*y*z + x*y^2])                            # optional - sage.rings.finite_rings
sage: point_set = X.point_set()                                                         # optional - sage.rings.finite_rings
sage: ffe = point_set._enumerator()                                                     # optional - sage.rings.finite_rings
sage: cone, nonzero_coordinates, cokernel = list(ffe.ambient.cone_points_iter())[5]     # optional - sage.rings.finite_rings
sage: cone.ambient_ray_indices(), nonzero_coordinates                                   # optional - sage.rings.finite_rings
((2,), [0, 1])
sage: ffe.homogeneous_coordinates([0], nonzero_coordinates, cokernel)                   # optional - sage.rings.finite_rings
(1, 1, 0)
sage: ffe.homogeneous_coordinates([1], nonzero_coordinates, cokernel)                   # optional - sage.rings.finite_rings
(1, 3, 0)
sage: ffe.homogeneous_coordinates([2], nonzero_coordinates, cokernel)                   # optional - sage.rings.finite_rings
(1, 2, 0)

inhomogeneous_equations(ring, nonzero_coordinates, cokernel)#

Inhomogenize the defining polynomials

INPUT:

• ring – the polynomial ring for inhomogeneous coordinates.

• nonzero_coordinates – list of integers. The indices of the non-zero homogeneous coordinates in the patch.

• cokernel – the logs of the nonzero coordinates of all distinct points as a cokernel. See FiniteFieldPointEnumerator.cone_points_iter().

EXAMPLES:

sage: R.<s> = QQ[]
sage: P2.<x,y,z> = toric_varieties.P2(base_ring=GF(7))                                  # optional - sage.rings.finite_rings
sage: X = P2.subscheme([x^3 + 2*y^3 + 3*z^3, x*y*z + x*y^2])                            # optional - sage.rings.finite_rings
sage: point_set = X.point_set()                                                         # optional - sage.rings.finite_rings
sage: ffe = point_set._enumerator()                                                     # optional - sage.rings.finite_rings
sage: cone, nonzero_coordinates, cokernel = list(ffe.ambient.cone_points_iter())[5]     # optional - sage.rings.finite_rings
sage: cone.ambient_ray_indices(), nonzero_coordinates                                   # optional - sage.rings.finite_rings
((2,), [0, 1])
sage: ffe.inhomogeneous_equations(R, nonzero_coordinates, cokernel)                     # optional - sage.rings.finite_rings
[2*s^3 + 1, s^2]

solutions(inhomogeneous_equations, log_range)#

Parallel version of solutions_serial()

INPUT/OUTPUT:

Same as solutions_serial(), except that the output points are in random order. Order depends on the number of processors and relative speed of separate processes.

EXAMPLES:

sage: R.<s> = GF(7)[]                                                       # optional - sage.rings.finite_rings
sage: P2.<x,y,z> = toric_varieties.P2(base_ring=GF(7))                      # optional - sage.rings.finite_rings
sage: X = P2.subscheme(1)                                                   # optional - sage.rings.finite_rings
sage: point_set = X.point_set()                                             # optional - sage.rings.finite_rings
sage: ffe = point_set._enumerator()                                         # optional - sage.rings.finite_rings
sage: ffe.solutions([s^2 - 1, s^6 - s^2], [range(6)])                       # optional - sage.rings.finite_rings
<generator object ...solutions at 0x...>
sage: sorted(_)                                                             # optional - sage.rings.finite_rings
[(0,), (3,)]

solutions_serial(inhomogeneous_equations, log_range)#

Iterate over solutions in a range.

INPUT:

• inhomogeneous_equations – list/tuple/iterable of inhomogeneous equations (i.e. output from inhomogeneous_equations()).

• log_range – list/tuple/iterable of integer ranges. One for each inhomogeneous coordinate. The logarithms of the homogeneous coordinates.

OUTPUT:

All solutions (as tuple of log inhomogeneous coordinates) in the Cartesian product of the ranges.

EXAMPLES:

sage: R.<s> = GF(7)[]                                                       # optional - sage.rings.finite_rings
sage: P2.<x,y,z> = toric_varieties.P2(base_ring=GF(7))                      # optional - sage.rings.finite_rings
sage: X = P2.subscheme(1)                                                   # optional - sage.rings.finite_rings
sage: point_set = X.point_set()                                             # optional - sage.rings.finite_rings
sage: ffe = point_set._enumerator()                                         # optional - sage.rings.finite_rings
sage: ffe.solutions_serial([s^2 - 1, s^6 - s^2], [range(6)])                # optional - sage.rings.finite_rings
<generator object ...solutions_serial at 0x...>
sage: list(_)                                                               # optional - sage.rings.finite_rings
[(0,), (3,)]

class sage.schemes.toric.points.InfinitePointEnumerator(fan, ring)#

Bases: object

Point enumerator for infinite fields.

INPUT:

• fan – fan of the toric variety.

• ring – infinite base ring over which to enumerate points.

class sage.schemes.toric.points.NaiveFinitePointEnumerator(fan, ring)#

Bases: object

The naive point enumerator.

This is very slow.

INPUT:

• fan – fan of the toric variety.

• ring – finite base ring over which to enumerate points.

EXAMPLES:

sage: from sage.schemes.toric.points import NaiveFinitePointEnumerator
sage: fan = toric_varieties.P2().fan()
sage: n = NaiveFinitePointEnumerator(fan, GF(3))                            # optional - sage.rings.finite_rings
sage: next(iter(n))                                                         # optional - sage.rings.finite_rings
(0, 0, 1)

cone_iter()#

Iterate over all cones of the fan

OUTPUT:

Iterator over the cones, starting with the high-dimensional ones.

EXAMPLES:

sage: dP6 = toric_varieties.dP6(base_ring=GF(11))                           # optional - sage.rings.finite_rings
sage: ne = dP6.point_set()._naive_enumerator()                              # optional - sage.rings.finite_rings
sage: for cone in ne.cone_iter():                                           # optional - sage.rings.finite_rings
....:     print(cone.ambient_ray_indices())
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(0, 5)
(0,)
(1,)
(2,)
(3,)
(4,)
(5,)
()

coordinate_iter()#

Iterate over all distinct homogeneous coordinates.

This method does NOT identify homogeneous coordinates that are equivalent by a homogeneous rescaling.

OUTPUT: An iterator over the points.

EXAMPLES:

sage: P2 = toric_varieties.P2(base_ring=GF(2))                              # optional - sage.rings.finite_rings
sage: ni = P2.point_set()._naive_enumerator()                               # optional - sage.rings.finite_rings
sage: list(ni.coordinate_iter())                                            # optional - sage.rings.finite_rings
[(0, 0, 1), (1, 0, 0), (0, 1, 0), (0, 1, 1),
(1, 0, 1), (1, 1, 0), (1, 1, 1)]

sage: P1xP1 = toric_varieties.P1xP1(base_ring=GF(2))                        # optional - sage.rings.finite_rings
sage: ni = P1xP1.point_set()._naive_enumerator()                            # optional - sage.rings.finite_rings
sage: list(ni.coordinate_iter())                                            # optional - sage.rings.finite_rings
[(0, 1, 0, 1), (1, 0, 0, 1), (1, 0, 1, 0),
(0, 1, 1, 0), (0, 1, 1, 1), (1, 0, 1, 1),
(1, 1, 0, 1), (1, 1, 1, 0), (1, 1, 1, 1)]

orbit(point)#

Return the orbit of homogeneous coordinates under rescalings.

OUTPUT:

The set of all homogeneous coordinates that are equivalent to point.

EXAMPLES:

sage: P2_123 = toric_varieties.P2_123(base_ring=GF(7))                      # optional - sage.rings.finite_rings
sage: ne = P2_123.point_set()._naive_enumerator()                           # optional - sage.rings.finite_rings
sage: sorted(ne.orbit([1, 0, 0]))                                           # optional - sage.rings.finite_rings
[(1, 0, 0), (2, 0, 0), (4, 0, 0)]
sage: sorted(ne.orbit([0, 1, 0]))                                           # optional - sage.rings.finite_rings
[(0, 1, 0), (0, 6, 0)]
sage: sorted(ne.orbit([0, 0, 1]))                                           # optional - sage.rings.finite_rings
[(0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 0, 5), (0, 0, 6)]
sage: sorted(ne.orbit([1, 1, 0]))                                           # optional - sage.rings.finite_rings
[(1, 1, 0), (1, 6, 0), (2, 1, 0), (2, 6, 0), (4, 1, 0), (4, 6, 0)]

rays()#

Return all rays (real and virtual).

OUTPUT: Tuple of rays of the fan.

EXAMPLES:

sage: from sage.schemes.toric.points import NaiveFinitePointEnumerator
sage: fan = toric_varieties.torus(2).fan()
sage: fan.rays()
Empty collection
in 2-d lattice N
sage: n = NaiveFinitePointEnumerator(fan, GF(3))                            # optional - sage.rings.finite_rings
sage: n.rays()                                                              # optional - sage.rings.finite_rings
N(1, 0),
N(0, 1)
in 2-d lattice N

rescalings()#

Return the rescalings of homogeneous coordinates.

OUTPUT:

A tuple containing all points that are equivalent to $$[1:1:\dots:1]$$, the distinguished point of the big torus orbit.

EXAMPLES:

sage: P2_123 = toric_varieties.P2_123(base_ring=GF(5))                      # optional - sage.rings.finite_rings
sage: ni = P2_123.point_set()._naive_enumerator()                           # optional - sage.rings.finite_rings
sage: ni.rescalings()                                                       # optional - sage.rings.finite_rings
((1, 1, 1), (1, 4, 4), (4, 2, 3), (4, 3, 2))

sage: dP8 = toric_varieties.dP8(base_ring=GF(3))                            # optional - sage.rings.finite_rings
sage: ni = dP8.point_set()._naive_enumerator()                              # optional - sage.rings.finite_rings
sage: ni.rescalings()                                                       # optional - sage.rings.finite_rings
((1, 1, 1, 1), (1, 2, 2, 2), (2, 1, 2, 1), (2, 2, 1, 2))

sage: P1xP1 = toric_varieties.P1xP1(base_ring=GF(3))                        # optional - sage.rings.finite_rings
sage: ni = P1xP1.point_set()._naive_enumerator()                            # optional - sage.rings.finite_rings
sage: ni.rescalings()                                                       # optional - sage.rings.finite_rings
((1, 1, 1, 1), (1, 1, 2, 2), (2, 2, 1, 1), (2, 2, 2, 2))

roots(n)#

Return the n-th roots in the base field

INPUT:

• n integer.

OUTPUT:

Tuple containing all n-th roots (not only the primitive ones). In particular, 1 is included.

EXAMPLES:

sage: P2 = toric_varieties.P2(base_ring=GF(5))                              # optional - sage.rings.finite_rings
sage: ne = P2.point_set()._naive_enumerator()                               # optional - sage.rings.finite_rings
sage: ne.roots(2)                                                           # optional - sage.rings.finite_rings
(1, 4)
sage: ne.roots(3)                                                           # optional - sage.rings.finite_rings
(1,)
sage: ne.roots(4)                                                           # optional - sage.rings.finite_rings
(1, 2, 3, 4)

units()#

Return the units in the base field.

EXAMPLES:

sage: P2 = toric_varieties.P2(base_ring=GF(5))                              # optional - sage.rings.finite_rings
sage: ne = P2.point_set()._naive_enumerator()                               # optional - sage.rings.finite_rings
sage: ne.units()                                                            # optional - sage.rings.finite_rings
(1, 2, 3, 4)

class sage.schemes.toric.points.NaiveSubschemePointEnumerator(polynomials, ambient)#

Bases: object

Point enumerator for algebraic subschemes of toric varieties.

INPUT:

• polynomials – list/tuple/iterable of polynomials. The defining polynomials.

• ambient – enumerator for ambient space points.