CurrentModule = Oscar
CollapsedDocStrings = true
DocTestSetup = Oscar.doctestsetup()
In this section, we illustrate the construction of abstract varieties in Oscar by particular examples. Recall that an abstract variety is defined by specifying the dimension of the variety together with its Chow ring and, possibly, further data. Here, OSCAR offers the setter functions
set_point_class(X::AbstractVariety, p::MPolyDecRingOrQuoElem),set_tangent_bundle(X::AbstractVariety, t::AbstractBundle),set_polarization(X::AbstractVariety, o1::MPolyDecRingOrQuoElem),set_tautological_bundles(X::AbstractVariety, vb::Vector{AbstractBundle}),set_structure_map(X::AbstractVariety, f::AbstractVarietyMap).
See the construction of the surface S in the subsection Special cubic fourfolds for an example.
The auxiliary function below is also used in that construction.
trim!(X::AbstractVariety)
A cubic surface is a smooth degree-3 hypersurface in
julia> P3 = abstract_projective_space(3, symbol= "H")
AbstractVariety of dim 3
julia> S1 = zero_locus_section(OO(P3, 3))
AbstractVariety of dim 2
julia> basis(S1)
3-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[H]
[H^2]
Here, the Chow ring of S1 contains only classes arising as pullbacks of cycle classes
on the ambient projective space. So we did not compute the full Chow ring of a cubic
surface: We are missing the classes of the exceptional divisors which are obtained
when realizing the cubic surface as the blow-up of
julia> P2 = abstract_projective_space(2, symbol= "L");
julia> S2 = blow_up_points(P2, 6)
AbstractVariety of dim 2
julia> basis(S2)
3-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[L, e[1], e[2], e[3], e[4], e[5], e[6]]
[L^2]
Now consider the class of the anticanonical system which embeds S2 intoP3 as a cubic hypersurface:
julia> h = -canonical_class(S2)
-e[6] - e[5] - e[4] - e[3] - e[2] - e[1] + 3*L
julia> integral(h^2)
3
julia> euler_characteristic(OO(S2, h))
4
The corresponding map from S2 to S1 is an isomorphism:
julia> f = map(S2, S1, [h])
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 2
julia> dim(f) # relative dimension
0
julia> chern_character(tangent_bundle(f)) # relative tangent bundle
0
Although f is an isomorphism, due to the missing classes in the Chow ring of S1, applying the constructed
pushforward map to the classes e[i] will yield a warning and not give a correct answer.
A cubic fourfold is a smooth degree-3 hypersurface in
julia> P5 = abstract_projective_space(5, symbol= "H")
AbstractVariety of dim 5
julia> X = zero_locus_section(OO(P5, 3))
AbstractVariety of dim 4
julia> basis(X)
5-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[H]
[H^2]
[H^3]
[H^4]
As for the Chow ring of the cubic surface S1 considered in the previous example,
the Chow ring of X contains only classes
arising as pullbacks of cycle classes on the ambient projective space.
In particular, there are only classes that are generated by complete intersections.
A cubic fourfold is special if it contains a surface not homologous to a complete intersection (see Has00).
Compared to the Chow ring constructed above, such a surface defines an extra class in codimension 2.
For an example, we first construct an (abstract) surface S together with its tangent bundle:
julia> RS, _ = graded_polynomial_ring(QQ, ["h", "c1", "c2"], [1, 1, 2]);
julia> S = abstract_variety(2, RS) # no relations yet
AbstractVariety of dim 2
julia> trim!(S); # see the description of the trim! function above.
julia> chow_ring(S)
Quotient
of multivariate polynomial ring in 3 variables over QQ graded by
h -> [1]
c1 -> [1]
c2 -> [2]
by ideal with 14 generators
julia> basis(S)
3-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[c1, h]
[c2, c1^2, h*c1, h^2]
A priori, it looks like there are too many generators for the top degree part of the Chow ring:
we expect there to be a unique point class, but there are 4 basis elements in that degree.
The reason is that h, c1, and c2 are completely formal variables,
and we have not specified their relationship.
julia> h, c1, c2 = gens(S)
3-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}:
h
c1
c2
julia> T = abstract_bundle(S, 2, 1 + c1 + c2)
AbstractBundle of rank 2 on AbstractVariety of dim 2
julia> set_tangent_bundle(S, T);
Now we embed S into the cubic fourfold X:
julia> i = map(S, X, [h])
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 4
The self-intersection number of S in X is equal to the top Chern class of the relative normal bundle which, in turn,
can be accessed as the negative of the relative tangent bundle of i,
cf. the expression in Has00, Section 4.1:
julia> top_chern_class(-i.T)
6*h^2 - 3*h*c1 + c1^2 - c2
However, since there is no class in X for the surface S,
the classes on S (such as the top Chern class above) cannot be pushed forward to X:
julia> pushforward(i, one(chow_ring(S))) # will throw error;
To overcome this problem, we may set inclusion = true when building the inclusion.
The returned inclusion will then have as its codomain a modified version of X, with extra classes added:
julia> j = map(S, X, [h], inclusion = true, symbol = "s")
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 4
julia> ct = top_chern_class(-j.T)
6*h^2 - 3*h*c1 + c1^2 - c2
julia> Y = codomain(j)
AbstractVariety of dim 4
julia> pi = structure_map(Y)
AbstractVarietyMap from AbstractVariety of dim 4 to AbstractVariety of dim 4
julia> codomain(pi) == X
true
julia> basis(Y)
5-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[H]
[H^2, s]
[H^3, s*H, s[3]]
[H^4, s*H^2, s[3]*H, s^2, s[2]]
Now we can push forward classes on S:
julia> pushforward(j, one(chow_ring(S)))
s
julia> pushforward(j, ct)
-s[1] + s[2] - 3*s[3]*H + 6*s*H^2
Next we consider an explicit surface living on a special cubic 4-fold: a degree-5 del Pezzo surface can be constructed as the projective plane blown up at 4 points:
julia> P2 = abstract_projective_space(2)
AbstractVariety of dim 2
julia> S = blow_up_points(P2, 4)
AbstractVariety of dim 2
julia> basis(S)
3-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[h, e[1], e[2], e[3], e[4]]
[h^2]
The surface S can be embedded into a special cubic fourfold Z by its anti-canonical linear system:
julia> K = canonical_class(S)
e[4] + e[3] + e[2] + e[1] - 3*h
julia> euler_characteristic(OO(S, -K))
6
julia> i = map(S, X, [-K], inclusion = true, symbol = "s")
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 4
julia> Z = i.codomain
AbstractVariety of dim 4
julia> basis(Z)
5-element Vector{Vector{MPolyQuoRingElem}}:
[1]
[H]
[H^2, s]
[H^3, s*H, s[4], s[3], s[2], s[1]]
[H^4]
The cubic fourfold Z is rational:
a rational map to projective 4-space is given by the linear system of quadric hypersurfaces containing S .
Numerically, we compute the blowup of Z along S and study the divisor 2H − e:
julia> Bl, E, j = blow_up(i);
julia> H = pullback(structure_map(Bl), polarization(Z))
H
julia> e = pushforward(j, one(chow_ring(E)))
e
julia> integral((2H - e)^4)
1
julia> euler_characteristic(OO(Bl, 2H - e))
5
The cubic fourfold Z is a special cubic fourfold of discriminant 14, see Has00, Section 4.1.3.
We can verify this as follows:
julia> M = intersection_matrix(basis(Z)[3])
[3 5]
[5 13]
julia> det(M)
14