Toric Blowups (Experimental)

It is a common goal in algebraic geometry to resolve singularities. Certainly, toric varieties and their subvarieties are no exception and we provide a growing set of functionality for such tasks.

We focus mainly on toric blowups given by a star subdivision of a polyhedral fan along a primitive vector, see 11.1 Star Subdivisions in [CLS11]. Below, we refer to this primitive vector as exceptional_ray. The main constructor is the following

  • blow_up(Y::NormalToricVariety, exceptional_ray::AbstractVector{<:IntegerUnion}; coordinate_name::String)

This will also construct the underlying toric morphism. We can specify the name for the coordinate in the Cox ring that is assigned to exceptional_ray using the optional argument coordinate_name.

Given a homogeneous ideal $I$ in the Cox ring of $X$, it is also possible to reroute to covered schemes and construct the blowup by blow_up(ideal_sheaf(X, I)). Strict transforms (and similarly total transforms) of ideal sheaves $J$ can be computed by strict_transform(phi, J). Ideal sheaves on toric varieties are currently (30 Jan 2025) considered experimental.

Constructors

The following methods blow up toric varieties. The closed subscheme along which the blowup is constructed can be provided in different formats. We discuss the methods in ascending generality.

For our most specialized blowup method, we focus on the n-th cone in the fan of the variety v in question. This cone need not be a maximal cone and cannot be the zero-dimensional cone. The ensuing star subdivision will subdivide this cone about its barycenter (the primitive generator of the sum of all its rays). The result of this will always be a toric variety:

blow_upMethod
blow_up(v::NormalToricVariety, n::Int; coordinate_name::String = "e")

Blow up the toric variety $v$ with polyhedral fan $\Sigma$ by star subdivision along the barycenter of the $n$-th cone $\sigma$ in the list of all the cones of $\Sigma$. We remind that the barycenter of a nonzero cone is the primitive generator of the sum of the primitive generators of the extremal rays of the cone (Exercise 11.1.10 in [CLS11]). In the case all the cones of $\Sigma$ containing $\sigma$ are smooth, this coincides with the star subdivision of $\Sigma$ relative to $\sigma$ (Definition 3.3.17 of [CLS11]). This function returns the corresponding morphism.

By default, we pick "e" as the name of the homogeneous coordinate for the exceptional prime divisor. As third optional argument one can supply a custom variable name.

Examples

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, 5)
Toric blowup morphism

julia> bP3 = domain(f)
Normal toric variety

julia> cox_ring(bP3)
Multivariate polynomial ring in 5 variables over QQ graded by
  x1 -> [1 0]
  x2 -> [0 1]
  x3 -> [0 1]
  x4 -> [1 0]
  e -> [1 -1]
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

More generally, we can provide a primitive element in the fan of the variety in question and construct a toric morphism as in Section 11.1 Star Subdivisions in [CLS11]. The resulting star subdivision leads to a polyhedral fan, or put differently, the blowup is always toric:

blow_upMethod
blow_up(v::NormalToricVariety, exceptional_ray::AbstractVector{<:IntegerUnion}; coordinate_name::String)

Blow up the toric variety by subdividing the fan of the variety with the provided exceptional ray. This function returns the corresponding morphism.

Note that this ray must be a primitive element in the lattice Z^d, with d the dimension of the fan. In particular, it is currently impossible to blow up along a ray which corresponds to a non-Q-Cartier divisor.

By default, we pick "e" as the name of the homogeneous coordinate for the exceptional prime divisor. As optional argument one can supply a custom variable name.

Warning

This function is type unstable. The type of the field center_unnormalized is always a subtype of AbsIdealSheaf (meaning that center_unnormalized(f) isa Oscar.AbsIdealSheaf is always true). Sometimes, the function computes and sets the field center_unnormalized for the output f, giving it the type ToricIdealSheafFromCoxRingIdeal (meaning that center_unnormalized(f) isa Oscar.ToricIdealSheafFromCoxRingIdeal is true and center_unnormalized(f) isa IdealSheaf is false). If it does not, then calling center_unnormalized(f) computes and sets the field center_unnormalized and it will have the type IdealSheaf (meaning that center_unnormalized(f) isa Oscar.ToricIdealSheafFromCoxRingIdeal is false and center_unnormalized(f) isa IdealSheaf is true).

Examples

In the example below center_unnormalized(f) has type ToricIdealSheafFromCoxRingIdeal and we can access the corresponding ideal in the Cox ring using Oscar.ideal_in_cox_ring.

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, [0, 2, 3])
Toric blowup morphism

julia> bP3 = domain(f)
Normal toric variety

julia> cox_ring(bP3)
Multivariate polynomial ring in 5 variables over QQ graded by
  x1 -> [1 0]
  x2 -> [1 2]
  x3 -> [1 3]
  x4 -> [1 0]
  e -> [0 -1]

julia> typeof(center_unnormalized(f))
Oscar.ToricIdealSheafFromCoxRingIdeal{NormalToricVariety, AbsAffineScheme, Ideal, Map}

julia> Oscar.ideal_in_cox_ring(center_unnormalized(f))
Ideal generated by
  x2^2
  x3^3

In the below example, center_unnormalized(f) has type IdealSheaf and we cannot access the corresponding ideal in the Cox ring.

Examples

julia> rs = [1 1; -1 1]
2×2 Matrix{Int64}:
  1  1
 -1  1

julia> max_cones = incidence_matrix([[1, 2]])
1×2 IncidenceMatrix
[1, 2]

julia> v = normal_toric_variety(max_cones, rs)
Normal toric variety

julia> f = blow_up(v, [0, 1])
Toric blowup morphism

julia> center_unnormalized(f)
Sheaf of ideals
  on normal, non-smooth toric variety
with restriction
  1: Ideal (x_3_1, x_2_1, x_1_1)

julia> typeof(center_unnormalized(f))
IdealSheaf{NormalToricVariety, AbsAffineScheme, Ideal, Map}
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

The ray can alternatively be given using minimal supercone coordinates:

blow_up_along_minimal_supercone_coordinatesMethod
blow_up_along_minimal_supercone_coordinates(v::NormalToricVarietyType, minimal_supercone_coords::AbstractVector{<:IntegerUnion}; coordinate_name::Union{String, Nothing} = nothing)

This method first constructs the ray r by calling standard_coordinates, then blows up v along r using blow_up.

Examples

julia> P2 = projective_space(NormalToricVariety, 2)
Normal toric variety

julia> f = blow_up_along_minimal_supercone_coordinates(P2, [2, 3, 0])
Toric blowup morphism
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Attributes

underlying_morphismMethod
underlying_morphism(bl::ToricBlowupMorphism)

Return the underlying toric morphism of a toric blowup. Access to other attributes such as domain, codomain, covering_morphism are executed via underlying_morphism.

Examples

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, [0, 1, 1])
Toric blowup morphism

julia> Oscar.underlying_morphism(f)
Toric morphism
source
index_of_exceptional_rayMethod
index_of_exceptional_ray(bl::ToricBlowupMorphism)

Return the index of the exceptional ray used in the construction of the toric blowup.

Examples

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, [0, 1, 1])
Toric blowup morphism

julia> index_of_exceptional_ray(f)
5
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
center_dataMethod
center_data(bl::ToricBlowupMorphism)

Returns the ideal, ideal sheaf or ray that was used to construct the morphism.

Examples

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, [0, 2, 3])
Toric blowup morphism

julia> center_data(f)
3-element Vector{Int64}:
 0
 2
 3
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
center_unnormalizedMethod
center_unnormalized(bl::ToricBlowupMorphism)

Returns an ideal sheaf I such that the normalization of the blowup along I gives the morphism bl.

Examples

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, [0, 2, 3])
Toric blowup morphism

julia> center_unnormalized(f)
Sheaf of ideals
  on normal, smooth toric variety
with restrictions
  1: Ideal (x_2_1^2, x_3_1^3)
  2: Ideal (x_2_2^2, x_3_2^3)
  3: Ideal (1)
  4: Ideal (1)
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
exceptional_prime_divisorMethod
exceptional_prime_divisor(bl::ToricBlowupMorphism)

Return the exceptional prime Weil divisor (as a toric divisor) of the ray used to construct the toric blowup. Note that this divisor need not be Cartier and this divisor need not coincide with the locus where the morphism is not an isomorphism.

Examples

julia> P3 = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> f = blow_up(P3, [0, 2, 3])
Toric blowup morphism

julia> E = exceptional_prime_divisor(f)
Torus-invariant, prime divisor on a normal toric variety

julia> is_cartier(E)
false
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Based on underlying_morphism, also the following attributes of toric morphisms are supported for toric blowups:

  • grid_morphism(bl::ToricBlowupMorphism),
  • morphism_on_torusinvariant_weil_divisor_group(bl::ToricBlowupMorphism),
  • morphism_on_torusinvariant_cartier_divisor_group(bl::ToricBlowupMorphism),
  • morphism_on_class_group(bl::ToricBlowupMorphism),
  • morphism_on_picard_group(bl::ToricBlowupMorphism).

Methods

We can compute the total and strict transforms of homogeneous ideals in Cox rings under star subdivisions along a ray.

strict_transformMethod
strict_transform(f::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal
strict_transform(f::ToricBlowupMorphism, g::MPolyDecRingElem) -> MPolyDecRingElem

Let $f\colon Y \to X$ be the toric blowup corresponding to a star subdivision along a ray. Let $R$ and $S$ be the Cox rings of $X$ and $Y$, respectively. Here "strict transform" means the "scheme-theoretic closure of the complement of the exceptional divisor in the scheme-theoretic inverse image". This function returns a homogeneous ideal (or a polynomial generating a principal ideal) in $S$ corresponding to the strict transform under $f$ of the closed subscheme of $X$ defined by the homogeneous ideal $I$ (or by the homogeneous principal ideal generated by $g$) in $R$.

This is implemented under the following assumptions:

  • the variety $X$ has no torus factors (meaning the rays span $N_{\mathbb{R}}$).
Note

Computing strict_transform(f, g) is faster than computing strict_transform(f, ideal(g))[1] since it avoids creating an ideal.

Examples

julia> X = affine_space(NormalToricVariety, 2)
Normal toric variety

julia> f = blow_up(X, [2, 3])
Toric blowup morphism

julia> R = cox_ring(X)
Multivariate polynomial ring in 2 variables over QQ graded by the trivial group

julia> (x1, x2) = gens(R)
2-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
 x1
 x2

julia> I = ideal(R, [x1 + x2])
Ideal generated by
  x1 + x2

julia> strict_transform(f, I)
Ideal generated by
  x1 + x2*e
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
strict_transform_with_indexMethod
strict_transform_with_index(f::ToricBlowupMorphism, I::MPolyIdeal) -> (MPolyIdeal, Int)
strict_transform_with_index(f::ToricBlowupMorphism, g::MPolyDecRingElem) -> (MPolyDecRingElem, Int)

Returns the pair $(J, k)$, where $J$ coincides with strict_transform(f, I) (or with strict_transform(f, g)) and where $k$ is the multiplicity of the total transform along the exceptional prime divisor.

This is implemented under the following assumptions:

  • the variety $X$ has no torus factors (meaning the rays span $N_{\mathbb{R}}$), and
  • the variety $X$ is smooth.
Note

If the multiplicity $k$ is not needed, we recommend to use strict_transform(f, I) which is typically faster.

Note

Computing strict_transform_with_index(f, g) is faster than computing strict_transform_with_index(f, ideal(g)) since it avoids creating an ideal.

Examples

julia> X = affine_space(NormalToricVariety, 2)
Normal toric variety

julia> f = blow_up(X, [2, 3])
Toric blowup morphism

julia> R = cox_ring(X)
Multivariate polynomial ring in 2 variables over QQ graded by the trivial group

julia> (x1, x2) = gens(R)
2-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
 x1
 x2

julia> I = ideal(R, [x1 + x2])
Ideal generated by
  x1 + x2

julia> strict_transform_with_index(f, I)
(Ideal (x1 + x2*e), 2)
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
total_transformMethod
total_transform(f::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal
total_transform(f::ToricBlowupMorphism, g::MPolyDecRingElem) -> MPolyDecRingElem

Let $f\colon Y \to X$ be the toric blowup corresponding to a star subdivision along a ray. Let $R$ and $S$ be the Cox rings of $X$ and $Y$, respectively. Here "total transform" means the "scheme-theoretic inverse image". This function returns a homogeneous ideal (or a polynomial generating a principal ideal) in $S$ corresponding to the total transform under $f$ of the closed subscheme of $X$ defined by the homogeneous ideal $I$ (or by the homogeneous principal ideal generated by $g$) in $R$.

This is implemented under the following assumptions:

  • the variety $X$ has no torus factors (meaning the rays span $N_{\mathbb{R}}$), and
  • the variety $X$ is an orbifold (meaning its fan is simplicial).
Note

Computing total_transform(f, g) is faster than computing total_transform(f, ideal(g))[1] since it avoids creating an ideal.

Examples

julia> X = affine_space(NormalToricVariety, 2)
Normal toric variety

julia> f = blow_up(X, [2, 3])
Toric blowup morphism

julia> R = cox_ring(X)
Multivariate polynomial ring in 2 variables over QQ graded by the trivial group

julia> (x1, x2) = gens(R)
2-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
 x1
 x2

julia> I = ideal(R, [x1 + x2])
Ideal generated by
  x1 + x2

julia> total_transform(f, I)
Ideal generated by
  x1*e^2 + x2*e^3
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

The above functions are implemented using a $\mathbb{C}$-module homomorphism between the Cox rings, considered as $\mathbb{C}$-modules, that takes homogeneous ideals to homogeneous ideals:

cox_ring_module_homomorphismFunction
cox_ring_module_homomorphism(f::ToricBlowupMorphism, g::MPolyDecRingElem) -> MPolyDecRingElem
cox_ring_module_homomorphism(f::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal

Let $f\colon Y \to X$ be the toric blowup corresponding to a star subdivision along a ray with minimal generator $v$. Let $R$ and $S$ be the Cox rings of $X$ and $Y$, respectively. Considering $R$ and $S$ with their $\mathbb{C}$-module structures, we construct a $\mathbb{C}$-module homomorphism $\Phi\colon R \to S$ sending a monomial $g$ to $e^d g$, where $e$ is the variable corresponding to the ray $\rho$ and where $d = 0$ if $\rho$ belongs to the fan of $X$ and $d = \lceil a \cdot p \rceil$ otherwise, where $a$ is the exponent vector of $g$, $p$ is the minimal supercone coordinate vector of $v$ in the fan of $X$, as returned by minimal_supercone_coordinates_of_exceptional_ray(X, v), and where $(\cdot)$ denotes the scalar product.

The $\mathbb{C}$-module homomorphism $\Phi$ sends homogeneous ideals to homogeneous ideals.

Examples

julia> X = affine_space(NormalToricVariety, 2)
Normal toric variety

julia> f = blow_up(X, [2, 3])
Toric blowup morphism

julia> R = cox_ring(X)
Multivariate polynomial ring in 2 variables over QQ graded by the trivial group

julia> (x1, x2) = gens(R)
2-element Vector{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}:
 x1
 x2

julia> cox_ring_module_homomorphism(f, x1 + x2)
x1*e^2 + x2*e^3
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Arithmetics

Toric blowups can be added, subtracted and multiplied by rational numbers. The results of such operations will not be toric morphisms, i.e. they no longer correspond to the blowup of a certain closed subscheme. Arithmetics among toric blowups and general toric morphisms is also supported, as well as equality for toric blowups.