From d7513d47b84c76fa64cbb48430ca73d05d9fead0 Mon Sep 17 00:00:00 2001 From: Wolfram Decker Date: Thu, 8 Aug 2024 17:17:50 +0200 Subject: [PATCH] =?UTF-8?q?Intersection=20theory:=20Correct=20one=20method?= =?UTF-8?q?=20for=20the=20function=20`abstract=5Ffl=E2=80=A6=20(#3998)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Intersection theory: Correct one method for the function `abstract_flag_variety` and rename this method to function `abstract_flag_bundle` --- docs/oscar_references.bib | 10 ++ .../docs/src/AbstractVarieties.md | 2 +- .../IntersectionTheory/docs/src/intro.md | 4 + .../src/IntersectionTheory.jl | 2 + experimental/IntersectionTheory/src/Main.jl | 138 ++++++++++++++---- .../IntersectionTheory/test/runtests.jl | 2 +- 6 files changed, 130 insertions(+), 28 deletions(-) diff --git a/docs/oscar_references.bib b/docs/oscar_references.bib index e7963429c25b..33f92984417e 100644 --- a/docs/oscar_references.bib +++ b/docs/oscar_references.bib @@ -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}, diff --git a/experimental/IntersectionTheory/docs/src/AbstractVarieties.md b/experimental/IntersectionTheory/docs/src/AbstractVarieties.md index 44ae019d9077..2dd4fd09f43d 100644 --- a/experimental/IntersectionTheory/docs/src/AbstractVarieties.md +++ b/experimental/IntersectionTheory/docs/src/AbstractVarieties.md @@ -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 diff --git a/experimental/IntersectionTheory/docs/src/intro.md b/experimental/IntersectionTheory/docs/src/intro.md index 11238f0b7e77..c8500db1be2d 100644 --- a/experimental/IntersectionTheory/docs/src/intro.md +++ b/experimental/IntersectionTheory/docs/src/intro.md @@ -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: diff --git a/experimental/IntersectionTheory/src/IntersectionTheory.jl b/experimental/IntersectionTheory/src/IntersectionTheory.jl index 46f1d6f00191..30c8c7b3c82c 100644 --- a/experimental/IntersectionTheory/src/IntersectionTheory.jl +++ b/experimental/IntersectionTheory/src/IntersectionTheory.jl @@ -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 @@ -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 diff --git a/experimental/IntersectionTheory/src/Main.jl b/experimental/IntersectionTheory/src/Main.jl index c5cab67bde15..18a359296a59 100644 --- a/experimental/IntersectionTheory/src/Main.jl +++ b/experimental/IntersectionTheory/src/Main.jl @@ -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) @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 pˣ = Fl.(gens(R1)[n+1:end]) pₓ = x -> (@warn("possibly wrong ans"); X(pfwd(div(simplify(x).f, simplify(section).f)))) @@ -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 diff --git a/experimental/IntersectionTheory/test/runtests.jl b/experimental/IntersectionTheory/test/runtests.jl index 5df0957f58a4..ff765291ac6a 100644 --- a/experimental/IntersectionTheory/test/runtests.jl +++ b/experimental/IntersectionTheory/test/runtests.jl @@ -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