Skip to content

Commit

Permalink
Intersection theory: Correct one method for the function `abstract_fl… (
Browse files Browse the repository at this point in the history
oscar-system#3998)

* Intersection theory: Correct one method for the function `abstract_flag_variety` and rename this method to function `abstract_flag_bundle`
  • Loading branch information
wdecker authored Aug 8, 2024
1 parent c0f6e7f commit d7513d4
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 28 deletions.
10 changes: 10 additions & 0 deletions docs/oscar_references.bib
Original file line number Diff line number Diff line change
Expand Up @@ -1092,6 +1092,16 @@ @Article{GS79
doi = {10.1016/0166-218X(79)90004-0}
}

@Misc{GSS22,
author = {Daniel R. Grayson and Alexandra Seceleanu and Michael E. Stillman},
title = {Computations in intersection rings of flag bundles},
year = {2022},
url = {https://arxiv.org/abs/1205.4190},
eprint = {1205.4190},
archiveprefix = {arXiv},
primaryclass = {math.AG}
}

@InCollection{GTZ88,
author = {Gianni, Patrizia and Trager, Barry and Zacharias, Gail},
title = {Gröbner bases and primary decomposition of polynomial ideals},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ abstract_hirzebruch_surface(n::Int)
```

```@docs
abstract_flag_variety(F::AbstractBundle, dims::Int...; symbol::String = "c")
abstract_flag_bundle(F::AbstractBundle, dims::Int...; symbol::String = "c")
```

```@docs
Expand Down
4 changes: 4 additions & 0 deletions experimental/IntersectionTheory/docs/src/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ General textbooks offering details on theory and algorithms include:
- [EH16](@cite)
- [Ful98](@cite)

For computations in the Chow rings of abstract flag bundles see
- [GSS22](@cite).


## Contact

Please direct questions about this part of OSCAR to the following people:
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 @@ -11,6 +11,7 @@ import ..Oscar: trivial_line_bundle

export a_hat_genus
export abstract_bundle
export abstract_flag_bundle
export abstract_flag_variety
export abstract_grassmannian
export abstract_hirzebruch_surface
Expand Down Expand Up @@ -89,6 +90,7 @@ using .IntersectionTheory

export a_hat_genus
export abstract_bundle
export abstract_flag_bundle
export abstract_flag_variety
export abstract_grassmannian
export abstract_hirzebruch_surface
Expand Down
138 changes: 112 additions & 26 deletions experimental/IntersectionTheory/src/Main.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1816,6 +1816,39 @@ AbstractVariety of dim 2
julia> degree(Z)
4
```
```jldoctest
julia> P = abstract_projective_space(4, symbol = "H")
AbstractVariety of dim 4
julia> F = exterior_power(cotangent_bundle(P), 3)*OO(P,3)
AbstractBundle of rank 4 on AbstractVariety of dim 4
julia> G = OO(P, 1)+4*OO(P)
AbstractBundle of rank 5 on AbstractVariety of dim 4
julia> Z = degeneracy_locus(F, G, 3) # rational surface in P4
AbstractVariety of dim 2
julia> K = canonical_class(Z)
z - H
julia> integral(K^2)
-7
julia> H = hyperplane_class(Z)
H
julia> integral(H^2) # degree of surface
8
julia> A = K+H
z
julia> integral(A^2) # degree of first adjoint surface which is a Del Pezzo surface in P5
5
```
"""
function degeneracy_locus(F::AbstractBundle, G::AbstractBundle, k::Int; class::Bool=false)
Expand All @@ -1830,12 +1863,12 @@ function degeneracy_locus(F::AbstractBundle, G::AbstractBundle, k::Int; class::B
return F.parent.ring(0)
end
end
Gr = (m-k == 1) ? abstract_projective_bundle(F) : abstract_flag_variety(F, m-k)
Gr = (m-k == 1) ? abstract_projective_bundle(F) : abstract_flag_bundle(F, m-k)
S = Gr.bundles[1]
D = zero_locus_section(dual(S) * G)
D.struct_map = hom(D, F.parent) # skip the flag abstract_variety
if isdefined(F.parent, :O1)
D.O1 = pullback(D.struct_map, F.parent.O1) #TOCHECK other fields of D
D.O1 = pullback(D.struct_map, F.parent.O1)
end
set_attribute!(D, :description, "Degeneracy locus of rank $k from $F to $G")
return D
Expand Down Expand Up @@ -1961,6 +1994,12 @@ Quotient
h -> [1]
by ideal (h^3, z^2 + 3*z*h + 3*h^2)
julia> gens(PT)[1]
z
julia> gens(PT)[1] == hyperplane_class(PT)
true
julia> [chern_class(T, i) for i = 1:2]
2-element Vector{MPolyQuoRingElem{MPolyDecRingElem{QQFieldElem, QQMPolyRingElem}}}:
3*h
Expand Down Expand Up @@ -2007,7 +2046,7 @@ function abstract_projective_bundle(F::AbstractBundle; symbol::String = "z")
pback = hom(PR, R1, gens(R1)[2:end])
pfwd = hom(R1, R, pushfirst!(gens(R), R()))

# construct the ideal
# construct the relations

rels = [sum(pback(chern_class(F, i).f) * z^(r-i) for i in 0:r)]
if R isa MPolyQuoRing
Expand Down Expand Up @@ -2134,9 +2173,9 @@ end
abstract_flag_variety(dims::Int...; base::Ring = QQ, symbol::String = "c")
abstract_flag_variety(dims::Vector{Int}; base::Ring = QQ, symbol::String = "c")
Given integers, say, $d_1, \dots, d_{k}, n$ or a vector of such integers, return the abstract
flag variety $\mathrm{F}(d_1, \dots, d_{k}; n)$ of nested sequences of subspaces of dimensions
$d_1; \dots, d_{k}$ of an $n$-dimensional vector space.
Given integers, say, $d_1, \dots, d_{k}, n$ with $0 < d_1 < \dots < d_{k} < n$ or a vector of such integers,
return the abstract flag variety $\mathrm{F}(d_1, \dots, d_{k}; n)$ of nested sequences of subspaces of
dimensions $d_1, \dots, d_{k}$ of an $n$-dimensional vector space.
# Examples
```jldoctest
Expand Down Expand Up @@ -2204,21 +2243,63 @@ function abs_flag(dims::Vector{Int}; base::Ring=QQ, symbol::String="c")
end

@doc raw"""
abstract_flag_variety(F::AbstractBundle, dims::Int...; symbol::String = "c")
abstract_flag_variety(F::AbstractBundle, dims::Vector{Int}; symbol::String = "c")
abstract_flag_bundle(F::AbstractBundle, dims::Int...; symbol::String = "c")
abstract_flag_bundle(F::AbstractBundle, dims::Vector{Int}; symbol::String = "c")
Given integers, say, $d_1, \dots, d_{k}, n$ with $0 < d_1 < \dots < d_{k} < n$ or a vector of such integers,
and given an abstract bundle $F$ of rank $n$, return the abstract flag bundle of nested sequences
of subspaces of dimensions $d_1, \dots, d_{k}$ in the fibers of $F$.
!!! note
Entering the number $n$ can be omitted since this number can be recovered as the rank of $F$.
# Examples
```jldoctest
julia> P = abstract_projective_space(4)
AbstractVariety of dim 4
julia> F = exterior_power(cotangent_bundle(P), 3)*OO(P,3)
AbstractBundle of rank 4 on AbstractVariety of dim 4
julia> FB = abstract_flag_bundle(F, 1, 3)
AbstractVariety of dim 9
julia> CR = chow_ring(FB)
Quotient
of multivariate polynomial ring in 5 variables over QQ graded by
c[1, 1] -> [1]
c[2, 1] -> [1]
c[2, 2] -> [2]
c[3, 1] -> [1]
h -> [1]
by ideal with 5 generators
julia> modulus(CR)
Ideal generated by
h^5
-c[1, 1]*c[2, 2]*c[3, 1] + h^4
-c[1, 1]*c[2, 1]*c[3, 1] - c[1, 1]*c[2, 2] - c[2, 2]*c[3, 1] - 2*h^3
-c[1, 1]*c[2, 1] - c[1, 1]*c[3, 1] - c[2, 1]*c[3, 1] - c[2, 2] + 4*h^2
-c[1, 1] - c[2, 1] - c[3, 1] - 3*h
julia> FB.bundles
3-element Vector{AbstractBundle}:
AbstractBundle of rank 1 on AbstractVariety of dim 9
AbstractBundle of rank 2 on AbstractVariety of dim 9
AbstractBundle of rank 1 on AbstractVariety of dim 9
Given integers, say, $d_1, \dots, d_{k}$ or a vector of such integers, and given an
abstract bundle $F$, return the abstract flag variety (flag bundle) of nested sequences
of subspaces of dimensions $d_1; \dots, d_{k}$ in the fibers of $F$.
```
"""
function abstract_flag_variety(F::AbstractBundle, dims::Int...; symbol::String = "c")
abstract_flag_variety(F, collect(dims), symbol=symbol)
function abstract_flag_bundle(F::AbstractBundle, dims::Int...; symbol::String = "c")
abstract_flag_bundle(F, collect(dims), symbol=symbol)
end

function abstract_flag_variety(F::AbstractBundle, dims::Vector{Int}; symbol::String="c")
function abstract_flag_bundle(F::AbstractBundle, dims::Vector{Int}; symbol::String = "c")
X, n = F.parent, F.rank
!(n isa Int) && error("expect rank to be an integer")
# compute the ranks and relative dim

# compute the ranks of successive subqotients and the relative dimension

l = length(dims)
ranks = pushfirst!([dims[i+1]-dims[i] for i in 1:l-1], dims[1])
@assert all(r->r>0, ranks) && dims[end] <= n
Expand All @@ -2228,40 +2309,43 @@ function abstract_flag_variety(F::AbstractBundle, dims::Vector{Int}; symbol::Str
l += 1
end
d = sum(ranks[i] * sum(dims[end]-dims[i]) for i in 1:l-1)
# FIXME ordering

# construct the ring

R = X.ring
if R isa MPolyQuoRing
PR = base_ring(R)
else
PR = R
end
# syms = vcat([_parse_symbol(symbol, i, 1:r) for (i,r) in enumerate(ranks)]..., string.(gens(R.R)))
syms = vcat([_parse_symbol(symbol, i, 1:r) for (i,r) in enumerate(ranks)]..., string.(gens(PR)))
# ord = prod(ordering_dp(r) for r in ranks) * ordering(X.ring.R.R)
w = vcat([collect(1:r) for r in ranks]..., gradings(R))
R1 = graded_polynomial_ring(X.base, syms, w)[1]
pback = hom(R, R1, gens(R1)[n+1:end]) # FIXME should always be well-defined
pback = hom(PR, R1, gens(R1)[n+1:end])
pfwd = hom(R1, R, vcat(repeat([R()], n), gens(R)))

# compute the relations

c = pushfirst!([1+sum(gens(R1)[dims[i]+1:dims[i+1]]) for i in 1:l-1], 1+sum(gens(R1)[1:dims[1]]))
# XXX cannot mod using graded ring element
Rx, x = R1.R["x"]
fi = pback(total_chern_class(F))[0:n]
Rx, x = R1["x"]
fi = pback(total_chern_class(F).f)[0:n]
f = sum(fi[i+1].f * x^(n-i) for i in 0:n)
gi = prod(c)[0:n]
g = sum(gi[i+1].f * x^(n-i) for i in 0:n)
rels = [R1(coeff(mod(f, g), i)) for i in 0:n-1]
if R isa MPolyQuoRing rels = vcat(pback.(R.(gens(R.I))), rels) end
if R isa MPolyQuoRing
rels = vcat(pback.(gens(R.I)), rels)
end
AFl = quo(R1, ideal(rels))[1]
c = AFl.(c)
Fl = AbstractVariety(X.dim + d, AFl)

# construct the abstract_variety

Fl = AbstractVariety(X.dim + d, AFl)
Fl.bundles = [AbstractBundle(Fl, r, ci) for (r,ci) in zip(ranks, c)]
section = prod(top_chern_class(E)^sum(dims[i]) for (i, E) in enumerate(Fl.bundles[2:end]))
if isdefined(X, :point)
Fl.point = pback(X.point) * section
Fl.point = pback(X.point.f) * section
end
= Fl.(gens(R1)[n+1:end])
pₓ = x -> (@warn("possibly wrong ans"); X(pfwd(div(simplify(x).f, simplify(section).f))))
Expand All @@ -2276,6 +2360,8 @@ function abstract_flag_variety(F::AbstractBundle, dims::Vector{Int}; symbol::Str
Fl.struct_map = p
set_attribute!(Fl, :description => "Relative flag abstract_variety Flag$(tuple(dims...)) for $F")
set_attribute!(Fl, :section => section)
if l == 2 set_attribute!(Fl, :grassmannian => :relative) end
if l == 2
set_attribute!(Fl, :grassmannian => :relative)
end
return Fl
end
2 changes: 1 addition & 1 deletion experimental/IntersectionTheory/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ let pushforward = IntersectionTheory.pushforward

# flag bundle
X, (F,) = abstract_variety(2, [4=>"c"])
FlF = abstract_flag_variety(F, 2)
FlF = abstract_flag_bundle(F, 2)
@test dim(FlF) == 6
@test rank.(tautological_bundles(FlF)) == [2, 2]
p = FlF.struct_map
Expand Down

0 comments on commit d7513d4

Please sign in to comment.