Skip to content

Commit

Permalink
Intersection theory: hyperplane classes
Browse files Browse the repository at this point in the history
  • Loading branch information
wdecker committed Jul 24, 2024
1 parent ed82b76 commit 20e526d
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 13 deletions.
5 changes: 5 additions & 0 deletions experimental/IntersectionTheory/docs/src/AbstractBundles.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ pontryagin_class(F::AbstractBundle, k::Int)
euler_characteristic(F::AbstractBundle)
```

```@docs
hilbert_polynomial(F::AbstractBundle)
```


## Operations on Abstract Bundles

```@docs
Expand Down
8 changes: 8 additions & 0 deletions experimental/IntersectionTheory/docs/src/AbstractVarieties.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ point_class(X::AbstractVariety)
tangent_bundle(X::AbstractVariety)
```

```@docs
hyperplane_class(X::AbstractVariety)
```

```@docs
tautological_bundles(X::AbstractVariety)
```
Expand Down Expand Up @@ -120,6 +124,10 @@ canonical_bundle(X::AbstractVariety)
degree(X::AbstractVariety)
```

```@docs
hilbert_polynomial(X::AbstractVariety)
```

```@docs
basis(X::AbstractVariety)
```
Expand Down
2 changes: 2 additions & 0 deletions experimental/IntersectionTheory/src/IntersectionTheory.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export dual_basis
export euler
export euler_pairing
export graph
export hyperplane_class
export intersection_matrix
export l_genus
export linear_subspaces_on_hypersurface
Expand Down Expand Up @@ -115,6 +116,7 @@ export dual_basis
export euler
export euler_pairing
export graph
export hyperplane_class
export intersection_matrix
export l_genus
export linear_subspaces_on_hypersurface
Expand Down
114 changes: 101 additions & 13 deletions experimental/IntersectionTheory/src/Main.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
abstract_bundle(X::AbstractVariety, ch::Union{MPolyDecRingElem, MPolyQuoRingElem})
abstract_bundle(X::AbstractVariety, r::RingElement, c::Union{MPolyDecRingElem, MPolyQuoRingElem})
Return a bundle on `X` by specifying its Chern character. Equivalently, specify its rank and
Return an abstract vector bundle on `X` by specifying its Chern character. Equivalently, specify its rank and
total Chern class.
# Examples
Expand Down Expand Up @@ -573,10 +573,57 @@ julia> integral(p)
"""
point_class(X::AbstractVariety) = X.point

@doc raw"""
hyperplane_class(X::AbstractVariety)
If defined, return the class of a hyperplane section of `X`.
!!! note
Speaking of a hyperplane class of `X` means that we have a specific embedding of `X` into projective space in mind.
For Grassmanians, for example, this embedding is the Plücker embedding. For the product of two abstract varieties with
given hyperplane classes, it is the Segre embedding.
# Examples
```jldoctest
julia> G = abstract_grassmannian(2, 5)
AbstractVariety of dim 6
julia> hyperplane_class(G)
-c[1]
julia> degree(G) == integral(hyperplane_class(G)^dim(G)) == 5
true
```
```jldoctest
julia> P1s = abstract_projective_space(1, symbol = "s")
AbstractVariety of dim 1
julia> P1t = abstract_projective_space(1, symbol = "t")
AbstractVariety of dim 1
julia> P = P1s*P2t
AbstractVariety of dim 2
julia> H = hyperplane_class(P)
s + t
julia> integral(H^dim(P))
2
```
"""
function hyperplane_class(X::AbstractVariety)
return(X.O1)
end


@doc raw"""
trivial_line_bundle(X::AbstractVariety)
Return the trivial line bundle $\mathcal O_X$ on `X`. Alternatively, use `OO`.
Return the trivial line bundle $\mathcal O_X$ on `X`. Alternatively, use `OO` Alternatively, use `OO` instead of `trivial_line_bundle`.
# Examples
```jldoctest
Expand Down Expand Up @@ -669,8 +716,8 @@ structure_map(X::AbstractVariety) = X.struct_map
line_bundle(X::AbstractVariety, D::MPolyDecRingElem)
Return the line bundle $\mathcal O_X(n)$ on `X` if `X` has been given a
polarization, or a line bundle $\mathcal O_X(D)$ with first Chern class $D$.
Alternatively, use `OO`.
hyperplane class, or a line bundle $\mathcal O_X(D)$ with first Chern class $D$.
Alternatively, use `OO` instead of `line_bundle`.
# Examples
```jldoctest
Expand All @@ -691,7 +738,7 @@ OO(X::AbstractVariety, D::MPolyDecRingElem) = line_bundle(X, D)
@doc raw"""
degree(X::AbstractVariety)
Compute the degree of `X` with respect to its polarization (if given).
If `X` has been given a hyperplane class, return the corresponding degree of `X`.
# Examples
```jldoctest
Expand Down Expand Up @@ -910,13 +957,34 @@ signature(X::AbstractVariety) = l_genus(X) # Hirzebruch signature theorem

@doc raw"""
hilbert_polynomial(F::AbstractBundle)
hilbert_polynomial(X::AbstractVariety)
Compute the Hilbert polynomial of a bundle $F$ or the Hilbert polynomial of `X`
itself, with respect to the polarization $\mathcal O_X(1)$ on `X`.
If an abstract vector bundle `F` on an abstract variety with a specified hyperplane class is given,
return the corresponding Hilbert polynomial of `F`.
# Examples
```jldoctest
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
```
"""
function hilbert_polynomial(F::AbstractBundle)
!isdefined(F.parent, :O1) && error("no polarization is specified for the abstract_variety")
!isdefined(F.parent, :O1) && error("no hyperplane class is specified for the abstract_variety")
X, O1 = F.parent, F.parent.O1
# extend the coefficient ring to QQ(t)
# TODO should we use FunctionField here?
Expand All @@ -935,6 +1003,25 @@ function hilbert_polynomial(F::AbstractBundle)
hilb = constant_coefficient(div(simplify(ch_F * ch_O_t * td).f, simplify(pt).f))
return hilb
end

@doc raw"""
hilbert_polynomial(X::AbstractVariety)
If `X` has been given a hyperplane class, return the corresponding Hilbert polynomial of `X`.
# Examples
```jldoctest
julia> P2 = abstract_projective_space(2)
AbstractVariety of dim 2
julia> hilbert_polynomial(P2) == hilbert_polynomial(OO(P2))
true
julia> hilbert_polynomial(P2)
1//2*t^2 + 3//2*t + 1
```
"""
hilbert_polynomial(X::AbstractVariety) = hilbert_polynomial(trivial_line_bundle(X))

# find canonically defined morphism from X to Y
Expand Down Expand Up @@ -974,9 +1061,10 @@ end
@doc raw"""
product(X::AbstractVariety, Y::AbstractVariety)
Return the product $X\times Y$. If both `X` and `Y` have a
polarization, $X\times Y$ will be endowed with the polarization of the Segre
embedding. Alternatively, use `*`.
Return the product $X\times Y$. Alternatively, use `*`.
!!!note
If both `X` and `Y` have a hyperplane class, $X\times Y$ will be endowed with the a hyperplane class correspondnng to the Segre embedding. Alternatively, use `*`.
```jldoctest
julia> P2 = abstract_projective_space(2);
Expand Down Expand Up @@ -1399,7 +1487,7 @@ end
@doc raw"""
dual_basis(X::AbstractVariety)
If `K = base(X)`, return a `K`-basis for the Chow ring of `X` which is dual to `basis(X)` with respect to the bilinear form defined by `intersection_matrix(X)`.
If `K = base(X)`, return a `K`-basis for the Chow ring of `X` which is dual to `basis(X)` with respect to the `K`-bilinear form defined by `intersection_matrix(X)`.
!!! note
The basis elements are ordered by decreasing degree (geometrically, by decreasing codimension).
Expand Down

0 comments on commit 20e526d

Please sign in to comment.