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 on toric blowups given by a star subdivision of a polyhedral fan along a primitive vector, see 11.1 Star Subdivisions in [CLS11].

Given a homogeneous ideal II in the Cox ring of XX, 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 JJ can be computed by strict_transform(phi, J). Ideal sheaves on toric varieties are currently (30 Jan 2025) considered experimental.

Constructors

The main constructor returns the toric blowup induced by the star subdivision of the polyhedral fan along a primitive vector in the support of the fan (see 11.1 Star Subdivisions in [CLS11]):

blow_upMethod
blow_up(X::NormalToricVarietyType, r::AbstractVector{<:IntegerUnion}; coordinate_name::Union{String, Nothing} = nothing)
-> ToricBlowupMorphism

Star subdivide the fan Σ\Sigma of the toric variety XX along the primitive vector r in the support of Σ\Sigma (Section 11.1 Star Subdivisions in [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 optional argument one can supply a custom variable name.

Examples

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

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

julia> Y = domain(phi)
Normal toric variety

julia> cox_ring(Y)
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]
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(X::NormalToricVarietyType, minimal_supercone_coords::AbstractVector{<:RationalUnion}; coordinate_name::Union{String, Nothing} = nothing)
-> ToricBlowupMorphism

This method first constructs the primitive vector rr by calling standard_coordinates, then blows up XX along rr using blow_up.

Examples

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

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

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

source

The blowup along the nn-th (nonzero) cone in the fan of the variety XX is the morphism induced by the star subdivision along the barycenter of the cone (the primitive generator of the sum of its rays):

blow_upMethod
blow_up(X::NormalToricVarietyType, n::Int; coordinate_name::Union{String, Nothing} = nothing)
-> ToricBlowupMorphism

Blow up the toric variety XX with polyhedral fan Σ\Sigma by star subdivision along the barycenter of the nn-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> X = projective_space(NormalToricVariety, 3)
Normal toric variety

julia> phi = blow_up(X, 5)
Toric blowup morphism

julia> Y = domain(phi)
Normal toric variety

julia> cox_ring(Y)
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

Attributes

index_of_exceptional_rayMethod
index_of_exceptional_ray(phi::ToricBlowupMorphism) -> Int

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

Examples

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

julia> phi = blow_up(X, [0, 1, 1])
Toric blowup morphism

julia> index_of_exceptional_ray(phi)
5
Experimental

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

source
minimal_supercone_coordinates_of_exceptional_rayMethod
minimal_supercone_coordinates_of_exceptional_ray(phi::ToricBlowupMorphism) -> Vector{QQFieldElem}

Let φ ⁣:YX\varphi\colon Y \to X be the toric blowup corresponding to a star subdivision along a primitive vector rr in the support of the fan of XX. This function returns the minimal supercone coordinate vector of rr (the output of minimal_supercone_coordinates(polyhedral_fan(X), r)).

Examples

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

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

julia> minimal_supercone_coordinates_of_exceptional_ray(phi)
2-element Vector{QQFieldElem}:
 2
 3
Experimental

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

source
exceptional_prime_divisorMethod
exceptional_prime_divisor(phi::ToricBlowupMorphism) -> ToricDivisor

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> X = projective_space(NormalToricVariety, 3)
Normal toric variety

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

julia> E = exceptional_prime_divisor(phi)
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
centerMethod
center(phi::ToricBlowupMorphism) -> AbsIdealSheaf

Return an ideal sheaf I\mathcal{I} such that the cosupport of I\mathcal{I} is the image of the exceptional prime divisor.

Examples

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

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

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

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

source

Also the following attributes of toric morphisms are supported for toric blowups:

  • lattice_homomorphism(phi::ToricBlowupMorphism),
  • morphism_on_torusinvariant_weil_divisor_group(phi::ToricBlowupMorphism),
  • morphism_on_torusinvariant_cartier_divisor_group(phi::ToricBlowupMorphism),
  • morphism_on_class_group(phi::ToricBlowupMorphism),
  • morphism_on_picard_group(phi::ToricBlowupMorphism).

Methods

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

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

Let φ ⁣:YX\varphi\colon Y \to X be the toric blowup corresponding to a star subdivision along a primitive vector in the support of the fan of XX. Let RR and SS be the Cox rings of XX and YY, 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 SS corresponding to the strict transform under φ\varphi of the closed subscheme of XX defined by the homogeneous ideal II (or by the homogeneous principal ideal generated by ff) in RR.

This is implemented under the following assumption:

  • the variety XX has no torus factors (meaning the rays span NRN_{\mathbb{R}}).
Note

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

Examples

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

julia> phi = 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(phi, 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(phi::ToricBlowupMorphism, I::MPolyIdeal) -> (MPolyIdeal, Int)
strict_transform_with_index(phi::ToricBlowupMorphism, f::MPolyDecRingElem) -> (MPolyDecRingElem, Int)

Return the pair (J,k)(J, k), where JJ coincides with strict_transform(phi, I) (or with strict_transform(phi, f)) and where kk is the multiplicity of the total transform along the exceptional prime divisor.

This is implemented under the following assumptions:

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

If the multiplicity kk is not needed, we recommend to use strict_transform(phi, I) which is typically faster.

Note

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

Examples

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

julia> phi = 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(phi, 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(phi::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal
total_transform(phi::ToricBlowupMorphism, f::MPolyDecRingElem) -> MPolyDecRingElem

Let φ ⁣:YX\varphi\colon Y \to X be the toric blowup corresponding to a star subdivision along a primitive vector in the support of the fan of XX. Let RR and SS be the Cox rings of XX and YY, respectively. Here "total transform" means the "scheme-theoretic inverse image". This function returns a homogeneous ideal (or a polynomial generating a principal ideal) in SS corresponding to the total transform under φ\varphi of the closed subscheme of XX defined by the homogeneous ideal II (or by the homogeneous principal ideal generated by ff) in RR.

This is implemented under the following assumptions:

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

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

Examples

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

julia> phi = 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(phi, 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 C\mathbb{C}-module homomorphism between the Cox rings, considered as C\mathbb{C}-modules, that takes homogeneous ideals to homogeneous ideals:

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

Let φ ⁣:YX\varphi\colon Y \to X be the toric blowup corresponding to a star subdivision along a primitive vector rr in the support of the fan of XX. Let RR and SS be the Cox rings of XX and YY, respectively. Let ρ\rho be the ray generated by rr. Considering RR and SS with their C\mathbb{C}-module structures, we construct a C\mathbb{C}-module homomorphism Φ ⁣:RS\Phi\colon R \to S sending a monomial gg to edge^d g, where ee is the variable corresponding to ρ\rho and where d=0d = 0 if ρ\rho belongs to the fan of XX and d=apd = \lceil a \cdot p \rceil otherwise, where aa is the exponent vector of gg, pp is the minimal supercone coordinate vector of rr in the fan of XX, as returned by minimal_supercone_coordinates_of_exceptional_ray(X, r), and where ()(\cdot) denotes the scalar product.

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

Examples

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

julia> phi = 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(phi, 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