Some Particular Constructions

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!Method
trim!(X::AbstractVariety)

Return X with its Chow ring modified as follows:

  • Mod out suitable powers of the generators of base_ring(R) so that the resulting new ring is zero-dimensional (in the example below, these are the powers h^3, c1^3, and c2^2).

  • Then, if K = base(X), the new ring has a finite K-basis. Now, additionally mod out the given generators of each class in the basis which should be zero due to dimension.

Note

For the construction of a new abstract variety, it is occasionally convenient to start from the underlying graded polynomial ring of the Chow ring, possibly with some relations already given, and adding further relations step by step. The trim! function offers one way of doing this.

Warning

As this function changes an entry in the collection of data making up X, it should only be used by experts who are able to foresee the potential impact of such a change.

Examples

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);

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]
Experimental

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

source

Example: Cubic Surfaces

A cubic surface is a smooth degree-3 hypersurface in $\mathbb P^3$. We may construct such a hypersurface as follows:

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 $\mathbb P^2$ in 6 points:

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.

Example: Cubic Fourfolds

A cubic fourfold is a smooth degree-3 hypersurface in $\mathbb P^5$. We may construct such a hypersurface as follows:

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.

Special Cubic Fourfolds

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 a 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]

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:

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 pushforwarded 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> 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 pushforward 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

Cubic Fourfolds Containing a Degree-5 del Pezzo Surface

Next we consider a more explicit surface: 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