Abstract bundles
An abstract bundle on an abstract variety $X$ is determined by its rank and its Chern character (or, equivalently, its total Chern class). Abstract bundles support the standard operations on vector bundles in algebraic geometry: direct sum, tensor product, duals, determinant bundles, exterior and symmetric powers, as well as pullback and pushforward along abstract variety maps. They also carry the usual characteristic classes: Chern classes, Segre classes, Todd class, and Pontryagin classes.
The arithmetic operations +, -, * on abstract bundles correspond to direct sum, formal difference, and tensor product, respectively. In particular, multiplying a bundle by an integer n gives the direct sum of n copies.
Grothendieck ring and virtual bundles
Abstract bundles live in the Grothendieck ring $\mathrm{K}^0(X)$ of vector bundles on $X$. In this ring, every element can be written as a formal difference $[E] - [F]$ of genuine bundles. The Chern character $\mathrm{ch}\colon\mathrm{K}^0(X) \to \mathrm{N}^*(X)_{\mathbb Q}$ is a ring homomorphism that identifies the Grothendieck ring (after tensoring with $\mathbb Q$) with the Chow ring.
In OSCAR, an AbstractBundle is stored as a pair (rank, Chern character), so virtual bundles with zero (and negative) rank are fully supported:
julia> P2 = abstract_projective_space(2);
julia> T = tangent_bundle(P2);
julia> F = T - 2*OO(P2); # a virtual bundle of rank 0
julia> rank(F)
0
julia> chern_character(F)
3//2*h^2 + 3*h
Segre classes
The total Segre class $s(E) = c(E)^{-1}$ is the formal inverse of the total Chern class and arises naturally as the fundamental class of a projective bundle. For a bundle $E$ of rank $r$ the individual Segre classes satisfy $s_k(E) = (-1)^k c_k(E^\vee)$ when $k \le r$, but the relation $s(E)\cdot c(E) = 1$ also determines the higher Segre classes uniquely.
julia> P3 = abstract_projective_space(3);
julia> T = tangent_bundle(P3);
julia> total_segre_class(T)
-20*h^3 + 10*h^2 - 4*h + 1
julia> total_segre_class(T) * total_chern_class(T) # must be 1
1
Types
The OSCAR type for abstract vector bundles is AbstractBundle.
Constructors
abstract_bundle — Method
abstract_bundle(X::AbstractVariety, ch::Union{MPolyDecRingElem, MPolyQuoRingElem})
abstract_bundle(X::AbstractVariety, r::RingElement, c::Union{MPolyDecRingElem, MPolyQuoRingElem})Return an abstract vector bundle on X by specifying its Chern character ch. Equivalently, specify its rank r and total Chern class c.
Examples
We show two ways of constructing the Horrocks-Mumford bundle F [HM73]. First, we create F as the cohomology bundle of its Beilinson monad (see Equation (2.1) in [HM73]):
\[0 \rightarrow \mathcal O_{\mathbb P^4}^5(2)\rightarrow \bigwedge^2\mathrm{T}^*_{\mathbb P^4}(5) \rightarrow \mathcal O_{\mathbb P^4}^5(3)\rightarrow 0.\]
Then, we show the constructor above at work.
julia> P4 = abstract_projective_space(4)
AbstractVariety of dim 4
julia> A = 5*OO(P4, 2)
AbstractBundle of rank 5 on AbstractVariety of dim 4
julia> B = 2*exterior_power(cotangent_bundle(P4), 2)*OO(P4, 5)
AbstractBundle of rank 12 on AbstractVariety of dim 4
julia> C = 5*OO(P4, 3)
AbstractBundle of rank 5 on AbstractVariety of dim 4
julia> F = B - A - C
AbstractBundle of rank 2 on AbstractVariety of dim 4
julia> total_chern_class(F)
10*h^2 + 5*h + 1
julia> h = gens(P4)[1]
h
julia> F == abstract_bundle(P4, 2, 10*h^2 + 5*h + 1)
true
This function is part of the experimental code in Oscar. Please read here for more details.
Underlying data of an abstract bundle
An abstract bundle is made up from (a selection of) the data discussed here:
parent — Method
parent(F::AbstractBundle)Return the underlying abstract variety of F.
Examples
julia> G = abstract_grassmannian(3, 5)
AbstractVariety of dim 6
julia> Q = tautological_bundles(G)[2]
AbstractBundle of rank 2 on AbstractVariety of dim 6
julia> parent(Q) == G
true
This function is part of the experimental code in Oscar. Please read here for more details.
chern_character — Method
chern_character(F::AbstractBundle)Return the Chern character of F.
The Chern classes $\operatorname{c}_k(F)\in A^k(X)$ are the coefficients of the total Chern class $\operatorname{c}(F)=1+\operatorname{c}_1(F)+\operatorname{c}_2(F)+\cdots$, which is multiplicative: $\operatorname{c}(F\oplus G)=\operatorname{c}(F)\cdot\operatorname{c}(G)$.
The Chern character $\operatorname{ch}(F)\in A^*(X)\otimes\mathbb Q$ is instead additive and multiplicative: $\operatorname{ch}(F\oplus G)=\operatorname{ch}(F)+\operatorname{ch}(G)$ and $\operatorname{ch}(F\otimes G)=\operatorname{ch}(F)\cdot\operatorname{ch}(G)$. It is related to the Chern classes by the Newton identity $\operatorname{ch}(F)=\operatorname{rk}(F)+\sum_{k\ge1}\frac{1}{k!}s_k$ where $s_k$ is the $k$-th Newton polynomial in the Chern roots. In particular $\operatorname{ch}_0=\operatorname{rk}$, $\operatorname{ch}_1=\operatorname{c}_1$, $\operatorname{ch}_2=\frac12(\operatorname{c}_1^2-2\operatorname{c}_2)$.
Because of these ring-homomorphism properties, the Chern character — not the total Chern class — is used as the internal representation of a bundle in this package (see AbstractBundle).
Examples
julia> G = abstract_grassmannian(3, 5)
AbstractVariety of dim 6
julia> Q = tautological_bundles(G)[2]
AbstractBundle of rank 2 on AbstractVariety of dim 6
julia> chern_character(Q)
-1//2*c[1]^2 + 1//6*c[1]*c[2] - 1//24*c[1]*c[3] - c[1] + c[2] - 1//3*c[3] + 2
This function is part of the experimental code in Oscar. Please read here for more details.
rank — Method
rank(F::AbstractBundle)Return the rank of F.
Examples
julia> G = abstract_grassmannian(3, 5)
AbstractVariety of dim 6
julia> Q = tautological_bundles(G)[2]
AbstractBundle of rank 2 on AbstractVariety of dim 6
julia> rank(symmetric_power(Q, 3))
4
This function is part of the experimental code in Oscar. Please read here for more details.
total_chern_class — Method
total_chern_class(F::AbstractBundle)Return the total Chern class of F.
Examples
julia> G = abstract_grassmannian(3, 5)
AbstractVariety of dim 6
julia> Q = tautological_bundles(G)[2]
AbstractBundle of rank 2 on AbstractVariety of dim 6
julia> total_chern_class(Q)
c[1]^2 - c[1] - c[2] + 1
julia> chern_class(Q, 1)
-c[1]
julia> chern_class(Q, 2)
c[1]^2 - c[2]
This function is part of the experimental code in Oscar. Please read here for more details.
Further data associated to an abstract bundle
chern_class — Method
chern_class(F::AbstractBundle, k::Int)Return the k-th Chern class of F.
Examples
julia> T, (d,) = polynomial_ring(QQ, [:d])
(Multivariate polynomial ring in 1 variable over QQ, QQMPolyRingElem[d])
julia> QT = fraction_field(T)
Fraction field
of multivariate polynomial ring in 1 variable over QQ
julia> P4 = abstract_projective_space(4, base = QT)
AbstractVariety of dim 4
julia> h = gens(P4)[1]
h
julia> F = abstract_bundle(P4, 2, 10*h^2 + 5*h + 1) # Horrocks-Mumford bundle
AbstractBundle of rank 2 on AbstractVariety of dim 4
julia> chern_class(F*OO(P4, d), 1)
(2*d + 5)*h
julia> chern_class(F*OO(P4, d), 2)
(d^2 + 5*d + 10)*h^2
julia> chern_class(F*OO(P4, -3), 1)
-h
julia> chern_class(F*OO(P4, -3), 2)
4*h^2
This function is part of the experimental code in Oscar. Please read here for more details.
top_chern_class — Method
top_chern_class(F::AbstractBundle)Return the top Chern class of F.
Examples
julia> P4 = abstract_projective_space(4)
AbstractVariety of dim 4
julia> h = gens(P4)[1]
h
julia> F = abstract_bundle(P4, 2, 10*h^2 + 5*h + 1)
AbstractBundle of rank 2 on AbstractVariety of dim 4
julia> top_chern_class(F)
10*h^2
This function is part of the experimental code in Oscar. Please read here for more details.
total_segre_class — Method
total_segre_class(F::AbstractBundle)Return the total Segre class of F.
Examples
julia> G = abstract_grassmannian(3, 5)
AbstractVariety of dim 6
julia> Q = tautological_bundles(G)[2]
AbstractBundle of rank 2 on AbstractVariety of dim 6
julia> C = total_chern_class(Q)
c[1]^2 - c[1] - c[2] + 1
julia> S = total_segre_class(Q)
c[1] + c[2] + c[3] + 1
julia> C*S
1
This function is part of the experimental code in Oscar. Please read here for more details.
segre_class — Method
segre_class(F::AbstractBundle, k::Int)Return the k-th Segre class of F.
Examples
julia> G = abstract_grassmannian(3, 5)
AbstractVariety of dim 6
julia> Q = tautological_bundles(G)[2]
AbstractBundle of rank 2 on AbstractVariety of dim 6
julia> segre_class(Q, 0)
1
julia> segre_class(Q, 1)
c[1]
julia> segre_class(Q, 2)
c[2]
julia> segre_class(Q, 3)
c[3]
This function is part of the experimental code in Oscar. Please read here for more details.
todd_class — Method
todd_class(F::AbstractBundle)Return the Todd class of F.
Examples
julia> P = abstract_projective_space(4, symbol = "H"); # Hartshorne, p. 433
julia> F = exterior_power(cotangent_bundle(P), 3)*OO(P, 3);
julia> G = OO(P, 1) + 4*OO(P);
julia> Z = degeneracy_locus(F, G, 3) # rational surface in P4
AbstractVariety of dim 2
julia> TZ = tangent_bundle(Z);
julia> K = canonical_class(Z)
z - H
julia> chern_class(TZ, 1) == -K
true
julia> tc = todd_class(TZ)
-1//2*z + 1//8*H^2 + 1//2*H + 1
julia> tc == 1 - 1//2*K + 1//12*(K^2 + chern_class(TZ, 2))
true
This function is part of the experimental code in Oscar. Please read here for more details.
total_pontryagin_class — Method
total_pontryagin_class(F::AbstractBundle)Return the total Pontryagin class of F.
Examples
julia> S = complete_intersection(abstract_projective_space(3), 4);
julia> total_pontryagin_class(tangent_bundle(S))
-12*h^2 + 1This function is part of the experimental code in Oscar. Please read here for more details.
pontryagin_class — Method
pontryagin_class(F::AbstractBundle, k::Int)Return the k-th Pontryagin class of F.
Examples
julia> S = complete_intersection(abstract_projective_space(3), 4);
julia> pontryagin_class(tangent_bundle(S), 1)
-12*h^2This function is part of the experimental code in Oscar. Please read here for more details.
euler_characteristic — Method
euler_characteristic(F::AbstractBundle)Return the Euler characteristic $\chi(F)$ computed via the Hirzebruch-Riemann-Roch formula.
Examples
julia> P = abstract_projective_space(4, symbol = "H"); # Hartshorne, p. 433
julia> F = exterior_power(cotangent_bundle(P), 3)*OO(P, 3);
julia> G = OO(P, 1) + 4*OO(P);
julia> Z = degeneracy_locus(F, G, 3) # rational surface in P4
AbstractVariety of dim 2
julia> TZ = tangent_bundle(Z);
julia> K = canonical_class(Z)
z - H
julia> H = polarization(Z)
H
julia> ec = euler_characteristic(OO(Z, H))
4
julia> ec == integral(1//2*H*(H - K) + 1//12*(K^2 + chern_class(TZ, 2)))
true
This function is part of the experimental code in Oscar. Please read here for more details.
hilbert_polynomial — Method
hilbert_polynomial(F::AbstractBundle)If F is an abstract vector bundle on an abstract variety with a given polarization, then return the corresponding Hilbert polynomial of F.
Examples
julia> P2 = abstract_projective_space(2)
AbstractVariety of dim 2
julia> hilbert_polynomial(OO(P2))
1//2*t^2 + 3//2*t + 1
julia> euler_characteristic(OO(P2))
1
julia> euler_characteristic(OO(P2, 1))
3
julia> euler_characteristic(OO(P2, 2))
6
julia> euler_characteristic(OO(P2, 3))
10
This function is part of the experimental code in Oscar. Please read here for more details.
Operations on abstract bundles
The arithmetic operations +, -, * on abstract bundles correspond to direct sum, formal difference, and tensor product, respectively. Multiplying a bundle by an integer n gives the direct sum of n copies.
julia> P3 = abstract_projective_space(3);
julia> 4*OO(P3, 1) - OO(P3) == tangent_bundle(P3) # Euler sequence
true
Euler characteristics of line bundles on $\mathbb P^n$
The Euler characteristic $\chi(\mathcal{O}_{\mathbb P^n}(d)) = \binom{n+d}{n}$ can be computed directly:
julia> P3 = abstract_projective_space(3);
julia> [euler_characteristic(OO(P3, d)) for d in -2:5]
8-element Vector{QQFieldElem}:
0
0
1
4
10
20
35
56
dual — Method
dual(F::AbstractBundle)Return the dual bundle of F.
Examples
julia> P4 = abstract_projective_space(4)
AbstractVariety of dim 4
julia> h = gens(P4)[1]
h
julia> F = abstract_bundle(P4, 2, 10*h^2 + 5*h + 1) # Horrocks-Mumford bundle
AbstractBundle of rank 2 on AbstractVariety of dim 4
julia> c1 = chern_class(F, 1)
5*h
julia> Fd = dual(F)
AbstractBundle of rank 2 on AbstractVariety of dim 4
julia> chern_class(Fd, 1)
-5*h
julia> F == Fd*OO(P4, 5) # self-duality up to twist
true
This function is part of the experimental code in Oscar. Please read here for more details.
det — Method
det(F::AbstractBundle)Return the determinant bundle of F.
Examples
julia> P3 = abstract_projective_space(3)
AbstractVariety of dim 3
julia> T = tangent_bundle(P3)
AbstractBundle of rank 3 on AbstractVariety of dim 3
julia> chern_class(T, 1)
4*h
julia> det(T) == OO(P3, 4)
true
This function is part of the experimental code in Oscar. Please read here for more details.
exterior_power — Method
exterior_power(F::AbstractBundle, k::Int)Return the k-th exterior power of F.
This function is part of the experimental code in Oscar. Please read here for more details.
symmetric_power — Method
symmetric_power(F::AbstractBundle, k::Int)
symmetric_power(F::AbstractBundle, k::RingElement)Return the k-th symmetric power of F. Here, k can contain parameters.
This function is part of the experimental code in Oscar. Please read here for more details.
pullback — Method
pullback(f::AbstractVarietyMap, F::AbstractBundle)Return the pullback of F via f.
Examples
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> i = map(P2, P5, [2*h])
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 5
julia> E = pullback(i, OO(P5,1))
AbstractBundle of rank 1 on AbstractVariety of dim 2
julia> total_chern_class(E)
2*h + 1
This function is part of the experimental code in Oscar. Please read here for more details.
pushforward — Method
pushforward(f::AbstractVarietyMap, F::AbstractBundle)Return the pushforward of F via f, that is, return the alternating sum of all direct images of F via f.
Examples
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> f = map(P2, P5, [2*h])
AbstractVarietyMap from AbstractVariety of dim 2 to AbstractVariety of dim 5
julia> F = OO(P2,1)
AbstractBundle of rank 1 on AbstractVariety of dim 2
julia> c = pushforward(f, chern_character(F) * todd_class(f))
7*H^5 - 7*H^4 + 4*H^3
julia> chern_character(pushforward(f, F)) == c # Grothendieck-Riemann-Roch
true
This function is part of the experimental code in Oscar. Please read here for more details.
Tests on abstract bundles
== — Method
==(F::AbstractBundle, G::AbstractBundle)Return true if F is equal to G, and false otherwise. This means that the underlying varieties of F and G are the same, and that the Chern characters of F and G are equal.
Examples
julia> P2 = abstract_projective_space(2)
AbstractVariety of dim 2
julia> 3*OO(P2, 1) - OO(P2) == tangent_bundle(P2) # Euler sequence
true
This function is part of the experimental code in Oscar. Please read here for more details.