Representations of the Symmetric Group

Todo

  • construct the product of two irreducible representations.

  • implement Induction/Restriction of representations.

Warning

This code uses a different convention than in Sagan’s book “The Symmetric Group”

class sage.combinat.symmetric_group_representations.GarsiaProcesiModule(SGA, shape)[source]

Bases: UniqueRepresentation, QuotientRing_generic, SymmetricGroupRepresentation

A Garsia-Procesi module.

Let \(\lambda\) be a partition of \(n\) and \(R\) be a commutative ring. The Garsia-Procesi module is defined by \(R_{\lambda} := R[x_1, \ldots, x_n] / I_{\lambda}\), where

\[I_{\lambda} := \langle e_r(x_{i_1}, \ldots, x_{i_k}) \mid \{i_1, \ldots, i_k\} \subseteq [n] \text{ and } k \geq r > k - d_k(\lambda) \rangle,\]

with \(e_r\) being the \(r\)-the elementary symmetric function and \(d_k(\lambda) = \lambda'_n + \cdots + \lambda'_{n+1-k}\), is the Tanisaki ideal.

If we consider \(R = \QQ\), then the Garsia-Procesi module has the following interpretation. Let \(\mathcal{F}_n = GL_n / B\) denote the (complex type A) flag variety. Consider the Springer fiber \(F_{\lambda} \subseteq \mathcal{F}_n\) associated to a nilpotent matrix with Jordan blocks sizes \(\lambda\). Springer showed that the cohomology ring \(H^*(F_{\lambda})\) admits a graded \(S_n\)-action that agrees with the induced representation of the sign representation of the Young subgroup \(S_{\lambda}\). From work of De Concini and Procesi, this \(S_n\)-representation is isomorphic to \(R_{\lambda}\). Moreover, the graded Frobenius image is known to be a modified Hall-Littlewood polynomial.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(QQ, 7)
sage: GP421 = SGA.garsia_procesi_module([4, 2, 1])
sage: GP421.dimension()
105
sage: v = GP421.an_element(); v
-gp1 - gp2 - gp3 - gp4 - gp5 - gp6
sage: SGA.an_element() * v
-6*gp1 - 6*gp2 - 6*gp3 - 6*gp4 - 6*gp5 - 5*gp6
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(7))
>>> GP421 = SGA.garsia_procesi_module([Integer(4), Integer(2), Integer(1)])
>>> GP421.dimension()
105
>>> v = GP421.an_element(); v
-gp1 - gp2 - gp3 - gp4 - gp5 - gp6
>>> SGA.an_element() * v
-6*gp1 - 6*gp2 - 6*gp3 - 6*gp4 - 6*gp5 - 5*gp6

We verify the result is a modified Hall-Littlewood polynomial by using the \(Q'\) Hall-Littlewood polynomials, replacing \(q \mapsto q^{-1}\) and multiplying by the smallest power of \(q\) so the coefficients are again polynomials:

sage: GP421.graded_frobenius_image()
q^4*s[4, 2, 1] + q^3*s[4, 3] + q^3*s[5, 1, 1] + (q^3+q^2)*s[5, 2]
 + (q^2+q)*s[6, 1] + s[7]
sage: R.<q> = QQ[]
sage: Sym = SymmetricFunctions(R)
sage: s = Sym.s()
sage: Qp = Sym.hall_littlewood(q).Qp()
sage: mHL = s(Qp[4,2,1]); mHL
s[4, 2, 1] + q*s[4, 3] + q*s[5, 1, 1] + (q^2+q)*s[5, 2]
 + (q^3+q^2)*s[6, 1] + q^4*s[7]
sage: mHL.map_coefficients(lambda c: R(q^4*c(q^-1)))
q^4*s[4, 2, 1] + q^3*s[4, 3] + q^3*s[5, 1, 1] + (q^3+q^2)*s[5, 2]
 + (q^2+q)*s[6, 1] + s[7]
>>> from sage.all import *
>>> GP421.graded_frobenius_image()
q^4*s[4, 2, 1] + q^3*s[4, 3] + q^3*s[5, 1, 1] + (q^3+q^2)*s[5, 2]
 + (q^2+q)*s[6, 1] + s[7]
>>> R = QQ['q']; (q,) = R._first_ngens(1)
>>> Sym = SymmetricFunctions(R)
>>> s = Sym.s()
>>> Qp = Sym.hall_littlewood(q).Qp()
>>> mHL = s(Qp[Integer(4),Integer(2),Integer(1)]); mHL
s[4, 2, 1] + q*s[4, 3] + q*s[5, 1, 1] + (q^2+q)*s[5, 2]
 + (q^3+q^2)*s[6, 1] + q^4*s[7]
>>> mHL.map_coefficients(lambda c: R(q**Integer(4)*c(q**-Integer(1))))
q^4*s[4, 2, 1] + q^3*s[4, 3] + q^3*s[5, 1, 1] + (q^3+q^2)*s[5, 2]
 + (q^2+q)*s[6, 1] + s[7]

We show that the maximal degree component corresponds to the Yamanouchi words of content \(\lambda\):

sage: B = GP421.graded_decomposition(4).basis()
sage: top_deg = [Word([i+1 for i in b.lift().lift().exponents()[0]]) for b in B]
sage: yamanouchi = [P.to_packed_word() for P in OrderedSetPartitions(range(7), [4, 2, 1])
....:               if P.to_packed_word().reversal().is_yamanouchi()]
sage: set(top_deg) == set(yamanouchi)
True
>>> from sage.all import *
>>> B = GP421.graded_decomposition(Integer(4)).basis()
>>> top_deg = [Word([i+Integer(1) for i in b.lift().lift().exponents()[Integer(0)]]) for b in B]
>>> yamanouchi = [P.to_packed_word() for P in OrderedSetPartitions(range(Integer(7)), [Integer(4), Integer(2), Integer(1)])
...               if P.to_packed_word().reversal().is_yamanouchi()]
>>> set(top_deg) == set(yamanouchi)
True
class Element(parent, rep, reduce=True)[source]

Bases: QuotientRingElement

degree()[source]

Return the degree of self.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(3), 4)
sage: GP22 = SGA.garsia_procesi_module([2, 2])
sage: for b in GP22.basis():
....:     print(b, b.degree())
gp2*gp3 2
gp1*gp3 2
gp3 1
gp2 1
gp1 1
1 0
sage: v = sum(GP22.basis())
sage: v.degree()
2
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(3)), Integer(4))
>>> GP22 = SGA.garsia_procesi_module([Integer(2), Integer(2)])
>>> for b in GP22.basis():
...     print(b, b.degree())
gp2*gp3 2
gp1*gp3 2
gp3 1
gp2 1
gp1 1
1 0
>>> v = sum(GP22.basis())
>>> v.degree()
2
homogeneous_degree()[source]

Return the (homogeneous) degree of self if homogeneous otherwise raise an error.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(2), 4)
sage: GP31 = SGA.garsia_procesi_module([3, 1])
sage: for b in GP31.basis():
....:     print(b, b.homogeneous_degree())
gp3 1
gp2 1
gp1 1
1 0
sage: v = sum(GP31.basis()); v
gp1 + gp2 + gp3 + 1
sage: v.homogeneous_degree()
Traceback (most recent call last):
...
ValueError: element is not homogeneous
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(2)), Integer(4))
>>> GP31 = SGA.garsia_procesi_module([Integer(3), Integer(1)])
>>> for b in GP31.basis():
...     print(b, b.homogeneous_degree())
gp3 1
gp2 1
gp1 1
1 0
>>> v = sum(GP31.basis()); v
gp1 + gp2 + gp3 + 1
>>> v.homogeneous_degree()
Traceback (most recent call last):
...
ValueError: element is not homogeneous
monomial_coefficients(copy=None)[source]

Return the monomial coefficients of self.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(3), 4)
sage: GP31 = SGA.garsia_procesi_module([3, 1])
sage: v = GP31.an_element(); v
-gp1 - gp2 - gp3
sage: v.monomial_coefficients()
{0: 2, 1: 2, 2: 2, 3: 0}
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(3)), Integer(4))
>>> GP31 = SGA.garsia_procesi_module([Integer(3), Integer(1)])
>>> v = GP31.an_element(); v
-gp1 - gp2 - gp3
>>> v.monomial_coefficients()
{0: 2, 1: 2, 2: 2, 3: 0}
to_vector(order=None)[source]

Return self as a (dense) free module vector.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(3), 4)
sage: GP22 = SGA.garsia_procesi_module([2, 2])
sage: v = GP22.an_element(); v
-gp1 - gp2 - gp3
sage: v.to_vector()
(0, 0, 2, 2, 2, 0)
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(3)), Integer(4))
>>> GP22 = SGA.garsia_procesi_module([Integer(2), Integer(2)])
>>> v = GP22.an_element(); v
-gp1 - gp2 - gp3
>>> v.to_vector()
(0, 0, 2, 2, 2, 0)
basis()[source]

Return a basis of self.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(QQ, 4)
sage: GP = SGA.garsia_procesi_module([2, 2])
sage: GP.basis()
Family (gp2*gp3, gp1*gp3, gp3, gp2, gp1, 1)
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(4))
>>> GP = SGA.garsia_procesi_module([Integer(2), Integer(2)])
>>> GP.basis()
Family (gp2*gp3, gp1*gp3, gp3, gp2, gp1, 1)
dimension()[source]

Return the dimension of self.

The graded Frobenius character of the Garsia-Procesi module \(R_{\lambda}\) is given by the modified Hall-Littlewood polynomial \(\widetilde{H}_{\lambda'}(x; q)\).

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(QQ, 5)
sage: Sym = SymmetricFunctions(QQ)
sage: s = Sym.s()
sage: Qp = Sym.hall_littlewood(1).Qp()
sage: for la in Partitions(5):
....:     print(SGA.garsia_procesi_module(la).dimension(),
....:           sum(c * StandardTableaux(la).cardinality()
....:               for la, c in s(Qp[la])))
1 1
5 5
10 10
20 20
30 30
60 60
120 120
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(5))
>>> Sym = SymmetricFunctions(QQ)
>>> s = Sym.s()
>>> Qp = Sym.hall_littlewood(Integer(1)).Qp()
>>> for la in Partitions(Integer(5)):
...     print(SGA.garsia_procesi_module(la).dimension(),
...           sum(c * StandardTableaux(la).cardinality()
...               for la, c in s(Qp[la])))
1 1
5 5
10 10
20 20
30 30
60 60
120 120
get_order()[source]

Return the order of the elements in the basis.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(QQ, 4)
sage: GP = SGA.garsia_procesi_module([2, 2])
sage: GP.get_order()
(0, 1, 2, 3, 4, 5)
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(4))
>>> GP = SGA.garsia_procesi_module([Integer(2), Integer(2)])
>>> GP.get_order()
(0, 1, 2, 3, 4, 5)
graded_brauer_character()[source]

Return the graded Brauer character of self.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(2), 5)
sage: GP311 = SGA.garsia_procesi_module([3, 1, 1])
sage: GP311.graded_brauer_character()
(6*q^3 + 9*q^2 + 4*q + 1, q + 1, q^3 - q^2 - q + 1)
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(2)), Integer(5))
>>> GP311 = SGA.garsia_procesi_module([Integer(3), Integer(1), Integer(1)])
>>> GP311.graded_brauer_character()
(6*q^3 + 9*q^2 + 4*q + 1, q + 1, q^3 - q^2 - q + 1)
graded_character()[source]

Return the graded character of self.

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(QQ, 5)
sage: GP = SGA.garsia_procesi_module([2, 2, 1])
sage: gchi = GP.graded_character(); gchi
(5*q^4 + 11*q^3 + 9*q^2 + 4*q + 1, -q^4 + q^3 + 3*q^2 + 2*q + 1,
 q^4 - q^3 + q^2 + 1, -q^4 - q^3 + q + 1, -q^4 + q^3 - q + 1,
 q^4 - q^3 - q^2 + 1, q^3 - q^2 - q + 1)
sage: R.<q> = QQ[]
sage: gchi == sum(q^d * D.character()
....:             for d, D in GP.graded_decomposition().items())
True
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(5))
>>> GP = SGA.garsia_procesi_module([Integer(2), Integer(2), Integer(1)])
>>> gchi = GP.graded_character(); gchi
(5*q^4 + 11*q^3 + 9*q^2 + 4*q + 1, -q^4 + q^3 + 3*q^2 + 2*q + 1,
 q^4 - q^3 + q^2 + 1, -q^4 - q^3 + q + 1, -q^4 + q^3 - q + 1,
 q^4 - q^3 - q^2 + 1, q^3 - q^2 - q + 1)
>>> R = QQ['q']; (q,) = R._first_ngens(1)
>>> gchi == sum(q**d * D.character()
...             for d, D in GP.graded_decomposition().items())
True
graded_decomposition(k=None)[source]

Return the decomposition of self as a direct sum of representations given by a fixed grading.

INPUT:

  • k – (optional) integer; if given, return the \(k\)-th graded part

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(2), 5)
sage: GP32 = SGA.garsia_procesi_module([3, 2])
sage: decomp = GP32.graded_decomposition(); decomp
{0: Subrepresentation with basis {0} of Garsia-Procesi ...,
 1: Subrepresentation with basis {0, 1, 2, 3} of Garsia-Procesi ...,
 2: Subrepresentation with basis {0, 1, 2, 3, 4} of Garsia-Procesi ...}
sage: decomp[2] is GP32.graded_decomposition(2)
True
sage: GP32.graded_decomposition(10)
Subrepresentation with basis {} of Garsia-Procesi module
 of shape [3, 2] over Finite Field of size 2
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(2)), Integer(5))
>>> GP32 = SGA.garsia_procesi_module([Integer(3), Integer(2)])
>>> decomp = GP32.graded_decomposition(); decomp
{0: Subrepresentation with basis {0} of Garsia-Procesi ...,
 1: Subrepresentation with basis {0, 1, 2, 3} of Garsia-Procesi ...,
 2: Subrepresentation with basis {0, 1, 2, 3, 4} of Garsia-Procesi ...}
>>> decomp[Integer(2)] is GP32.graded_decomposition(Integer(2))
True
>>> GP32.graded_decomposition(Integer(10))
Subrepresentation with basis {} of Garsia-Procesi module
 of shape [3, 2] over Finite Field of size 2
graded_frobenius_image()[source]

Return the graded Frobenius image of self.

The graded Frobenius image is the sum of the frobenius_image() of each graded component, which is known to result in the modified Hall-Littlewood polynomial \(\widetilde{H}_{\lambda}(x; q)\).

EXAMPLES:

We verify that the result is the modified Hall-Littlewood polynomial for \(n = 5\):

sage: R.<q> = QQ[]
sage: Sym = SymmetricFunctions(R)
sage: s = Sym.s()
sage: Qp = Sym.hall_littlewood(q).Qp()
sage: SGA = SymmetricGroupAlgebra(QQ, 5)
sage: for la in Partitions(5):
....:     f = SGA.garsia_procesi_module(la).graded_frobenius_image()
....:     d = f[la].degree()
....:     assert f.map_coefficients(lambda c: R(c(~q)*q^d)) == s(Qp[la])
>>> from sage.all import *
>>> R = QQ['q']; (q,) = R._first_ngens(1)
>>> Sym = SymmetricFunctions(R)
>>> s = Sym.s()
>>> Qp = Sym.hall_littlewood(q).Qp()
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(5))
>>> for la in Partitions(Integer(5)):
...     f = SGA.garsia_procesi_module(la).graded_frobenius_image()
...     d = f[la].degree()
...     assert f.map_coefficients(lambda c: R(c(~q)*q**d)) == s(Qp[la])
graded_representation_matrix(elt, q=None)[source]

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

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(GF(3), 3)
sage: GP = SGA.garsia_procesi_module([1, 1, 1])
sage: elt = SGA.an_element(); elt
[1, 2, 3] + 2*[1, 3, 2] + [3, 1, 2]
sage: X = GP.graded_representation_matrix(elt); X
[  0   0   0   0   0   0]
[  0 q^2   0   0   0   0]
[  0 q^2   0   0   0   0]
[  0   0   0   q   0   0]
[  0   0   0   q   0   0]
[  0   0   0   0   0   1]
sage: X.parent()
Full MatrixSpace of 6 by 6 dense matrices over
 Univariate Polynomial Ring in q over Finite Field of size 3
sage: R.<q> = GF(3)[]
sage: t = R.quotient([q^2+2*q+1]).gen()
sage: GP.graded_representation_matrix(elt, t)
[       0        0        0        0        0        0]
[       0 qbar + 2        0        0        0        0]
[       0 qbar + 2        0        0        0        0]
[       0        0        0     qbar        0        0]
[       0        0        0     qbar        0        0]
[       0        0        0        0        0        1]
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(GF(Integer(3)), Integer(3))
>>> GP = SGA.garsia_procesi_module([Integer(1), Integer(1), Integer(1)])
>>> elt = SGA.an_element(); elt
[1, 2, 3] + 2*[1, 3, 2] + [3, 1, 2]
>>> X = GP.graded_representation_matrix(elt); X
[  0   0   0   0   0   0]
[  0 q^2   0   0   0   0]
[  0 q^2   0   0   0   0]
[  0   0   0   q   0   0]
[  0   0   0   q   0   0]
[  0   0   0   0   0   1]
>>> X.parent()
Full MatrixSpace of 6 by 6 dense matrices over
 Univariate Polynomial Ring in q over Finite Field of size 3
>>> R = GF(Integer(3))['q']; (q,) = R._first_ngens(1)
>>> t = R.quotient([q**Integer(2)+Integer(2)*q+Integer(1)]).gen()
>>> GP.graded_representation_matrix(elt, t)
[       0        0        0        0        0        0]
[       0 qbar + 2        0        0        0        0]
[       0 qbar + 2        0        0        0        0]
[       0        0        0     qbar        0        0]
[       0        0        0     qbar        0        0]
[       0        0        0        0        0        1]
one_basis()[source]

Return the index of the basis element \(1\).

EXAMPLES:

sage: SGA = SymmetricGroupAlgebra(QQ, 4)
sage: GP = SGA.garsia_procesi_module([2, 2])
sage: GP.one_basis()
5
>>> from sage.all import *
>>> SGA = SymmetricGroupAlgebra(QQ, Integer(4))
>>> GP = SGA.garsia_procesi_module([Integer(2), Integer(2)])
>>> GP.one_basis()
5
class sage.combinat.symmetric_group_representations.SpechtRepresentation(parent, partition)[source]

Bases: SymmetricGroupRepresentation_generic_class

representation_matrix(permutation)[source]

Return the matrix representing the permutation in this irreducible representation.

Note

This method caches the results.

EXAMPLES:

sage: spc = SymmetricGroupRepresentation([3,1], 'specht')
sage: spc.representation_matrix(Permutation([2,1,3,4]))
[ 0 -1  0]
[-1  0  0]
[ 0  0  1]
sage: spc.representation_matrix(Permutation([3,2,1,4]))
[0 0 1]
[0 1 0]
[1 0 0]
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(3),Integer(1)], 'specht')
>>> spc.representation_matrix(Permutation([Integer(2),Integer(1),Integer(3),Integer(4)]))
[ 0 -1  0]
[-1  0  0]
[ 0  0  1]
>>> spc.representation_matrix(Permutation([Integer(3),Integer(2),Integer(1),Integer(4)]))
[0 0 1]
[0 1 0]
[1 0 0]
scalar_product(u, v)[source]

Return 0 if u+v is not a permutation, and the signature of the permutation otherwise.

This is the scalar product of a vertex u of the underlying Yang-Baxter graph with the vertex v in the ‘dual’ Yang-Baxter graph.

EXAMPLES:

sage: spc = SymmetricGroupRepresentation([3,2], 'specht')
sage: spc.scalar_product((1,0,2,1,0),(0,3,0,3,0))
-1
sage: spc.scalar_product((1,0,2,1,0),(3,0,0,3,0))
0
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(3),Integer(2)], 'specht')
>>> spc.scalar_product((Integer(1),Integer(0),Integer(2),Integer(1),Integer(0)),(Integer(0),Integer(3),Integer(0),Integer(3),Integer(0)))
-1
>>> spc.scalar_product((Integer(1),Integer(0),Integer(2),Integer(1),Integer(0)),(Integer(3),Integer(0),Integer(0),Integer(3),Integer(0)))
0
scalar_product_matrix(permutation=None)[source]

Return the scalar product matrix corresponding to permutation.

The entries are given by the scalar products of u and permutation.action(v), where u is a vertex in the underlying Yang-Baxter graph and v is a vertex in the dual graph.

EXAMPLES:

sage: spc = SymmetricGroupRepresentation([3,1], 'specht')
sage: spc.scalar_product_matrix()
[ 1  0  0]
[ 0 -1  0]
[ 0  0  1]
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(3),Integer(1)], 'specht')
>>> spc.scalar_product_matrix()
[ 1  0  0]
[ 0 -1  0]
[ 0  0  1]
class sage.combinat.symmetric_group_representations.SpechtRepresentations(n, ring=None, cache_matrices=True)[source]

Bases: SymmetricGroupRepresentations_class

Element[source]

alias of SpechtRepresentation

sage.combinat.symmetric_group_representations.SymmetricGroupRepresentation(partition, implementation='specht', ring=None, cache_matrices=True)[source]

The irreducible representation of the symmetric group corresponding to partition.

INPUT:

  • partition – a partition of a positive integer

  • implementation – string (default: 'specht'); one of:

    • 'seminormal' – for Young’s seminormal representation

    • 'orthogonal' – for Young’s orthogonal representation

    • 'specht' – for Specht’s representation

  • ring – the ring over which the representation is defined

  • cache_matrices – boolean (default: True); if True, then any representation matrices that are computed are cached

EXAMPLES:

Young’s orthogonal representation: the matrices are orthogonal.

sage: orth = SymmetricGroupRepresentation([2,1], "orthogonal"); orth            # needs sage.symbolic
Orthogonal representation of the symmetric group corresponding to [2, 1]
sage: all(a*a.transpose() == a.parent().identity_matrix() for a in orth)        # needs sage.symbolic
True
>>> from sage.all import *
>>> orth = SymmetricGroupRepresentation([Integer(2),Integer(1)], "orthogonal"); orth            # needs sage.symbolic
Orthogonal representation of the symmetric group corresponding to [2, 1]
>>> all(a*a.transpose() == a.parent().identity_matrix() for a in orth)        # needs sage.symbolic
True

sage: # needs sage.symbolic
sage: orth = SymmetricGroupRepresentation([3,2], "orthogonal"); orth
Orthogonal representation of the symmetric group corresponding to [3, 2]
sage: orth([2,1,3,4,5])
[ 1  0  0  0  0]
[ 0  1  0  0  0]
[ 0  0 -1  0  0]
[ 0  0  0  1  0]
[ 0  0  0  0 -1]
sage: orth([1,3,2,4,5])
[          1           0           0           0           0]
[          0        -1/2 1/2*sqrt(3)           0           0]
[          0 1/2*sqrt(3)         1/2           0           0]
[          0           0           0        -1/2 1/2*sqrt(3)]
[          0           0           0 1/2*sqrt(3)         1/2]
sage: orth([1,2,4,3,5])
[       -1/3 2/3*sqrt(2)           0           0           0]
[2/3*sqrt(2)         1/3           0           0           0]
[          0           0           1           0           0]
[          0           0           0           1           0]
[          0           0           0           0          -1]
>>> from sage.all import *
>>> # needs sage.symbolic
>>> orth = SymmetricGroupRepresentation([Integer(3),Integer(2)], "orthogonal"); orth
Orthogonal representation of the symmetric group corresponding to [3, 2]
>>> orth([Integer(2),Integer(1),Integer(3),Integer(4),Integer(5)])
[ 1  0  0  0  0]
[ 0  1  0  0  0]
[ 0  0 -1  0  0]
[ 0  0  0  1  0]
[ 0  0  0  0 -1]
>>> orth([Integer(1),Integer(3),Integer(2),Integer(4),Integer(5)])
[          1           0           0           0           0]
[          0        -1/2 1/2*sqrt(3)           0           0]
[          0 1/2*sqrt(3)         1/2           0           0]
[          0           0           0        -1/2 1/2*sqrt(3)]
[          0           0           0 1/2*sqrt(3)         1/2]
>>> orth([Integer(1),Integer(2),Integer(4),Integer(3),Integer(5)])
[       -1/3 2/3*sqrt(2)           0           0           0]
[2/3*sqrt(2)         1/3           0           0           0]
[          0           0           1           0           0]
[          0           0           0           1           0]
[          0           0           0           0          -1]

The Specht representation:

sage: spc = SymmetricGroupRepresentation([3,2], "specht")
sage: spc.scalar_product_matrix(Permutation([1,2,3,4,5]))
[ 1  0  0  0  0]
[ 0 -1  0  0  0]
[ 0  0  1  0  0]
[ 0  0  0  1  0]
[-1  0  0  0 -1]
sage: spc.scalar_product_matrix(Permutation([5,4,3,2,1]))
[ 1 -1  0  1  0]
[ 0  0  1  0 -1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[-1  0  0  0 -1]
sage: spc([5,4,3,2,1])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
sage: spc.verify_representation()
True
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(3),Integer(2)], "specht")
>>> spc.scalar_product_matrix(Permutation([Integer(1),Integer(2),Integer(3),Integer(4),Integer(5)]))
[ 1  0  0  0  0]
[ 0 -1  0  0  0]
[ 0  0  1  0  0]
[ 0  0  0  1  0]
[-1  0  0  0 -1]
>>> spc.scalar_product_matrix(Permutation([Integer(5),Integer(4),Integer(3),Integer(2),Integer(1)]))
[ 1 -1  0  1  0]
[ 0  0  1  0 -1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[-1  0  0  0 -1]
>>> spc([Integer(5),Integer(4),Integer(3),Integer(2),Integer(1)])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
>>> spc.verify_representation()
True

By default, any representation matrices that are computed are cached:

sage: spc = SymmetricGroupRepresentation([3,2], "specht")
sage: spc([5,4,3,2,1])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
sage: spc._cache__representation_matrix
{(([5, 4, 3, 2, 1],), ()): [ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]}
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(3),Integer(2)], "specht")
>>> spc([Integer(5),Integer(4),Integer(3),Integer(2),Integer(1)])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
>>> spc._cache__representation_matrix
{(([5, 4, 3, 2, 1],), ()): [ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]}

This can be turned off with the keyword cache_matrices:

sage: spc = SymmetricGroupRepresentation([3,2], "specht", cache_matrices=False)
sage: spc([5,4,3,2,1])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
sage: hasattr(spc, '_cache__representation_matrix')
False
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(3),Integer(2)], "specht", cache_matrices=False)
>>> spc([Integer(5),Integer(4),Integer(3),Integer(2),Integer(1)])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
>>> hasattr(spc, '_cache__representation_matrix')
False

Note

The implementation is based on the paper [Las].

REFERENCES:

[Las] (1,2)

Alain Lascoux, ‘Young representations of the symmetric group.’ http://phalanstere.univ-mlv.fr/~al/ARTICLES/ProcCrac.ps.gz

AUTHORS:

  • Franco Saliola (2009-04-23)

class sage.combinat.symmetric_group_representations.SymmetricGroupRepresentation_generic_class(parent, partition)[source]

Bases: Element

Generic methods for a representation of the symmetric group.

to_character()[source]

Return the character of the representation.

EXAMPLES:

The trivial character:

sage: rho = SymmetricGroupRepresentation([3])
sage: chi = rho.to_character(); chi
Character of Symmetric group of order 3! as a permutation group
sage: chi.values()
[1, 1, 1]
sage: all(chi(g) == 1 for g in SymmetricGroup(3))
True
>>> from sage.all import *
>>> rho = SymmetricGroupRepresentation([Integer(3)])
>>> chi = rho.to_character(); chi
Character of Symmetric group of order 3! as a permutation group
>>> chi.values()
[1, 1, 1]
>>> all(chi(g) == Integer(1) for g in SymmetricGroup(Integer(3)))
True

The sign character:

sage: rho = SymmetricGroupRepresentation([1,1,1])
sage: chi = rho.to_character(); chi
Character of Symmetric group of order 3! as a permutation group
sage: chi.values()
[1, -1, 1]
sage: all(chi(g) == g.sign() for g in SymmetricGroup(3))
True
>>> from sage.all import *
>>> rho = SymmetricGroupRepresentation([Integer(1),Integer(1),Integer(1)])
>>> chi = rho.to_character(); chi
Character of Symmetric group of order 3! as a permutation group
>>> chi.values()
[1, -1, 1]
>>> all(chi(g) == g.sign() for g in SymmetricGroup(Integer(3)))
True

The defining representation:

sage: triv = SymmetricGroupRepresentation([4])
sage: hook = SymmetricGroupRepresentation([3,1])
sage: def_rep = lambda p : triv(p).block_sum(hook(p)).trace()
sage: list(map(def_rep, Permutations(4)))
[4, 2, 2, 1, 1, 2, 2, 0, 1, 0, 0, 1, 1, 0, 2, 1, 0, 0, 0, 1, 1, 2, 0, 0]
sage: [p.to_matrix().trace() for p in Permutations(4)]
[4, 2, 2, 1, 1, 2, 2, 0, 1, 0, 0, 1, 1, 0, 2, 1, 0, 0, 0, 1, 1, 2, 0, 0]
>>> from sage.all import *
>>> triv = SymmetricGroupRepresentation([Integer(4)])
>>> hook = SymmetricGroupRepresentation([Integer(3),Integer(1)])
>>> def_rep = lambda p : triv(p).block_sum(hook(p)).trace()
>>> list(map(def_rep, Permutations(Integer(4))))
[4, 2, 2, 1, 1, 2, 2, 0, 1, 0, 0, 1, 1, 0, 2, 1, 0, 0, 0, 1, 1, 2, 0, 0]
>>> [p.to_matrix().trace() for p in Permutations(Integer(4))]
[4, 2, 2, 1, 1, 2, 2, 0, 1, 0, 0, 1, 1, 0, 2, 1, 0, 0, 0, 1, 1, 2, 0, 0]
verify_representation()[source]

Verify the representation.

This tests that the images of the simple transpositions are involutions and tests that the braid relations hold.

EXAMPLES:

sage: spc = SymmetricGroupRepresentation([1,1,1])
sage: spc.verify_representation()
True
sage: spc = SymmetricGroupRepresentation([4,2,1])
sage: spc.verify_representation()
True
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentation([Integer(1),Integer(1),Integer(1)])
>>> spc.verify_representation()
True
>>> spc = SymmetricGroupRepresentation([Integer(4),Integer(2),Integer(1)])
>>> spc.verify_representation()
True
sage.combinat.symmetric_group_representations.SymmetricGroupRepresentations(n, implementation='specht', ring=None, cache_matrices=True)[source]

Irreducible representations of the symmetric group.

INPUT:

  • n – positive integer

  • implementation – string (default: 'specht'); one of:

    • 'seminormal' – for Young’s seminormal representation

    • 'orthogonal' – for Young’s orthogonal representation

    • 'specht' – for Specht’s representation

  • ring – the ring over which the representation is defined

  • cache_matrices – boolean (default: True); if True, then any representation matrices that are computed are cached

EXAMPLES:

Young’s orthogonal representation: the matrices are orthogonal.

sage: orth = SymmetricGroupRepresentations(3, "orthogonal"); orth               # needs sage.symbolic
Orthogonal representations of the symmetric group of order 3! over Symbolic Ring
sage: orth.list()                                                               # needs sage.symbolic
[Orthogonal representation of the symmetric group corresponding to [3],
 Orthogonal representation of the symmetric group corresponding to [2, 1],
 Orthogonal representation of the symmetric group corresponding to [1, 1, 1]]
sage: orth([2,1])([1,2,3])                                                      # needs sage.symbolic
[1 0]
[0 1]
>>> from sage.all import *
>>> orth = SymmetricGroupRepresentations(Integer(3), "orthogonal"); orth               # needs sage.symbolic
Orthogonal representations of the symmetric group of order 3! over Symbolic Ring
>>> orth.list()                                                               # needs sage.symbolic
[Orthogonal representation of the symmetric group corresponding to [3],
 Orthogonal representation of the symmetric group corresponding to [2, 1],
 Orthogonal representation of the symmetric group corresponding to [1, 1, 1]]
>>> orth([Integer(2),Integer(1)])([Integer(1),Integer(2),Integer(3)])                                                      # needs sage.symbolic
[1 0]
[0 1]

Young’s seminormal representation.

sage: snorm = SymmetricGroupRepresentations(3, "seminormal"); snorm
Seminormal representations of the symmetric group of order 3! over Rational Field
sage: sgn = snorm([1,1,1]); sgn
Seminormal representation of the symmetric group corresponding to [1, 1, 1]
sage: list(map(sgn, Permutations(3)))
[[1], [-1], [-1], [1], [1], [-1]]
>>> from sage.all import *
>>> snorm = SymmetricGroupRepresentations(Integer(3), "seminormal"); snorm
Seminormal representations of the symmetric group of order 3! over Rational Field
>>> sgn = snorm([Integer(1),Integer(1),Integer(1)]); sgn
Seminormal representation of the symmetric group corresponding to [1, 1, 1]
>>> list(map(sgn, Permutations(Integer(3))))
[[1], [-1], [-1], [1], [1], [-1]]

The Specht Representation.

sage: spc = SymmetricGroupRepresentations(5, "specht"); spc
Specht representations of the symmetric group of order 5! over Integer Ring
sage: spc([3,2])([5,4,3,2,1])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]
>>> from sage.all import *
>>> spc = SymmetricGroupRepresentations(Integer(5), "specht"); spc
Specht representations of the symmetric group of order 5! over Integer Ring
>>> spc([Integer(3),Integer(2)])([Integer(5),Integer(4),Integer(3),Integer(2),Integer(1)])
[ 1 -1  0  1  0]
[ 0  0 -1  0  1]
[ 0  0  0 -1  1]
[ 0  1 -1 -1  1]
[ 0  1  0 -1  1]

Note

The implementation is based on the paper [Las].

AUTHORS:

  • Franco Saliola (2009-04-23)

class sage.combinat.symmetric_group_representations.SymmetricGroupRepresentations_class(n, ring=None, cache_matrices=True)[source]

Bases: UniqueRepresentation, Parent

Generic methods for the CombinatorialClass of irreducible representations of the symmetric group.

cardinality()[source]

Return the cardinality of self.

EXAMPLES:

sage: sp = SymmetricGroupRepresentations(4, "specht")
sage: sp.cardinality()
5
>>> from sage.all import *
>>> sp = SymmetricGroupRepresentations(Integer(4), "specht")
>>> sp.cardinality()
5
class sage.combinat.symmetric_group_representations.YoungRepresentation_Orthogonal(parent, partition)[source]

Bases: YoungRepresentation_generic

class sage.combinat.symmetric_group_representations.YoungRepresentation_Seminormal(parent, partition)[source]

Bases: YoungRepresentation_generic

class sage.combinat.symmetric_group_representations.YoungRepresentation_generic(parent, partition)[source]

Bases: SymmetricGroupRepresentation_generic_class

Generic methods for Young’s representations of the symmetric group.

representation_matrix(permutation)[source]

Return the matrix representing permutation.

EXAMPLES:

sage: orth = SymmetricGroupRepresentation([2,1], "orthogonal")              # needs sage.symbolic
sage: orth.representation_matrix(Permutation([2,1,3]))                      # needs sage.symbolic
[ 1  0]
[ 0 -1]
sage: orth.representation_matrix(Permutation([1,3,2]))                      # needs sage.symbolic
[       -1/2 1/2*sqrt(3)]
[1/2*sqrt(3)         1/2]
>>> from sage.all import *
>>> orth = SymmetricGroupRepresentation([Integer(2),Integer(1)], "orthogonal")              # needs sage.symbolic
>>> orth.representation_matrix(Permutation([Integer(2),Integer(1),Integer(3)]))                      # needs sage.symbolic
[ 1  0]
[ 0 -1]
>>> orth.representation_matrix(Permutation([Integer(1),Integer(3),Integer(2)]))                      # needs sage.symbolic
[       -1/2 1/2*sqrt(3)]
[1/2*sqrt(3)         1/2]

sage: norm = SymmetricGroupRepresentation([2,1], "seminormal")
sage: p = PermutationGroupElement([2,1,3])
sage: norm.representation_matrix(p)
[ 1  0]
[ 0 -1]
sage: p = PermutationGroupElement([1,3,2])
sage: norm.representation_matrix(p)
[-1/2  3/2]
[ 1/2  1/2]
>>> from sage.all import *
>>> norm = SymmetricGroupRepresentation([Integer(2),Integer(1)], "seminormal")
>>> p = PermutationGroupElement([Integer(2),Integer(1),Integer(3)])
>>> norm.representation_matrix(p)
[ 1  0]
[ 0 -1]
>>> p = PermutationGroupElement([Integer(1),Integer(3),Integer(2)])
>>> norm.representation_matrix(p)
[-1/2  3/2]
[ 1/2  1/2]
representation_matrix_for_simple_transposition(i)[source]

Return the matrix representing the transposition that swaps i and i+1.

EXAMPLES:

sage: orth = SymmetricGroupRepresentation([2,1], "orthogonal")              # needs sage.symbolic
sage: orth.representation_matrix_for_simple_transposition(1)                # needs sage.symbolic
[ 1  0]
[ 0 -1]
sage: orth.representation_matrix_for_simple_transposition(2)                # needs sage.symbolic
[       -1/2 1/2*sqrt(3)]
[1/2*sqrt(3)         1/2]

sage: norm = SymmetricGroupRepresentation([2,1], "seminormal")
sage: norm.representation_matrix_for_simple_transposition(1)
[ 1  0]
[ 0 -1]
sage: norm.representation_matrix_for_simple_transposition(2)
[-1/2  3/2]
[ 1/2  1/2]
>>> from sage.all import *
>>> orth = SymmetricGroupRepresentation([Integer(2),Integer(1)], "orthogonal")              # needs sage.symbolic
>>> orth.representation_matrix_for_simple_transposition(Integer(1))                # needs sage.symbolic
[ 1  0]
[ 0 -1]
>>> orth.representation_matrix_for_simple_transposition(Integer(2))                # needs sage.symbolic
[       -1/2 1/2*sqrt(3)]
[1/2*sqrt(3)         1/2]

>>> norm = SymmetricGroupRepresentation([Integer(2),Integer(1)], "seminormal")
>>> norm.representation_matrix_for_simple_transposition(Integer(1))
[ 1  0]
[ 0 -1]
>>> norm.representation_matrix_for_simple_transposition(Integer(2))
[-1/2  3/2]
[ 1/2  1/2]
class sage.combinat.symmetric_group_representations.YoungRepresentations_Orthogonal(n, ring=None, cache_matrices=True)[source]

Bases: SymmetricGroupRepresentations_class

Element[source]

alias of YoungRepresentation_Orthogonal

class sage.combinat.symmetric_group_representations.YoungRepresentations_Seminormal(n, ring=None, cache_matrices=True)[source]

Bases: SymmetricGroupRepresentations_class

Element[source]

alias of YoungRepresentation_Seminormal

sage.combinat.symmetric_group_representations.partition_to_vector_of_contents(partition, reverse=False)[source]

Return the “vector of contents” associated to partition.

EXAMPLES:

sage: from sage.combinat.symmetric_group_representations import partition_to_vector_of_contents
sage: partition_to_vector_of_contents([3,2])
(0, 1, 2, -1, 0)
>>> from sage.all import *
>>> from sage.combinat.symmetric_group_representations import partition_to_vector_of_contents
>>> partition_to_vector_of_contents([Integer(3),Integer(2)])
(0, 1, 2, -1, 0)