Skip to content

Commit 67b5de7

Browse files
author
Release Manager
committed
gh-38102: Implement the intrinsic arrangement of a Specht module <!-- ^ 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 of the hyperplane arrangement of a Specht module from https://arxiv.org/abs/1910.08302. ### 📝 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: #38102 Reported by: Travis Scrimshaw Reviewer(s): Matthias Köppe
2 parents 45d8b27 + 8d34776 commit 67b5de7

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -6393,6 +6393,11 @@ REFERENCES:
63936393
Journal of Combinatorial Theory, Series A 16.3 (1974), pp 313–333.
63946394
:doi:`10.1016/0097-3165(74)90056-9`
63956395
6396+
.. [TVY2020] \N. V. Tsilevich, A. M. Vershik, and S. Yuzvinsky.
6397+
*The intrinsic hyperplane arrangement in an arbitrary irreducible
6398+
representation of the symmetric group*, Arnold Math. J. **6**
6399+
no. 2 (2020) pp. 173-187.
6400+
63966401
.. [TW1980] \A.D. Thomas and G.V. Wood, Group Tables (Exeter: Shiva
63976402
Publishing, 1980)
63986403

src/sage/combinat/specht_module.py

+96
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,102 @@ def simple_module(self):
850850
return self
851851
return SimpleModule(self)
852852

853+
def intrinsic_arrangement(self, base_ring=None):
854+
r"""
855+
Return the intrinsic arrangement of ``self``.
856+
857+
Consider the Specht module `S^{\lambda}` with `\lambda` a
858+
(integer) partition of `n` (i.e., `S^{\lambda}` is an `S_n`-module).
859+
The *intrinsic arrangement* of `S^{\lambda}` is the central hyperplane
860+
arrangement in `S^{\lambda}` given by the hyperplanes `H_{\alpha}`,
861+
indexed by a set partition `\alpha` of `\{1, \ldots, n\}` of size
862+
`\lambda`, defined by
863+
864+
.. MATH::
865+
866+
H_{\alpha} := \bigoplus_{\tau \in T_{\alpha}} (S^{\lambda})^{\tau},
867+
868+
where `T_{\alpha}` is some set of generating transpositions
869+
of the Young subgroup `S_{\alpha}` and `V^{\tau}` denotes the
870+
`\tau`-invariant subspace of `V`. (These hyperplanes do not
871+
depend on the choice of `T_{\alpha}`.)
872+
873+
This was introduced in [TVY2020]_ as a generalization of the
874+
braid arrangement, which is the case when `\lambda = (n-1, 1)`
875+
(equivalently, for the irreducible representation of `S_n`
876+
given by the type `A_{n-1}` root system).
877+
878+
EXAMPLES::
879+
880+
sage: SGA = SymmetricGroupAlgebra(QQ, 4)
881+
sage: SM = SGA.specht_module([2, 1, 1])
882+
sage: A = SM.intrinsic_arrangement()
883+
sage: A.hyperplanes()
884+
(Hyperplane T0 - T1 - 3*T2 + 0,
885+
Hyperplane T0 - T1 + T2 + 0,
886+
Hyperplane T0 + 3*T1 + T2 + 0,
887+
Hyperplane 3*T0 + T1 - T2 + 0)
888+
sage: A.is_free()
889+
False
890+
891+
We reproduce Example 3 of [TVY2020]_::
892+
893+
sage: SGA = SymmetricGroupAlgebra(QQ, 5)
894+
sage: for la in Partitions(5):
895+
....: SM = SGA.specht_module(la)
896+
....: A = SM.intrinsic_arrangement()
897+
....: print(la, A.characteristic_polynomial())
898+
[5] 1
899+
[4, 1] x^4 - 10*x^3 + 35*x^2 - 50*x + 24
900+
[3, 2] x^5 - 15*x^4 + 90*x^3 - 260*x^2 + 350*x - 166
901+
[3, 1, 1] x^6 - 10*x^5 + 45*x^4 - 115*x^3 + 175*x^2 - 147*x + 51
902+
[2, 2, 1] x^5 - 10*x^4 + 45*x^3 - 105*x^2 + 120*x - 51
903+
[2, 1, 1, 1] x^4 - 5*x^3 + 10*x^2 - 10*x + 4
904+
[1, 1, 1, 1, 1] 1
905+
906+
sage: A = SGA.specht_module([4, 1]).intrinsic_arrangement()
907+
sage: A.characteristic_polynomial().factor()
908+
(x - 4) * (x - 3) * (x - 2) * (x - 1)
909+
"""
910+
from sage.geometry.hyperplane_arrangement.arrangement import HyperplaneArrangements
911+
from sage.combinat.set_partition import SetPartitions
912+
if base_ring is None:
913+
base_ring = self.base_ring()
914+
915+
if self.dimension() == 1: # corner case
916+
HA = HyperplaneArrangements(base_ring, 'T')
917+
return HA()
918+
919+
SGA = self._semigroup_algebra
920+
G = self._semigroup
921+
922+
def t(i, j):
923+
ret = [i for i in range(1, SGA.n+1)]
924+
ret[i-1] = j
925+
ret[j-1] = i
926+
return SGA(G(ret))
927+
928+
# Construct the hyperplanes
929+
fixed_spaces = {}
930+
norms = []
931+
for alpha in SetPartitions(SGA.n, self._diagram.conjugate()):
932+
span = []
933+
for a in alpha:
934+
a = list(a)
935+
for i in range(len(a)-1):
936+
elt = t(a[i], a[i+1])
937+
if elt not in fixed_spaces:
938+
fixed_spaces[elt] = self.annihilator_basis([elt - SGA.one()], side='left')
939+
span.extend(fixed_spaces[elt])
940+
H = self.echelon_form(span)
941+
N = matrix([v.to_vector() for v in H]).right_kernel_matrix()
942+
assert N.nrows() == 1
943+
norms.append(N[0])
944+
945+
# Convert the data to an arrangement
946+
HA = HyperplaneArrangements(base_ring, tuple([f'T{i}' for i in range(self.dimension())]))
947+
return HA([[0] + list(N) for N in norms])
948+
853949

854950
class MaximalSpechtSubmodule(SymmetricGroupRepresentation, SubmoduleWithBasis):
855951
r"""

src/sage/geometry/hyperplane_arrangement/arrangement.py

+8
Original file line numberDiff line numberDiff line change
@@ -952,11 +952,19 @@ def characteristic_polynomial(self):
952952
....: m_perm = matrix(m_perm).transpose()
953953
....: charpoly = H(m_perm.rows()).characteristic_polynomial()
954954
....: assert charpoly == expected_charpoly
955+
956+
Check the corner case of the empty arrangement::
957+
958+
sage: E = H()
959+
sage: E.characteristic_polynomial()
960+
1
955961
"""
956962
from sage.rings.polynomial.polynomial_ring import polygen
957963
x = polygen(QQ, 'x')
958964
if self.rank() == 1:
959965
return x**(self.dimension() - 1) * (x - len(self))
966+
if self.rank() == 0:
967+
return x ** 0
960968

961969
H = self[0]
962970
R = self.restriction(H)

0 commit comments

Comments
 (0)