Blow-ups
The blow-up of a smooth variety $X$ along a smooth subvariety $Z$ replaces $Z$ by the exceptional divisor $E = \mathbb P(N_{Z/X})$, the projectivization of the normal bundle of $Z$ in $X$. The resulting variety $\widetilde{X}$ comes equipped with a map $\pi\colon \widetilde{X}\to X$ that is an isomorphism away from $E$.
In OSCAR, a blow-up is constructed from an inclusion map $i\colon Z \hookrightarrow X$ (an AbstractVarietyMap). The function blowup returns the triple (Bl, E, j) where Bl is the blow-up, E is the exceptional divisor, and j: E → Bl is the inclusion. The structure maps Bl → X and E → Z are obtained via structure_map.
Constructors
blowup — Method
blowup(i::AbstractVarietyMap; symbol::String="e")Given an inclusion i$ : $ X $\rightarrow$ Y, say, return the blow-up of Y along X.
More precisely, return a tuple (Bl, E, j), say, where
Bl, an abstract variety, is the blow-up,E, an abstract variety, is the exceptional divisor, andj, a map of abstract varieties, is the inclusion ofEintoBl.
The resulting maps Bl $\rightarrow$ Y and E $\rightarrow$ X are obtained by entering structure_map(Bl) and structure_map(E), respectively.
Examples
Taken from the sage package Chow by Lehn/Sorger:
julia> P2xP2 = abstract_projective_space(2, symbol = "k")*abstract_projective_space(2, symbol = "l")
AbstractVariety of dim 4
julia> P8 = abstract_projective_space(8)
AbstractVariety of dim 8
julia> k, l = gens(P2xP2)
2-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}:
k
l
julia> Se = map(P2xP2, P8, [k+l])
AbstractVarietyMap from AbstractVariety of dim 4 to AbstractVariety of dim 8
julia> Bl, E, j = blowup(Se)
(AbstractVariety of dim 8, AbstractVariety of dim 7, AbstractVarietyMap from AbstractVariety of dim 7 to AbstractVariety of dim 8)
julia> betti_numbers(Bl)
9-element Vector{Int64}:
1
2
4
7
8
7
4
2
1
The Steiner problem:
julia> P2 = abstract_projective_space(2)
AbstractVariety of dim 2
julia> P5 = abstract_projective_space(5, symbol = "H")
AbstractVariety of dim 5
julia> h = gens(P2)[1]
h
julia> H = gens(P5)[1]
H
julia> i = map(P2, P5, [2*h])
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 5
julia> Bl, E, j = blowup(i)
(AbstractVariety of dim 5, AbstractVariety of dim 4, AbstractVarietyMap from AbstractVariety of dim 4 to AbstractVariety of dim 5)
julia> e, HBl = gens(chow_ring(Bl))
2-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}:
e
H
julia> integral((6*HBl-2*e)^5)
3264
This function is part of the experimental code in Oscar. Please read here for more details.
blowup_points — Method
function blowup_points(X::AbstractVariety, n::Int; symbol::String = "e")Return the blow-up of X at n points.
Examples
julia> P2 = abstract_projective_space(2)
AbstractVariety of dim 2
julia> Bl = blowup_points(P2, 1)
AbstractVariety of dim 2
julia> chow_ring(Bl)
Quotient
of multivariate polynomial ring in 2 variables over QQ graded by
e -> [1]
h -> [1]
by ideal (e*h, e^2 + h^2)
This function is part of the experimental code in Oscar. Please read here for more details.
The Chow ring of a blow-up
Let $\widetilde{X}$ be the blow-up of $X$ along $Z$ with exceptional divisor $E$. The Chow ring $\mathrm{N}^*(\widetilde{X})$ is generated as an $\mathrm{N}^*(X)$-algebra by the class $e = [E]$ of the exceptional divisor, subject to the relation
\[\sum_{k=0}^{r} (-1)^k c_k(N_{Z/X})\, e^{r-k} = 0\]
where $r$ is the codimension of $Z$ in $X$, together with the multiplication rule $j_*(x) \cdot j_*(y) = -j_*(x \cdot y \cdot \zeta)$ for classes on $E$ (see [EH16], Proposition 13.12).
Worked examples
Blow-up of the Veronese surface
Blow up $\mathbb P^5$ along the Veronese surface (the image of $\mathbb P^2$ under the degree-2 map). The Chow ring generators, Betti numbers, tangent bundle, and intersection numbers can be read off:
julia> P2 = abstract_projective_space(2);
julia> P5 = abstract_projective_space(5);
julia> i = map(P2, P5, [2*P2.O1]);
julia> Bl, E, j = blowup(i);
julia> betti_numbers(Bl)
6-element Vector{Int64}:
1
2
3
3
2
1
julia> euler_number(Bl)
12
julia> e, H = gens(chow_ring(Bl)) # exceptional divisor class and pullback of hyperplane class
2-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}:
e
h
julia> integral(top_chern_class(tangent_bundle(Bl)))
12
We can verify that the proper transform of a quadric through the Veronese has degree 1 (it is a linear space):
julia> e, H = gens(chow_ring(Bl));
julia> quad = pullback(structure_map(Bl), 2*P5.O1) - e; # proper transform of a quadric
julia> integral(quad^5)
1
Blow-up of a twisted cubic
Blow up $\mathbb P^3$ along a twisted cubic (the image of $\mathbb P^1$ via $\mathcal{O}(3)$). The proper transform of a quadric containing the cubic has self-intersection 0, while a cubic surface meets it in a single residual point:
julia> P1 = abstract_projective_space(1);
julia> P3 = abstract_projective_space(3);
julia> i = map(P1, P3, [3*P1.O1]);
julia> Bl, E, j = blowup(i);
julia> e = pushforward(j, E(1));
julia> quad = pullback(structure_map(Bl), 2*P3.O1) - e;
julia> integral(quad^3) # quadrics through the cubic form a net
0
julia> cubic = pullback(structure_map(Bl), 3*P3.O1) - e;
julia> integral(quad^2 * cubic) # residual intersection
1
Blow-up of $\mathbb P^2 \times \mathbb P^2$ (Segre embedding)
Blow up $\mathbb P^8$ along the Segre image of $\mathbb P^2 \times \mathbb P^2$. We verify the Betti numbers of the resulting variety:
julia> P2xP2 = abstract_projective_space(2, symbol = "k") * abstract_projective_space(2, symbol = "l");
julia> P8 = abstract_projective_space(8);
julia> k, l = gens(P2xP2);
julia> Se = map(P2xP2, P8, [k + l]);
julia> Bl, E, j = blowup(Se);
julia> betti_numbers(Bl)
9-element Vector{Int64}:
1
2
4
7
8
7
4
2
1
julia> euler_number(Bl)
36