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

blowupMethod
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, and
  • j, a map of abstract varieties, is the inclusion of E into Bl.
Note

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
Experimental

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

source
blowup_pointsMethod
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)
Experimental

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

source

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