-
Notifications
You must be signed in to change notification settings - Fork 132
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Intersection theory: Schubert calculus
- Loading branch information
Showing
6 changed files
with
187 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
```@meta | ||
CurrentModule = Oscar | ||
``` | ||
|
||
# Schubert Calculus | ||
|
||
To recall the definition of Schubert cycles on a Grassmannian $\mathrm{G}(k,n)$, we think of $\mathrm{G}(k, n)$ as the | ||
Grassmannian $\mathrm{G}(k, W)$ of $k$-dimensional subspaces of an $n$-dimensional vector space $W$. | ||
|
||
A *flag* in $W$ is a strictly increasing sequence of linear subspaces | ||
|
||
$\{0\} \subset W_1 \subset \dots \subset W_{n-1} \subset W_n = W, \; \text{ with }\; \dim(W_i) = i.$ | ||
|
||
Let such a flag $\mathcal{W}$ be given. For any sequence $a = (a_1, \ldots, a_k)$ | ||
of integers with $n-k \geq a_1 \geq \ldots \geq a_k \geq 0$, we define | ||
the *Schubert cycle* $\Sigma_a(\mathcal{W})$ by setting | ||
|
||
$\Sigma_a(\mathcal{W}):= \{ V \in \mathrm{G}(k, W)\mid \dim(W_{n-k+i-a_i} \cap V) \geq i, i = 1, \ldots, k \} \,.$ | ||
|
||
Then we have: | ||
- The Schubert cycle $\Sigma_a(\mathcal{W})$ is an irreducible subvariety of $\mathrm{G}(k, W)$ of codimension $|a| = \sum a_i$. | ||
- Its cycle class $[\Sigma_a(\mathcal{W})]$ does not depend on the choice of the flag. | ||
|
||
We define the *Schubert class* of $a = (a_1, \ldots, a_k)$ to be the cycle class | ||
|
||
$\sigma_a := [\Sigma_a(\mathcal{W})] \,.$ | ||
|
||
The number of Schubert classes on the Grassmannian $\mathrm{G}(k, n)$ is equal to $\binom{n}{k}$. | ||
|
||
Instead of $\sigma_a$, we write $\sigma_{a_1,\ldots,a_s}$ whenever | ||
$a = (a_1, \ldots, a_s, 0, \ldots, 0)$, and $\sigma_{p^i}$ whenever | ||
$a = (p, \ldots, p, 0, \ldots, 0) \in \mathbb Z^i \times \{0\}^{k-i}$. | ||
|
||
We discuss how the cycle classes $\sigma_{1^i}$, $i = 1, \ldots, k$, and $\sigma_i$, $i = 1, \ldots, n-k$, are related to the Chern classes of the tautological vector bundles on $\mathrm{G}(k, W)$. Recall: | ||
|
||
- The *tautological subbundle* on $\mathrm{G}(k, W)$ is the vector bundle of rank $k$ whose fiber at $V \in \mathrm{G}(k, W)$ is the subspace $V \subset W$. | ||
- The *tautological quotient bundle* on $\mathrm{G}(k, W)$ is the vector bundle of rank $(n-k)$ whose fiber at $V \in \mathrm{G}(k, W)$ is the quotient vector space $W/V$. | ||
|
||
We denote these vector bundles by $S$ and $Q$, respectively. | ||
|
||
The Chern classes of $S$ and $Q$ are | ||
|
||
$c_i(S) = (-1)^i \sigma_{1^i} \; \text{ for } \; i = 1, \ldots, k$ | ||
|
||
and | ||
|
||
$c_i(Q) = \sigma_i \; \text{ for }\; i = 1, \ldots, n-k,$ | ||
|
||
respectively. | ||
|
||
```@docs | ||
schubert_class(G::AbstractVariety, λ::Int...) | ||
``` | ||
|
||
```@docs | ||
schubert_classes(G::AbstractVariety, m::Int) | ||
``` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
@doc raw""" | ||
schubert_class(G::AbstractVariety, λ::Int...) | ||
schubert_class(G::AbstractVariety, λ::Vector{Int}) | ||
schubert_class(G::AbstractVariety, λ::Partition) | ||
Return the Schubert class $\sigma_\lambda$ on a (relative) Grassmannian `G`. | ||
# Examples | ||
```jldoctest | ||
julia> G = abstract_grassmannian(2,4) | ||
AbstractVariety of dim 4 | ||
julia> s0 = schubert_class(G, 0) | ||
1 | ||
julia> s1 = schubert_class(G, 1) | ||
-c[1] | ||
julia> s2 = schubert_class(G, 2) | ||
c[1]^2 - c[2] | ||
julia> s11 = schubert_class(G, [1, 1]) | ||
c[2] | ||
julia> s21 = schubert_class(G, [2, 1]) | ||
-c[1]*c[2] | ||
julia> s22 = schubert_class(G, [2, 2]) | ||
c[2]^2 | ||
julia> s1*s1 == s2+s11 | ||
true | ||
julia> s1*s2 == s1*s11 == s21 | ||
true | ||
julia> s1*s21 == s2*s2 == s22 | ||
true | ||
``` | ||
```jldoctest | ||
julia> G = abstract_grassmannian(2,5) | ||
AbstractVariety of dim 6 | ||
julia> s3 = schubert_class(G, 5-2) | ||
-c[1]^3 + 2*c[1]*c[2] | ||
julia> s3^2 == point_class(G) | ||
true | ||
julia> Q = tautological_bundles(G)[2] | ||
AbstractBundle of rank 3 on AbstractVariety of dim 6 | ||
julia> chern_class(Q, 3) | ||
-c[1]^3 + 2*c[1]*c[2] | ||
``` | ||
```jldoctest | ||
julia> G = abstract_grassmannian(2,4) | ||
AbstractVariety of dim 4 | ||
julia> s1 = schubert_class(G, 1) | ||
-c[1] | ||
julia> s1 == schubert_class(G, [1, 0]) | ||
true | ||
julia> integral(s1^4) | ||
2 | ||
``` | ||
""" | ||
function schubert_class(G::AbstractVariety, λ::Int...) schubert_class(G, collect(λ)) end | ||
function schubert_class(G::AbstractVariety, λ::Partition) schubert_class(G, Vector(λ)) end | ||
function schubert_class(G::AbstractVariety, λ::Vector{Int}) | ||
get_attribute(G, :grassmannian) === nothing && error("the abstract_variety is not a Grassmannian") | ||
(length(λ) > rank(G.bundles[1]) || sort(λ, rev=true) != λ) && error("the Schubert input is not well-formed") | ||
giambelli(G.bundles[2], λ) | ||
end | ||
|
||
@doc raw""" | ||
schubert_classes(G::AbstractVariety, m::Int) | ||
Return all the Schubert classes in codimension `m` on a (relative) Grassmannian `G`. | ||
""" | ||
function schubert_classes(G::AbstractVariety, m::Int) | ||
get_attribute(G, :grassmannian) === nothing && error("the abstract_variety is not a Grassmannian") | ||
S, Q = G.bundles | ||
res = elem_type(G.ring)[] | ||
for i in 0:rank(S) | ||
append!(res, [schubert_class(G, l) for l in partitions(m, i, 1, rank(Q))]) | ||
end | ||
return res | ||
end |