# The Chow ring

Algebraic cycles are formal linear sum of irreducible subvarieies over the integers. Perse, algebraic cycles do not admit a well-defined intersection product.

To see this, think of intersecting a non-trivial algebraic cycle `C`

with itself. Of course, in set theory we can intersect `C`

with itself and the result is again `C`

. However, for a well-defined intersection theory, we would ask that the self-intersection of `C`

is an algebraic cycle of strictly smaller dimension.

In theory, this is resolved by saying that the self-intersection of `C`

is given by intersecting `C`

with a distinct algebraic cycle `D`

which is obtained by moving `C`

a little bit. The general phrase for this is to "move `C`

in general position".

This leads to a famous notion of equivalence among algebraic cycles, the so-called rational equivalence. The set of equivalence classes of algebraic cycles together with the intersection product then furnishes the Chow ring of the variety in question.

For complete and simplicial toric varieties, many things are known about the Chow ring and algebraic cycles (cf. section 12.5 in David A. Cox, John B. Little, Henry K. Schenck (2011):

- By therorem 12.5.3 of David A. Cox, John B. Little, Henry K. Schenck (2011), there is an isomorphism

among the Chow ring and the cohomology ring. Note that the cohomology ring is naturally graded (cf. last paragraph on page 593 in David A. Cox, John B. Little, Henry K. Schenck (2011)). However, the Chow ring is usually considered as a non-graded ring. To match this general convention, and in particular the implementation of the Chow ring for matroids in OSCAR, the toric Chow ring is constructed as a non-graded ring.

- By therorem 12.5.3 of David A. Cox, John B. Little, Henry K. Schenck (2011), the Chow ring is isomorphic

to the quotient of the non-graded Cox ring and a certain ideal. Specifically, the ideal in question is the sum of the ideal of linear relations and the Stanley-Reisner ideal.

- It is worth noting that the ideal of linear relations is not

homogeneous with respect to the class group grading of the Cox ring. In order to construct the cohomology ring, one can introduce a $\mathbb{Z}$-grading on the Cox ring such that the ideal of linear relations and the Stanley-Reißner ideal are homogeneous.

- Finally, by lemma 12.5.1 of David A. Cox, John B. Little, Henry K. Schenck (2011), generators of the

rational equivalence classes of algebraic cycles are one-to-one to the cones in the fan of the toric variety.

## Constructors

### General constructors

`RationalEquivalenceClass`

— Method`RationalEquivalenceClass(v::AbstractNormalToricVariety, coefficients::Vector{T}) where {T <: IntegerUnion}`

Construct the rational equivalence class of algebraic cycles corresponding to a linear combination of cones.

**Examples**

```
julia> P2 = projective_space(NormalToricVariety, 2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(P2, [1, 2, 3])
A torus-invariant, non-prime divisor on a normal toric variety
julia> RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)
```

### Special constructors

`RationalEquivalenceClass`

— Method`RationalEquivalenceClass(d::ToricDivisor)`

Construct the rational equivalence class of algebraic cycles corresponding to the toric divisor `d`

.

**Examples**

```
julia> P2 = projective_space(NormalToricVariety, 2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(P2, [1, 2, 3])
A torus-invariant, non-prime divisor on a normal toric variety
julia> RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)
```

`RationalEquivalenceClass`

— Method`RationalEquivalenceClass(c::ToricDivisorClass)`

Construct the algebraic cycle corresponding to the toric divisor class `c`

.

**Examples**

```
julia> P2 = projective_space(NormalToricVariety, 2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> tdc = ToricDivisorClass(P2, [2])
A divisor class on a normal toric variety
julia> RationalEquivalenceClass(tdc)
A rational equivalence class on a normal toric variety represented by 2V(x3)
```

`RationalEquivalenceClass`

— Method`RationalEquivalenceClass(l::ToricLineBundle)`

Construct the toric algebraic cycle corresponding to the toric line bundle `l`

.

**Examples**

```
julia> P2 = projective_space(NormalToricVariety, 2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> l = ToricLineBundle(P2, [2])
A toric line bundle on a normal toric variety
julia> polynomial(RationalEquivalenceClass(l))
2*x3
```

`RationalEquivalenceClass`

— Method`RationalEquivalenceClass(cc::CohomologyClass)`

Construct the toric algebraic cycle corresponding to the cohomology class `cc`

.

**Examples**

```
julia> P2 = projective_space(NormalToricVariety, 2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> (x1, x2, x3) = gens(cohomology_ring(P2))
3-element Vector{MPolyQuoElem{MPolyElem_dec{fmpq, fmpq_mpoly}}}:
x1
x2
x3
julia> cc = CohomologyClass(P2, x1+x2)
A cohomology class on a normal toric variety given by x1 + x2
julia> RationalEquivalenceClass(cc)
A rational equivalence class on a normal toric variety represented by 2V(x3)
```

`RationalEquivalenceClass`

— Method`RationalEquivalenceClass(cc::ClosedSubvarietyOfToricVariety)`

Construct the rational equivalence class of algebraic cycles of a closed subvariety of a normal toric variety.

**Examples**

```
julia> ntv = NormalToricVariety(Oscar.normal_fan(Oscar.cube(2)))
A normal toric variety
julia> set_coordinate_names(ntv, ["x1", "x2", "y1", "y2"]);
julia> (x1, x2, y1, y2) = gens(cox_ring(ntv))
4-element Vector{MPolyElem_dec{fmpq, fmpq_mpoly}}:
x1
x2
y1
y2
julia> sv = ClosedSubvarietyOfToricVariety(ntv, [x1^2+x1*x2+x2^2, y2])
A closed subvariety of a normal toric variety
julia> RationalEquivalenceClass(sv)
A rational equivalence class on a normal toric variety represented by 2V(x2,y2)
```

### Addition, subtraction and scalar multiplication

Algebraic cycles can be added and subtracted via the usual `+`

and `-`

operators. Moreover, multiplication by scalars from the left is supported for scalars which are integers or of type `fmpz`

.

Note that one can easily define the Chow ring also a formal linear sums of irreducible subvarieties with coefficients being rational numbers. We support this more general ring and therefore also allow for left multiplication with scalars of type `fmpq`

.

### Intersection product

The intersection product of algebraic cycles is implemented via `*`

. This makes sense, since algebraic cycles on toric varieties are elements of the Chow ring, which in turn is (a certain) quotient of the Cox ring. Hence, internally, an algebraic cycle can be thought of as a polynomial in this ring and the intersection product corresponds to the product of two (equivalence classes of) polynomials.

An algebraic cycle can be intersected `n`

- with itself via `^n`

, where `n`

can be an integer of of type `fmpz`

.

A closed subvarieties defines in a natural way a rational equivalence class (cf. section on special constructors above). This allows to compute intersection products among closed subvarieties and rational equivalence classes in the Chow ring.

## Attributes

### Defining attributes

`toric_variety`

— Method`toric_variety(ac::RationalEquivalenceClass)`

Return the normal toric variety of a rational equivalence class of algebraic cycles.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> toric_variety(ac)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
```

`polynomial`

— Method`polynomial(ac::RationalEquivalenceClass)`

On a simplicial and complete toric variety, the Chow ring is isomorphic to a certain quotient of the Cox ring. This function returns the ring element corresponding to a given rational equivalence class of algebraic cycles.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> polynomial(ac)
6*x3 + e1 + 7*e2
```

`polynomial`

— Method`polynomial(ring::MPolyQuo, ac::RationalEquivalenceClass)`

On a simplicial and complete toric variety, the Chow ring is isomorphic to a certain quotient of the Cox ring. This function returns the ring element corresponding to a given rational equivalence class of algebraic cycles. The first argument of this function allows to obtain this ring element in a different ring. This allows to change the coefficient ring if desired.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> R, _ = PolynomialRing(QQ, 5)
(Multivariate Polynomial Ring in x1, x2, x3, x4, x5 over Rational Field, fmpq_mpoly[x1, x2, x3, x4, x5])
julia> (x1, x2, x3, x4, x5) = gens(R)
5-element Vector{fmpq_mpoly}:
x1
x2
x3
x4
x5
julia> sr_and_linear_relation_ideal = ideal([x1*x3, x1*x5, x2*x4, x2*x5, x3*x4, x1 + x2 - x5, x2 + x3 - x4 - x5])
ideal(x1*x3, x1*x5, x2*x4, x2*x5, x3*x4, x1 + x2 - x5, x2 + x3 - x4 - x5)
julia> R_quo = quo(R, sr_and_linear_relation_ideal)[1]
Quotient of Multivariate Polynomial Ring in x1, x2, x3, x4, x5 over Rational Field by ideal(x1*x3, x1*x5, x2*x4, x2*x5, x3*x4, x1 + x2 - x5, x2 + x3 - x4 - x5)
julia> polynomial(R_quo, ac)
6*x3 + x4 + 7*x5
```

### Representatives

In order to see a geometric interpretation of rational equivalence classes of algebraic cycles most efficiently, it is best to replace self-intersections by transverse complete intersections. Indeed, within the regime of simplicial, complete toric varieties this is always possible. However, this involves a choice. Consequently, the following methods will pick a special choice and return values for that particular choice of representative of the rational equivalence class in question.

`representative`

— Method`representative(ac::RationalEquivalenceClass)`

Return a polynomial in the Cox ring mapping to `polynomial(ac)`

.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> ac*ac
A rational equivalence class on a normal toric variety represented by 34V(x2,x3)
julia> representative(ac*ac)
34*x2*x3
```

It can be rather convenient to investigate such a representative in order to understand the geometric meaning of a rational equivalence class. For this purpose, we support the following methods.

`coefficients`

— Method`coefficients(ac::RationalEquivalenceClass)`

Return the coefficients of `polynomial(ac)`

.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> coefficients(ac*ac)
1-element Vector{fmpq}:
-34
```

`components`

— Method`components(ac::RationalEquivalenceClass)`

Turn each monomial of `representative(ac)`

into a closed subvariety and return the list formed from these subvarieties. Note that each of these subvarieties is irreducible and their formal linear sum, with the coefficients computed by the method `coefficients(ac::RationalEquivalenceClass)`

, defines an algebraic cycle, whose rational equivalence class is identical to the one given to this method.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> length(components(ac*ac))
1
```

### Other attributes

`cohomology_class`

— Method`cohomology_class(ac::RationalEquivalenceClass)`

Returns the cohomology class of a rational equilvalence class of algebraic cycles.

**Examples**

```
julia> dP2 = del_pezzo_surface(2)
A normal, non-affine, smooth, projective, gorenstein, fano, 2-dimensional toric variety without torusfactor
julia> d = ToricDivisor(dP2, [1, 2, 3, 4, 5])
A torus-invariant, non-prime divisor on a normal toric variety
julia> ac = RationalEquivalenceClass(d)
A rational equivalence class on a normal toric variety represented by 6V(x3)+V(e1)+7V(e2)
julia> cohomology_class(ac)
A cohomology class on a normal toric variety given by 6*x3 + e1 + 7*e2
```

## Properties

One can check if a rational equivalence class of algebraic cycles is trivial via `is_trivial`

. Equality can be tested with `==`

.

## Special attributes of toric varieties

`chow_ring`

— Method`chow_ring(v::AbstractNormalToricVariety)`

Return the Chow ring of the simplicial toric variety `v`

.

While David A. Cox, John B. Little, Henry K. Schenck (2011) focus on simplicial and complete varieties to define the Chow ring, it was described in Christoph Pegel (2014) that this notion can also be extended to non-complete varieties. We explicitly support the Chow ring also for non-complete varieties.

This is demonstrated by the following example. Note that the computation for the non-complete variety leads to a Chow ring which is identical to the Chow ring of a certain matroid. This observation can be anticipated by e.g. the results in Eva Maria Feichtner, Sergey Yuzvinsky (2004).

**Examples**

```
julia> p2 = projective_space(NormalToricVariety, 2);
julia> is_complete(p2)
true
julia> ngens(chow_ring(p2))
3
julia> v = NormalToricVariety([[1, 0], [0, 1], [-1, -1]], [[1], [2], [3]])
A normal toric variety
julia> is_complete(v)
false
julia> set_coordinate_names(v, ["x_{1}", "x_{2}", "x_{3}"])
julia> chow_ring(v)
Quotient of Multivariate Polynomial Ring in x_{1}, x_{2}, x_{3} over Rational Field by ideal(x_{1} - x_{3}, x_{2} - x_{3}, x_{1}*x_{2}, x_{1}*x_{3}, x_{2}*x_{3})
julia> M = cycle_matroid(Graphs.complete_graph(3))
Matroid of rank 2 on 3 elements
julia> chow_ring(M)
Quotient of Multivariate Polynomial Ring in x_{1}, x_{2}, x_{3} over Rational Field by ideal(x_{1} - x_{2}, x_{1} - x_{3}, x_{1}*x_{2}, x_{1}*x_{3}, x_{2}*x_{3})
```

`gens_of_rational_equivalence_classes`

— Method`gens_of_rational_equivalence_classes(v::AbstractNormalToricVariety)`

Returns a list of generators of the Chow ring of a complete, simplicial toric variety.

Recall that the cones of a complete, simplicial toric variety can be seen as generators of the Chow ring (lemma 12.5.1 in David A. Cox, John B. Little, Henry K. Schenck (2011)). This function first maps each cone to an element of the Chow ring and then removes elements by taking rational equivalence into account.

**Examples**

```
julia> p2 = projective_space(NormalToricVariety, 2);
julia> length(gens_of_rational_equivalence_classes(p2))
6
```

`map_gens_of_chow_ring_to_cox_ring`

— Method`map_gens_of_chow_ring_to_cox_ring(v::AbstractNormalToricVariety)`

Returns a dictionary which maps the generators of the chow ring to monomials in the Cox ring. This dictionary involves a choice, i.e. is not unique.

**Examples**

```
julia> p2 = projective_space(NormalToricVariety, 2);
julia> length(map_gens_of_chow_ring_to_cox_ring(p2))
4
```