Specht Modules#

AUTHORS:

  • Travis Scrimshaw (2023-1-22): initial version

class sage.combinat.specht_module.SpechtModule(SGA, D)#

Bases: SubmoduleWithBasis

A Specht module.

Let \(S_n\) be the symmetric group on \(n\) letters and \(R\) be a commutative ring. The Specht module \(S^D\) for a diagram \(D\) is an \(S_n\)-module defined as follows. Let

\[R(D) := \sum_{w \in R_D} w, \qquad\qquad C(D) := \sum_{w \in C_D} (-1)^w w,\]

where \(R_D\) (resp. \(C_D\)) is the row (resp. column) stabilizer of \(D\). Then, we construct the Specht module \(S^D\) as the left ideal

\[S^D = R[S_n] C(D) R(D),\]

where \(R[S_n]\) is the group algebra of \(S_n\) over \(R\).

INPUT:

  • SGA – a symmetric group algebra

  • D – a diagram

EXAMPLES:

We begin by constructing all irreducible Specht modules for the symmetric group \(S_4\) and show that they give a full set of irreducible representations both by having distinct Frobenius characters and the sum of the square of their dimensions is equal to \(4!\):

sage: SP = [la.specht_module(QQ) for la in Partitions(4)]
sage: s = SymmetricFunctions(QQ).s()
sage: [s(S.frobenius_image()) for S in SP]
[s[4], s[3, 1], s[2, 2], s[2, 1, 1], s[1, 1, 1, 1]]
sage: sum(S.dimension()^2 for S in SP)
24

Next, we compute the Specht module for a more general diagram for \(S_5\) and compute its irreducible decomposition by using its Frobenius character:

sage: D = [(0,0), (0,1), (1,1), (1,2), (0,3)]
sage: SGA = SymmetricGroupAlgebra(QQ, 5)
sage: SM = SGA.specht_module(D)
sage: SM.dimension()
9
sage: s(SM.frobenius_image())
s[3, 2] + s[4, 1]

This carries a natural (left) action of the symmetric group (algebra):

sage: S5 = SGA.group()
sage: v = SM.an_element(); v
2*B[0] + 2*B[1] + 3*B[2]
sage: S5([2,1,5,3,4]) * v
3*B[0] + 2*B[1] + 2*B[2]
sage: x = SGA.an_element(); x
[1, 2, 3, 4, 5] + 2*[1, 2, 3, 5, 4] + 3*[1, 2, 4, 3, 5] + [5, 1, 2, 3, 4]
sage: x * v
15*B[0] + 14*B[1] + 16*B[2] - 7*B[5] + 2*B[6] + 2*B[7]

See also

SpechtRepresentation for an implementation of the representation by matrices.

class Element#

Bases: IndexedFreeModuleElement

frobenius_image()#

Return the Frobenius image of self.

The Frobenius map is defined as the map to symmetric functions

\[F(\chi) = \frac{1}{n!} \sum_{w \in S_n} \chi(w) p_{\rho(w)},\]

where \(\chi\) is the character of the \(S_n\)-module self, \(p_{\lambda}\) is the powersum symmetric function basis element indexed by \(\lambda\), and \(\rho(w)\) is partition of the cycle type of \(w\). Specifically, this map takes irreducible representations indexed by \(\lambda\) to the Schur function \(s_{\lambda}\).

EXAMPLES:

sage: s = SymmetricFunctions(QQ).s()
sage: SM = Partition([2,2,1]).specht_module(QQ)
sage: s(SM.frobenius_image())
s[2, 2, 1]
sage: SM = Partition([4,1]).specht_module(CyclotomicField(5))
sage: s(SM.frobenius_image())
s[4, 1]

We verify the regular representation:

sage: from sage.combinat.diagram import Diagram
sage: D = Diagram([(0,0), (1,1), (2,2), (3,3), (4,4)])
sage: F = s(D.specht_module(QQ).frobenius_image()); F
s[1, 1, 1, 1, 1] + 4*s[2, 1, 1, 1] + 5*s[2, 2, 1]
 + 6*s[3, 1, 1] + 5*s[3, 2] + 4*s[4, 1] + s[5]
sage: F == sum(StandardTableaux(la).cardinality() * s[la]
....:          for la in Partitions(5))
True
sage: all(s[la] == s(la.specht_module(QQ).frobenius_image())
....:     for n in range(1, 5) for la in Partitions(n))
True

sage: D = Diagram([(0,0), (1,1), (1,2), (2,3), (2,4)])
sage: SM = D.specht_module(QQ)
sage: s(SM.frobenius_image())
s[2, 2, 1] + s[3, 1, 1] + 2*s[3, 2] + 2*s[4, 1] + s[5]
representation_matrix(elt)#

Return the matrix corresponding to the left action of the symmetric group (algebra) element elt on self.

EXAMPLES:

sage: SM = Partition([3,1,1]).specht_module(QQ)
sage: SM.representation_matrix(Permutation([2,1,3,5,4]))
[-1  0  0  1 -1  0]
[ 0  0  1  0 -1  1]
[ 0  1  0 -1  0  1]
[ 0  0  0  0 -1  0]
[ 0  0  0 -1  0  0]
[ 0  0  0  0  0 -1]
sage: SGA = SymmetricGroupAlgebra(QQ, 5)
sage: SM.representation_matrix(SGA([3,1,5,2,4]))
[ 0 -1  0  1  0 -1]
[ 0  0  0  0  0 -1]
[ 0  0  0 -1  0  0]
[ 0  0 -1  0  1 -1]
[ 1  0  0 -1  1  0]
[ 0  0  0  0  1  0]
sage.combinat.specht_module.polytabloid(T)#

Compute the polytabloid element associated to a tableau T.

For a tableau \(T\), the polytabloid associated to \(T\) is

\[e_T = \sum_{\sigma \in C_T} (-1)^{\sigma} \{\sigma T\},\]

where \(\{\}\) is the row-equivalence class, i.e. a tabloid, and \(C_T\) is the column stabilizer of \(T\). The sum takes place in the module spanned by tabloids \(\{T\}\).

OUTPUT:

A dict whose keys are tabloids represented by tuples of frozensets and whose values are the coefficient.

EXAMPLES:

sage: from sage.combinat.specht_module import polytabloid
sage: T = StandardTableau([[1,3,4],[2,5]])
sage: polytabloid(T)
{(frozenset({1, 3, 4}), frozenset({2, 5})): 1,
 (frozenset({1, 4, 5}), frozenset({2, 3})): -1,
 (frozenset({2, 3, 4}), frozenset({1, 5})): -1,
 (frozenset({2, 4, 5}), frozenset({1, 3})): 1}
sage.combinat.specht_module.simple_module_rank(la, base_ring)#

Return the rank of the simple \(S_n\)-module corresponding to the partition la of size \(n\) over base_ring.

EXAMPLES:

sage: from sage.combinat.specht_module import simple_module_rank
sage: simple_module_rank([3,2,1,1], GF(3))
13
sage.combinat.specht_module.specht_module_rank(D, base_ring=None)#

Return the rank of the Specht module of diagram D.

EXAMPLES:

sage: from sage.combinat.specht_module import specht_module_rank
sage: specht_module_rank([(0,0), (1,1), (2,2)])
6
sage.combinat.specht_module.specht_module_spanning_set(D, SGA=None)#

Return a spanning set of the Specht module of diagram D.

INPUT:

  • D – a list of cells (r,c) for row r and column c

  • SGA – optional; a symmetric group algebra

EXAMPLES:

sage: from sage.combinat.specht_module import specht_module_spanning_set
sage: specht_module_spanning_set([(0,0), (1,1), (2,2)])
([1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1])
sage: specht_module_spanning_set([(0,0), (1,1), (2,1)])
([1, 2, 3] - [1, 3, 2], -[1, 2, 3] + [1, 3, 2], [2, 1, 3] - [3, 1, 2],
 [2, 3, 1] - [3, 2, 1], -[2, 1, 3] + [3, 1, 2], -[2, 3, 1] + [3, 2, 1])

sage: SGA = SymmetricGroup(3).algebra(QQ)
sage: specht_module_spanning_set([(0,0), (1,1), (2,1)], SGA)
(() - (2,3), -(1,2) + (1,3,2), (1,2,3) - (1,3),
 -() + (2,3), -(1,2,3) + (1,3), (1,2) - (1,3,2))
sage.combinat.specht_module.tabloid_gram_matrix(la, base_ring)#

Compute the Gram matrix of the bilinear form of a Specht module pulled back from the tabloid module.

For the module spanned by all tabloids, we define an bilinear form by having the tabloids be an orthonormal basis. We then pull this bilinear form back across the natural injection of the Specht module into the tabloid module.

EXAMPLES:

sage: from sage.combinat.specht_module import tabloid_gram_matrix
sage: tabloid_gram_matrix([3,2], GF(5))
[4 2 2 1 4]
[2 4 1 2 1]
[2 1 4 2 1]
[1 2 2 4 2]
[4 1 1 2 4]