# Cycles and divisors

## Algebraic Cycles

`AbsAlgebraicCycle`

— Type`AbsAlgebraicCycle{CoveredSchemeType<:AbsCoveredScheme, CoefficientRingType<:Ring}`

An algebraic cycle $D$ on a (locally) Noetherian integral scheme $X$ with coefficients in a ring $R$ is a formal linear combination $\sum_i a_i D_i$ with $D_i \subseteq X$ integral, closed subschemes and the $a_i \in R$.

Such a cycle is represented non-uniquely as a formal sum $E = \sum_l b_l \mathcal{I}_l$ of equidimensional ideal sheaves $\mathcal{I}_l \subseteq \mathcal{O}_X$. For an equidimensional ideal sheaf $\mathcal{I}$ its interpretation as a cycle is as follows: Let $V(\mathcal{I})=E_{1} \cup \dots \cup E_{n}$ be the decomposition of the vanishing locus of $\mathcal{I}$ into irreducible components $E_i=V(\mathcal{P}_i)$ with $\mathcal{P}_i$ prime. Then $E$ corresponds to the cycle $D = \sum_{i=1}^{n} \mathrm{colength}_{\mathcal{P}_i}(\mathcal{I})E_i$.

**Examples**

```
julia> P2 = projective_space(QQ,2); (s0,s1,s2) = homogeneous_coordinates(P2);
julia> I = ideal_sheaf(P2,ideal([s0,s1^2]))
Sheaf of ideals
on scheme over QQ covered with 3 patches
1: [(s1//s0), (s2//s0)] affine 2-space
2: [(s0//s1), (s2//s1)] affine 2-space
3: [(s0//s2), (s1//s2)] affine 2-space
with restrictions
1: Ideal (1, (s1//s0)^2)
2: Ideal ((s0//s1), 1)
3: Ideal ((s0//s2), (s1//s2)^2)
julia> D = algebraic_cycle(I)
Effective algebraic cycle
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
1 * sheaf of ideals
julia> irreducible_decomposition(D)
Effective algebraic cycle
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
2 * sheaf of prime ideals
```

### Constructors

`algebraic_cycle`

— Method`algebraic_cycle(X::AbsCoveredScheme, R::Ring) -> AlgebraicCycle`

Return the zero `AlgebraicCycle`

over `X`

with coefficients in `R`

.

**Examples**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> I = ideal([x^3-y^2*z]);
julia> Y = proj(P, I);
julia> Ycov = covered_scheme(Y);
julia> R = ZZ;
julia> algebraic_cycle(Ycov, R)
Zero algebraic cycle
on scheme over QQ covered with 3 patches
with coefficients in integer ring
```

`algebraic_cycle`

— Method`algebraic_cycle(I::AbsIdealSheaf, R::Ring) -> AlgebraicCycle`

Return the `AlgebraicCycle`

$D = 1 ⋅ I$ with coefficients in $R$ for a sheaf of equidimensional ideals $I$.

Note that $I$ must be equidimensional.

**Examples**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> I = ideal([x^3-y^2*z]);
julia> Y = proj(P);
julia> II = IdealSheaf(Y, I);
julia> R = ZZ;
julia> algebraic_cycle(II, R)
Effective algebraic cycle
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
1 * sheaf of ideals
```

`algebraic_cycle`

— Method`algebraic_cycle(I::AbsIdealSheaf) -> AlgebraicCycle`

Return the `AlgebraicCycle`

$D = 1 ⋅ I$ with coefficients in $ℤ$ for a sheaf of equidimensional ideals $I$.

**Examples**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> I = ideal([x^3-y^2*z]);
julia> Y = proj(P);
julia> II = IdealSheaf(Y, I);
julia> R = ZZ;
julia> algebraic_cycle(II, R)
Effective algebraic cycle
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
1 * sheaf of ideals
```

### Properties

`ambient_scheme`

— Method`ambient_scheme(D::AbsAlgebraicCycle)`

Return the `CoveredScheme`

$X$ on which `D`

is defined.

`components`

— Method`components(D::AbsAlgebraicCycle)`

Return a list of ideal sheaves such that `D`

is a linear combination of the corresponding cycles.

The order of the components may change in different julia sessions. It is however consistent with the printing.

The ideal sheaves are only guaranteed equidimensional and may carry multiplicities. See `irreducible_decomposition(::AbsAlgebraicCycle)`

for the more conventional decomposition.

`dim`

— Method`dim(D::AbsAlgebraicCycle)`

Return the dimension of the support of the cycle `D`

.

`irreducible_decomposition`

— Method`irreducible_decomposition(D::AbsAlgebraicCycle)`

Return a cycle $E$ equal to $D$ but as a formal sum $E = ∑ₖ aₖ ⋅ Iₖ$ where the `components`

$Iₖ$ of $E$ are all sheaves of prime ideals.

`integral`

— Method`integral(W::AbsAlgebraicCycle)`

Assume $W$ is an algebraic cycle on $X$. This returns the sum of the lengths of all the components of dimension `0`

of $W$.

### Attributes

`is_effective`

— Method`is_effective(A::AbsAlgebraicCycle)`

Return whether all the coefficients are non-negative.

`is_prime`

— Method`is_prime(D::AbsAlgebraicCycle)`

An algebraic cycle is called prime if it consists of a single irreducible subvariety.

Note that this property is not stable under base extension.

### Methods

`<=`

— Method`Base.:<=(A::AbsAlgebraicCycle, B::AbsAlgebraicCycle)`

\[A \leq B\]

if and only if $B - A$ is effective.

## Weil Divisors

`AbsWeilDivisor`

— Type`AbsWeilDivisor{CoveredSchemeType, CoefficientRingType} <: AbsAlgebraicCycle{CoveredSchemeType, CoefficientRingType}`

A Weil divisor with coefficients of type `CoefficientRingType`

on a (locally) Noetherian integral scheme $X$ of type `CoveredSchemeType`

.

**Examples**

```
julia> P2 = projective_space(QQ,2); (s0,s1,s2) = homogeneous_coordinates(P2);
julia> I = ideal((s0*s1)^2);
julia> II = ideal_sheaf(P2, I);
julia> D = weil_divisor(II)
Effective weil divisor
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
1 * sheaf of ideals
julia> E = irreducible_decomposition(D)
Effective weil divisor
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
2 * prime ideal sheaf on scheme over QQ covered with 3 patches extended from ideal ((s1//s0)) on affine 2-space
2 * prime ideal sheaf on scheme over QQ covered with 3 patches extended from ideal ((s0//s1)) on affine 2-space
julia> P = components(E)[1]
Prime ideal sheaf on Scheme over QQ covered with 3 patches extended from Ideal ((s1//s0)) on Affine 2-space
julia> components(D)[1] == II
true
julia> D[II] # to get the coefficient
1
julia> E[P]
2
```

### Constructors

`weil_divisor`

— Method`weil_divisor(X::AbsCoveredScheme, R::Ring) -> WeilDivisor`

Return the zero weil divisor on `X`

with coefficients in the ring `R`

.

**Examples**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> I = ideal([x^3-y^2*z]);
julia> Y = proj(P, I);
julia> Ycov = covered_scheme(Y);
julia> weil_divisor(Ycov, QQ)
Zero weil divisor
on scheme over QQ covered with 3 patches
with coefficients in rational field
```

`weil_divisor`

— Method`weil_divisor(I::AbsIdealSheaf) -> WeilDivisor`

Given an ideal sheaf `I`

of pure codimension $1$, return the weil divisor $D = 1 ⋅ I$ with coefficients in the integer ring.

**Example**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> Y = proj(P);
julia> I = ideal([(x^3-y^2*z)]);
julia> II = IdealSheaf(Y, I);
julia> weil_divisor(II)
Effective weil divisor
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
1 * sheaf of ideals
julia> JJ = II^2;
julia> D = weil_divisor(JJ)
Effective weil divisor
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
1 * product of 2 ideal sheaves
julia> irreducible_decomposition(D)
Effective weil divisor
on scheme over QQ covered with 3 patches
with coefficients in integer ring
given as the formal sum of
2 * sheaf of prime ideals
```

`weil_divisor`

— Method`weil_divisor(I::AbsIdealSheaf, R::Ring; check::Bool=true)`

Given an ideal sheaf `I`

of pure codimension $1$ and a ring `R`

, return the weil divisor $D = 1 ⋅ I$ with coefficients in `R`

.

### Methods

Besides the methods for `AbsAlgebraicCycle`

the following are available.

`is_in_linear_system`

— Method`is_in_linear_system(f::VarietyFunctionFieldElem, D::AbsWeilDivisor; regular_on_complement::Bool=true, check::Bool=true) -> Bool`

Return whether the rational function `f`

is in the linear system $|D|$, i.e. if $(f) + D \geq 0$.

**Input**

`regular_on_complement`

– set to`true`

if`f`

is regular on the complement of the support of`D`

.

`order_of_vanishing`

— Method`order_of_vanishing(f::VarietyFunctionFieldElem, D::AbsWeilDivisor; check::Bool=true)`

Return the order of vanishing of the rational function `f`

on the prime divisor `D`

.

`intersect`

— Method`intersect(D::AbsWeilDivisor, E::AbsWeilDivisor; covering::Covering=default_covering(ambient_scheme(D)))`

Return the intersection number of the the Weil divisors `D`

and `E`

on a complete smooth surface as defined in [Har77].

**Input**

The optional keyword argument `covering`

specifies the covering to be used for the computation.

## Linear Systems

`LinearSystem`

— Type`LinearSystem`

A linear system of a Weil divisor $D$ on a variety $X$, generated by rational functions $f₁,…,fᵣ ∈ K(X)$.

`weil_divisor`

— Method`weil_divisor(L::LinearSystem)`

Return the divisor $D$ of the linear system $L = |D|$.

`variety`

— Method`variety(L::LinearSystem)`

Return the variety on which `L`

is defined.

`subsystem`

— Method`subsystem(L::LinearSystem, D::AbsWeilDivisor) -> LinearSystem, MatElem`

Given a linear system $L = |E|$ and a divisor $D \leq E$ compute $|D|$ and the matrix representing the inclusion $|D| \hookrightarrow |E|$ with respect to the given bases of both systems.

## Cartier Divisors

`CartierDivisor`

— Type`CartierDivisor{CoveredSchemeType<:AbsCoveredScheme, CoeffType<:RingElem}`

A Cartier divisor $C$ on a scheme $X$ with coefficients $a_i$ in a ring $R$ is a formal linear combination $\sum_i a_i D_i$ of effective Cartier divisors $D_i$.

The scheme $X$ is of type `CoveredSchemeType`

. The coefficients $a_i$ are of type `CoeffType`

.

`EffectiveCartierDivisor`

— Type`EffectiveCartierDivisor{CoveredSchemeType<:AbsCoveredScheme}`

An effective Cartier divisor on a scheme $X$ is a closed subscheme $D \subseteq X$ whose ideal sheaf $\mathcal{I}_D \subseteq \mathcal{O}_X$ is an invertible $\mathcal{O}_X$-module. In particular, $\mathcal{I}_D$ is locally principal.

Internally, $C$ stores a `trivializing_covering(C::EffectiveCartierDivisor)`

. The scheme $X$ is of type `CoveredSchemeType`

.

Cartier divisors support elementary arithmetic.

### Constructors

`effective_cartier_divisor`

— Method```
effective_cartier_divisor(I::IdealSheaf;
trivializing_covering::Covering = default_covering(scheme(I)))
-> EffectiveCartierDivisor
```

Return the effective Cartier divisor defined by the ideal sheaf `I`

, given that `I`

is principal in the given covering of the scheme on which it is defined.

**Examples**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> I = ideal([x^3-y^2*z]);
julia> Y = proj(P);
julia> II = IdealSheaf(Y, I);
julia> effective_cartier_divisor(II)
Effective cartier divisor
on scheme over QQ covered with 3 patches
1: [(y//x), (z//x)] affine 2-space
2: [(x//y), (z//y)] affine 2-space
3: [(x//z), (y//z)] affine 2-space
defined by
sheaf of ideals with restrictions
1: Ideal (-(y//x)^2*(z//x) + 1)
2: Ideal ((x//y)^3 - (z//y))
3: Ideal ((x//z)^3 - (y//z)^2)
```

`effective_cartier_divisor`

— Method`effective_cartier_divisor(IP::AbsProjectiveScheme, f::Union{MPolyDecRingElem, MPolyQuoRingElem})`

Return the effective Cartier divisor on the projective scheme $X$ defined by the homogeneous polynomial $f$.

`cartier_divisor`

— Method`cartier_divisor(E::EffectiveCartierDivisor) -> CartierDivisor`

Convert an `EffectiveCartierDivisor`

into a `CartierDivisor`

with coefficient $1$ in the ring of integers.

**Examples**

```
julia> P, (x, y, z) = graded_polynomial_ring(QQ, [:x, :y, :z]);
julia> I = ideal([x^3-y^2*z]);
julia> Y = proj(P);
julia> II = IdealSheaf(Y, I);
julia> E = effective_cartier_divisor(II)
Effective cartier divisor
on scheme over QQ covered with 3 patches
1: [(y//x), (z//x)] affine 2-space
2: [(x//y), (z//y)] affine 2-space
3: [(x//z), (y//z)] affine 2-space
defined by
sheaf of ideals with restrictions
1: Ideal (-(y//x)^2*(z//x) + 1)
2: Ideal ((x//y)^3 - (z//y))
3: Ideal ((x//z)^3 - (y//z)^2)
julia> cartier_divisor(E)
Cartier divisor
on scheme over QQ covered with 3 patches
with coefficients in integer ring
defined by the formal sum of
1 * effective cartier divisor on scheme over QQ covered with 3 patches
```

`cartier_divisor`

— Method`cartier_divisor(IP::AbsProjectiveScheme, f::Union{MPolyDecRingElem, MPolyQuoRingElem})`

Return the (effective) Cartier divisor on the projective scheme $X$ defined by the homogeneous polynomial $f$.

### Attributes

`ideal_sheaf`

— Method`ideal_sheaf(C::EffectiveCartierDivisor)`

Return the sheaf of ideals $\mathcal{I}_C \subseteq \mathcal{O}_X$ representing `C`

.

`ambient_scheme`

— Method`ambient_scheme(C::EffectiveCartierDivisor)`

Return the ambient scheme containing `C`

.

`ambient_scheme`

— Method`ambient_scheme(C::CartierDivisor)`

Return the ambient scheme containing `C`

.

`coefficient_ring`

— Method`coefficient_ring(C::CartierDivisor)`

Return the ring of coefficients of `C`

.

`components`

— Method`components(C::CartierDivisor)`

Return a list of effective Cartier divisors $C_i$ such that $C$ is a linear combination of the $C_i$.

`trivializing_covering`

— Method`trivializing_covering(C::EffectiveCartierDivisor)`

Return the trivializing covering of the effective Cartier divisor `C`

.

A covering $(U_i)_{i \in I}$ is called trivializing for $C$ if $C(U_i)$ is principal for all $i \in I$.