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 $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 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_up
— Methodblow_up(X::NormalToricVarietyType, r::AbstractVector{<:IntegerUnion}; coordinate_name::Union{String, Nothing} = nothing)
-> ToricBlowupMorphism
Star subdivide the fan $\Sigma$ of the toric variety $X$ 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]
This function is part of the experimental code in Oscar. Please read here for more details.
The ray can alternatively be given using minimal supercone coordinates:
blow_up_along_minimal_supercone_coordinates
— Methodblow_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 $r$ by calling standard_coordinates
, then blows up $X$ along $r$ 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
This function is part of the experimental code in Oscar. Please read here for more details.
The blowup along the $n$-th (nonzero) cone in the fan of the variety $X$ is the morphism induced by the star subdivision along the barycenter of the cone (the primitive generator of the sum of its rays):
blow_up
— Methodblow_up(X::NormalToricVarietyType, n::Int; coordinate_name::Union{String, Nothing} = nothing)
-> ToricBlowupMorphism
Blow up the toric variety $X$ 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> 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]
This function is part of the experimental code in Oscar. Please read here for more details.
Attributes
index_of_exceptional_ray
— Methodindex_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
This function is part of the experimental code in Oscar. Please read here for more details.
minimal_supercone_coordinates_of_exceptional_ray
— Methodminimal_supercone_coordinates_of_exceptional_ray(phi::ToricBlowupMorphism) -> Vector{QQFieldElem}
Let $\varphi\colon Y \to X$ be the toric blowup corresponding to a star subdivision along a primitive vector $r$ in the support of the fan of $X$. This function returns the minimal supercone coordinate vector of $r$ (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
This function is part of the experimental code in Oscar. Please read here for more details.
exceptional_prime_divisor
— Methodexceptional_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
This function is part of the experimental code in Oscar. Please read here for more details.
center
— Methodcenter(phi::ToricBlowupMorphism) -> AbsIdealSheaf
Return an ideal sheaf $\mathcal{I}$ such that the cosupport of $\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)
This function is part of the experimental code in Oscar. Please read here for more details.
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_transform
— Methodstrict_transform(phi::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal
strict_transform(phi::ToricBlowupMorphism, f::MPolyDecRingElem) -> MPolyDecRingElem
Let $\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 $X$. 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 $\varphi$ of the closed subscheme of $X$ defined by the homogeneous ideal $I$ (or by the homogeneous principal ideal generated by $f$) in $R$.
This is implemented under the following assumption:
- the variety $X$ has no torus factors (meaning the rays span $N_{\mathbb{R}}$).
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
This function is part of the experimental code in Oscar. Please read here for more details.
strict_transform_with_index
— Methodstrict_transform_with_index(phi::ToricBlowupMorphism, I::MPolyIdeal) -> (MPolyIdeal, Int)
strict_transform_with_index(phi::ToricBlowupMorphism, f::MPolyDecRingElem) -> (MPolyDecRingElem, Int)
Return the pair $(J, k)$, where $J$ coincides with strict_transform(phi, I)
(or with strict_transform(phi, f)
) 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.
If the multiplicity $k$ is not needed, we recommend to use strict_transform(phi, I)
which is typically faster.
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)
This function is part of the experimental code in Oscar. Please read here for more details.
total_transform
— Methodtotal_transform(phi::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal
total_transform(phi::ToricBlowupMorphism, f::MPolyDecRingElem) -> MPolyDecRingElem
Let $\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 $X$. 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 $\varphi$ of the closed subscheme of $X$ defined by the homogeneous ideal $I$ (or by the homogeneous principal ideal generated by $f$) 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).
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
This function is part of the experimental code in Oscar. Please read here for more details.
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_homomorphism
— Functioncox_ring_module_homomorphism(phi::ToricBlowupMorphism, f::MPolyDecRingElem) -> MPolyDecRingElem
cox_ring_module_homomorphism(phi::ToricBlowupMorphism, I::MPolyIdeal) -> MPolyIdeal
Let $\varphi\colon Y \to X$ be the toric blowup corresponding to a star subdivision along a primitive vector $r$ in the support of the fan of $X$. Let $R$ and $S$ be the Cox rings of $X$ and $Y$, respectively. Let $\rho$ be the ray generated by $r$. 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 $\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 $r$ in the fan of $X$, as returned by minimal_supercone_coordinates_of_exceptional_ray(X, r)
, 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> 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
This function is part of the experimental code in Oscar. Please read here for more details.