Skip to content

Commit 27dc76a

Browse files
author
Release Manager
committed
gh-36724: Compute dimensions of simple symmetric group modules over positive characteristic <!-- ^^^^^ Please provide a concise, informative and self-explanatory title. Don't put issue numbers in there, do this in the PR body below. For example, instead of "Fixes #1234" use "Introduce new method to calculate 1+1" --> <!-- Describe your changes here in detail --> We can compute Specht module dimensions, but an interesting open problem is to compute the dimensions of simple modules for `S_n` over fields of positive characteristic. We provide a way to compute dimensions by using the pullback of the polytabloid inner product and computing the rank of the Gram matrix. This is based off of code provided by Jackson Walters. We also implement a more efficient column stabilizer method for standard tableaux. <!-- Why is this change required? What problem does it solve? --> <!-- If this PR resolves an open issue, please link to it here. For example "Fixes #12345". --> <!-- If your change requires a documentation PR, please link it appropriately. --> ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> <!-- If your change requires a documentation PR, please link it appropriately --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> <!-- Feel free to remove irrelevant items. --> - [x] The title is concise, informative, and self-explanatory. - [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 accordingly. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on - #12345: short description why this is a dependency - #34567: ... --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> URL: #36724 Reported by: Travis Scrimshaw Reviewer(s): Frédéric Chapoton, Travis Scrimshaw
2 parents 5b1eea4 + 721b952 commit 27dc76a

File tree

4 files changed

+180
-2
lines changed

4 files changed

+180
-2
lines changed

src/sage/combinat/partition.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5518,7 +5518,7 @@ def specht_module_dimension(self, base_ring=None):
55185518
55195519
INPUT:
55205520
5521-
- ``BR`` -- (default: `\QQ`) the base ring
5521+
- ``base_ring`` -- (default: `\QQ`) the base ring
55225522
55235523
EXAMPLES::
55245524
@@ -5534,6 +5534,43 @@ def specht_module_dimension(self, base_ring=None):
55345534
from sage.combinat.specht_module import specht_module_rank
55355535
return specht_module_rank(self, base_ring)
55365536

5537+
def simple_module_dimension(self, base_ring=None):
5538+
r"""
5539+
Return the dimension of the simple module corresponding to ``self``.
5540+
5541+
When the base ring is a field of characteristic `0`, this is equal
5542+
to the dimension of the Specht module.
5543+
5544+
INPUT:
5545+
5546+
- ``base_ring`` -- (default: `\QQ`) the base ring
5547+
5548+
EXAMPLES::
5549+
5550+
sage: Partition([2,2,1]).simple_module_dimension()
5551+
5
5552+
sage: Partition([2,2,1]).specht_module_dimension(GF(3)) # optional - sage.rings.finite_rings
5553+
5
5554+
sage: Partition([2,2,1]).simple_module_dimension(GF(3)) # optional - sage.rings.finite_rings
5555+
4
5556+
5557+
sage: for la in Partitions(6, regular=3):
5558+
....: print(la, la.specht_module_dimension(), la.simple_module_dimension(GF(3)))
5559+
[6] 1 1
5560+
[5, 1] 5 4
5561+
[4, 2] 9 9
5562+
[4, 1, 1] 10 6
5563+
[3, 3] 5 1
5564+
[3, 2, 1] 16 4
5565+
[2, 2, 1, 1] 9 9
5566+
"""
5567+
from sage.categories.fields import Fields
5568+
if base_ring is None or (base_ring in Fields() and base_ring.characteristic() == 0):
5569+
from sage.combinat.tableau import StandardTableaux
5570+
return StandardTableaux(self).cardinality()
5571+
from sage.combinat.specht_module import simple_module_rank
5572+
return simple_module_rank(self, base_ring)
5573+
55375574

55385575
##############
55395576
# Partitions #

src/sage/combinat/specht_module.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,3 +457,111 @@ def specht_module_rank(D, base_ring=None):
457457
if base_ring is None:
458458
base_ring = QQ
459459
return matrix(base_ring, [v.to_vector() for v in span_set]).rank()
460+
461+
462+
def polytabloid(T):
463+
r"""
464+
Compute the polytabloid element associated to a tableau ``T``.
465+
466+
For a tableau `T`, the polytabloid associated to `T` is
467+
468+
.. MATH::
469+
470+
e_T = \sum_{\sigma \in C_T} (-1)^{\sigma} \{\sigma T\},
471+
472+
where `\{\}` is the row-equivalence class, i.e. a tabloid,
473+
and `C_T` is the column stabilizer of `T`. The sum takes place in
474+
the module spanned by tabloids `\{T\}`.
475+
476+
OUTPUT:
477+
478+
A ``dict`` whose keys are tabloids represented by tuples of frozensets
479+
and whose values are the coefficient.
480+
481+
EXAMPLES::
482+
483+
sage: from sage.combinat.specht_module import polytabloid
484+
sage: T = StandardTableau([[1,3,4],[2,5]])
485+
sage: polytabloid(T)
486+
{(frozenset({1, 3, 4}), frozenset({2, 5})): 1,
487+
(frozenset({1, 4, 5}), frozenset({2, 3})): -1,
488+
(frozenset({2, 3, 4}), frozenset({1, 5})): -1,
489+
(frozenset({2, 4, 5}), frozenset({1, 3})): 1}
490+
"""
491+
e_T = {}
492+
C_T = T.column_stabilizer()
493+
for perm in C_T:
494+
TT = tuple([frozenset(perm(val) for val in row) for row in T])
495+
if TT in e_T:
496+
e_T[TT] += perm.sign()
497+
else:
498+
e_T[TT] = perm.sign()
499+
return e_T
500+
501+
502+
def tabloid_gram_matrix(la, base_ring):
503+
r"""
504+
Compute the Gram matrix of the bilinear form of a Specht module
505+
pulled back from the tabloid module.
506+
507+
For the module spanned by all tabloids, we define an bilinear form
508+
by having the tabloids be an orthonormal basis. We then pull this
509+
bilinear form back across the natural injection of the Specht module
510+
into the tabloid module.
511+
512+
EXAMPLES::
513+
514+
sage: from sage.combinat.specht_module import tabloid_gram_matrix
515+
sage: tabloid_gram_matrix([3,2], GF(5))
516+
[4 2 2 1 4]
517+
[2 4 1 2 1]
518+
[2 1 4 2 1]
519+
[1 2 2 4 2]
520+
[4 1 1 2 4]
521+
"""
522+
from sage.combinat.tableau import StandardTableaux
523+
ST = StandardTableaux(la)
524+
525+
def bilinear_form(p1, p2):
526+
if len(p2) < len(p1):
527+
p1, p2 = p2, p1
528+
return sum(c1 * p2.get(T1, 0) for T1, c1 in p1.items() if c1)
529+
530+
gram_matrix = [[bilinear_form(polytabloid(T1), polytabloid(T2)) for T1 in ST] for T2 in ST]
531+
return matrix(base_ring, gram_matrix)
532+
533+
534+
def simple_module_rank(la, base_ring):
535+
r"""
536+
Return the rank of the simple `S_n`-module corresponding to the
537+
partition ``la`` of size `n` over ``base_ring``.
538+
539+
EXAMPLES::
540+
541+
sage: from sage.combinat.specht_module import simple_module_rank
542+
sage: simple_module_rank([3,2,1,1], GF(3))
543+
13
544+
545+
TESTS::
546+
547+
sage: from sage.combinat.specht_module import simple_module_rank
548+
sage: simple_module_rank([1,1,1,1], GF(3))
549+
Traceback (most recent call last):
550+
...
551+
ValueError: the partition [1, 1, 1, 1] is not 3-regular
552+
553+
sage: from sage.combinat.specht_module import simple_module_rank
554+
sage: simple_module_rank([2,1], GF(3)['x'])
555+
Traceback (most recent call last):
556+
...
557+
NotImplementedError: the base must be a field
558+
"""
559+
from sage.categories.fields import Fields
560+
from sage.combinat.partition import Partition
561+
if base_ring not in Fields():
562+
raise NotImplementedError("the base must be a field")
563+
p = base_ring.characteristic()
564+
la = Partition(la)
565+
if not la.is_regular(p):
566+
raise ValueError(f"the partition {la} is not {p}-regular")
567+
return tabloid_gram_matrix(la, base_ring).rank()

src/sage/combinat/symmetric_group_algebra.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,30 @@ def specht_module_dimension(self, D):
16291629
span_set = specht_module_spanning_set(D, self)
16301630
return matrix(self.base_ring(), [v.to_vector() for v in span_set]).rank()
16311631

1632+
def simple_module_dimension(self, la):
1633+
r"""
1634+
Return the dimension of the simple module of ``self`` indexed by the
1635+
partition ``la``.
1636+
1637+
EXAMPLES::
1638+
1639+
sage: SGA = SymmetricGroupAlgebra(GF(5), 6)
1640+
sage: SGA.simple_module_dimension(Partition([4,1,1]))
1641+
10
1642+
1643+
TESTS::
1644+
1645+
sage: SGA = SymmetricGroupAlgebra(GF(5), 6)
1646+
sage: SGA.simple_module_dimension(Partition([3,1,1]))
1647+
Traceback (most recent call last):
1648+
...
1649+
ValueError: [3, 1, 1] is not a partition of 6
1650+
"""
1651+
if sum(la) != self.n:
1652+
raise ValueError(f"{la} is not a partition of {self.n}")
1653+
from sage.combinat.specht_module import simple_module_rank
1654+
return simple_module_rank(la, self.base_ring())
1655+
16321656
def jucys_murphy(self, k):
16331657
r"""
16341658
Return the Jucys-Murphy element `J_k` (also known as a

src/sage/combinat/tableau.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2999,7 +2999,16 @@ def column_stabilizer(self):
29992999
sage: PermutationGroupElement([(1,4)]) in cs
30003000
True
30013001
"""
3002-
return self.conjugate().row_stabilizer()
3002+
# Ensure that the permutations involve all elements of the
3003+
# tableau, by including the identity permutation on the set [1..k].
3004+
k = self.size()
3005+
gens = [list(range(1, k + 1))]
3006+
ell = len(self)
3007+
while ell > 1:
3008+
ell -= 1
3009+
for i, val in enumerate(self[ell]):
3010+
gens.append((val, self[ell-1][i]))
3011+
return PermutationGroup(gens)
30033012

30043013
def height(self):
30053014
"""

0 commit comments

Comments
 (0)