Skip to content

Commit 551320c

Browse files
author
Release Manager
committed
gh-39632: Implement matrix Schubert variety ideals <!-- ^ Please provide a concise and informative title. --> <!-- ^ Don't put issue numbers in the title, do this in the PR description below. --> <!-- ^ For example, instead of "Fixes #12345" use "Introduce new method to calculate 1 + 2". --> <!-- v Describe your changes below in detail. --> <!-- v Why is this change required? What problem does it solve? --> <!-- v If this PR resolves an open issue, please link to it here. For example, "Fixes #12345". --> We provide an implementation that returns the defining ideal of the matrix Schubert variety corresponding to the permutation `w` using the Fulton generators for the ideal. ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> - [x] The title is concise and informative. - [x] The description explains in detail what this PR is about. - [x] I have linked a relevant issue or discussion. - [x] I have created tests covering the changes. - [x] I have updated the documentation and checked the documentation preview. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on. For example, --> <!-- - #12345: short description why this is a dependency --> <!-- - #34567: ... --> URL: #39632 Reported by: Travis Scrimshaw Reviewer(s): Frédéric Chapoton, Travis Scrimshaw
2 parents 2a42a6d + dfafe77 commit 551320c

File tree

3 files changed

+133
-9
lines changed

3 files changed

+133
-9
lines changed

src/doc/en/reference/references/index.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2812,7 +2812,10 @@ REFERENCES:
28122812
.. [Ful1989] \W. Fulton. Algebraic curves: an introduction to algebraic geometry. Addison-Wesley,
28132813
Redwood City CA (1989).
28142814
2815-
.. [Ful1993] Wiliam Fulton, *Introduction to Toric Varieties*,
2815+
.. [Ful1992] William Fulton. *Flags, Schubert polynomials, degeneracy loci, and
2816+
determinantal formulas*. Duke Math. J. **65** (1992), no. 3, 381-420.
2817+
2818+
.. [Ful1993] William Fulton, *Introduction to Toric Varieties*,
28162819
Princeton University Press, 1993.
28172820
28182821
.. [Ful1997] William Fulton,

src/sage/combinat/diagram.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from sage.combinat.skew_partition import SkewPartition
3333
from sage.combinat.skew_tableau import SkewTableaux
3434
from sage.combinat.tableau import Tableau
35+
from sage.misc.cachefunc import cached_method
3536
from sage.misc.inherit_comparison import InheritComparisonClasscallMetaclass
3637
from sage.misc.lazy_import import lazy_import
3738
from sage.structure.element import Matrix
@@ -534,6 +535,28 @@ def specht_module_dimension(self, base_ring=None):
534535
from sage.combinat.specht_module import specht_module_rank
535536
return specht_module_rank(self, base_ring)
536537

538+
@cached_method
539+
def essential_set(self):
540+
r"""
541+
Return the essential set of ``self`` as defined by Fulton.
542+
543+
Let `D` be a diagram. Then the *essential set* of `D` are the
544+
cells `(i, j) \in D` such that `(i+1, j) \notin D` and
545+
`(i, j+1) \notin D`; that is, the maximally southwest elements
546+
in each connected component of `D`.
547+
548+
EXAMPLES::
549+
550+
sage: w = Permutation([2, 1, 5, 4, 3])
551+
sage: D = w.rothe_diagram()
552+
sage: D.essential_set()
553+
((0, 0), (2, 3), (3, 2))
554+
"""
555+
ret = [c for c in self._cells if (c[0]+1, c[1]) not in self._cells
556+
and (c[0], c[1]+1) not in self._cells]
557+
ret.sort()
558+
return tuple(ret)
559+
537560

538561
class Diagrams(UniqueRepresentation, Parent):
539562
r"""

src/sage/combinat/permutation.py

Lines changed: 106 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3158,6 +3158,24 @@ def reduced_word_lexmin(self) -> list[int]:
31583158

31593159
return rw
31603160

3161+
def number_of_reduced_words(self):
3162+
r"""
3163+
Return the number of reduced words of ``self`` without explicitly
3164+
computing them all.
3165+
3166+
EXAMPLES::
3167+
3168+
sage: p = Permutation([6,4,2,5,1,8,3,7])
3169+
sage: len(p.reduced_words()) == p.number_of_reduced_words() # needs sage.combinat
3170+
True
3171+
"""
3172+
Tx = self.rothe_diagram().peelable_tableaux()
3173+
return sum(map(_tableau_contribution, Tx))
3174+
3175+
##################
3176+
# Rothe diagrams #
3177+
##################
3178+
31613179
def rothe_diagram(self):
31623180
r"""
31633181
Return the Rothe diagram of ``self``.
@@ -3176,20 +3194,100 @@ def rothe_diagram(self):
31763194
from sage.combinat.diagram import RotheDiagram
31773195
return RotheDiagram(self)
31783196

3179-
def number_of_reduced_words(self):
3197+
def rank_matrix(self):
31803198
r"""
3181-
Return the number of reduced words of ``self`` without explicitly
3182-
computing them all.
3199+
Return the rank matrix of ``self``.
3200+
3201+
Let `P = [P_{ij}]_{i, j=1}^n` be the permutation matrix of `w \in S_n`.
3202+
The rank matrix is the `n \times n` matrix with entries
3203+
3204+
.. MATH::
3205+
3206+
r_w(i, j) = \sum_{a=1}^i \sum_{b=1}^j P_{ij}.
31833207
31843208
EXAMPLES::
31853209
3186-
sage: p = Permutation([6,4,2,5,1,8,3,7])
3187-
sage: len(p.reduced_words()) == p.number_of_reduced_words() # needs sage.combinat
3188-
True
3210+
sage: w = Permutation([2, 1, 5, 4, 3])
3211+
sage: w.to_matrix()
3212+
[0 1 0 0 0]
3213+
[1 0 0 0 0]
3214+
[0 0 0 0 1]
3215+
[0 0 0 1 0]
3216+
[0 0 1 0 0]
3217+
sage: w.rank_matrix()
3218+
[0 1 1 1 1]
3219+
[1 2 2 2 2]
3220+
[1 2 2 2 3]
3221+
[1 2 2 3 4]
3222+
[1 2 3 4 5]
31893223
"""
3190-
Tx = self.rothe_diagram().peelable_tableaux()
3224+
ret = self.to_matrix()
3225+
n = ret.nrows()
3226+
for j in range(1, n):
3227+
ret[0, j] += ret[0, j-1]
3228+
for i in range(1, n):
3229+
ret[i, 0] += ret[i-1, 0]
3230+
for j in range(1, n):
3231+
# Compute by inclusion-exclusion
3232+
ret[i, j] += ret[i-1, j] + ret[i, j-1] - ret[i-1, j-1]
3233+
return ret
31913234

3192-
return sum(map(_tableau_contribution, Tx))
3235+
def schubert_determinant_ideal(self):
3236+
r"""
3237+
Return the Schubert determinant ideal of ``self``.
3238+
3239+
From Lemma 3.10 [Ful1992]_, the matrix Schubert variety of
3240+
a permutation `w \in S_n` is defined by the ideal
3241+
3242+
.. MATH::
3243+
3244+
I_w = \sum_{(i, j)} I_{r_w(i, j)+1}(i, j),
3245+
3246+
where the sum is over the :meth:`essential set
3247+
<sage.combinat.diagram.Diagram.essential_set>`, `[r_w(i, j)]_{i, j}`
3248+
is the :meth:`rank_matrix` of `w`, and `I_k(i, j)` is the ideal
3249+
generated by the `k \times k` minors of the `i \times j`
3250+
matrix `[z_{ab}]_{a, b}`.
3251+
3252+
These ideals are known to be prime of codimension equal to `\ell(w)`
3253+
(the length of `w`) such that `R / I_w` is Cohen-Macaulay, where `R`
3254+
is the polynomial ring `\QQ[z_{ab} | 1 \leq a, b \leq n]` from
3255+
Prop. 3.10 of [Ful1992]_.
3256+
3257+
EXAMPLES::
3258+
3259+
sage: w = Permutation([3, 1, 4, 2])
3260+
sage: Iw = w.schubert_determinant_ideal()
3261+
sage: Iw.gens()
3262+
[z00, z01, -z01*z10 + z00*z11, -z01*z20 + z00*z21, -z11*z20 + z10*z21]
3263+
sage: Iw.dimension()
3264+
13
3265+
sage: Iw.dimension() + w.length()
3266+
16
3267+
sage: Iw.is_prime()
3268+
True
3269+
3270+
sage: w = Permutation([2, 1, 5, 4, 3])
3271+
sage: Iw = w.schubert_determinant_ideal()
3272+
sage: Iw.dimension()
3273+
21
3274+
sage: w.length() + Iw.dimension()
3275+
25
3276+
sage: Iw.is_prime()
3277+
True
3278+
"""
3279+
from sage.rings.rational_field import QQ
3280+
from sage.matrix.constructor import matrix
3281+
n = len(self)
3282+
PR = PolynomialRing(QQ, n, var_array='z')
3283+
z = PR.gens()
3284+
Z = matrix(PR, [[z[r*n+c] for c in range(n)] for r in range(n)])
3285+
rk = self.rank_matrix()
3286+
gens = []
3287+
for i, j in self.rothe_diagram().essential_set():
3288+
# we apply the transpose to the rank matrix to match conventions
3289+
gens.extend(Z.submatrix(0, 0, i+1, j+1).minors(rk[j, i] + 1))
3290+
return PR.ideal(gens)
31933291

31943292
################
31953293
# Fixed Points #

0 commit comments

Comments
 (0)