5.1 Constructing representations

Representations can be constructed on a variety of groups.

Trivial representation

The trivial representation maps all group elements to the identity matrix. It can be constructed for any compact group using the trivialRep method. One picks the field ('R' or 'C') and the dimension.

S3 = replab.S(3);
rep = S3.trivialRep('R', 3)
rep =

Orthogonal trivial reducible representation
   dimension: 3
       field: 'R'
       group: Symmetric group acting on 3 elements
isExactValue: true
   isUnitary: true

Not very interesting in itself, the trivial representation is useful as part of larger constructions.

By images of generators

For finite groups, we define representations from images of the generators. For example, the sign representation of a permutation is one-dimensional, and the images are \(1\) for even permutations, \(-1\) for odd permutations. The sign of a transposition is always odd, so, by picking the generators [2 1 3] and [1 3 2], we construct the sign representation of \(S_3\) pretty easily.

S3 = replab.S(3);
rep = S3.repByImages('R', 1, 'preimages', {[2 1 3], [1 3 2]}, 'images', {[-1], [-1]})
rep.image([2 3 1])
rep =

Orthogonal representation
   dimension: 1
       field: 'R'
       group: Symmetric group acting on 3 elements
   isUnitary: true
preimages{1}: [2, 1, 3]
   images{1}: -1
preimages{2}: [1, 3, 2]
   images{2}: -1

ans = 1

While RepLAB has experimental support for inexact representations, it is best to provide exact images. If the images have integer entries, it is sufficient to provide standard MATLAB/Octave floating-point matrices. Beyond that, RepLAB supports images in the cyclotomic field, and those need to be encoded in a particular way (we do not support the Symbolic Toolbox of either MATLAB or Octave).

The simplest is to provide images as cyclotomic matrices constructed from a string, taking care to separate the columns with commas.

S3 = replab.S(3);
img_231 = replab.cyclotomic('[-1/2, 3/4; -1, -1/2]');
img_213 = replab.cyclotomic('[1, 0; 0, -1]');
rep = S3.repByImages('R', 2, 'preimages', {[2 3 1], [2 1 3]}, 'images', {img_231, img_213})
rep.image([2 3 1])
rep =

Real representation
    dimension: 2
        field: 'R'
        group: Symmetric group acting on 3 elements
inverseImages: {[-1/2, -3/4; 1, -1/2], [1, 0; 0, -1]}
    isUnitary: false
 preimages{1}: [2, 3, 1]
    images{1}: [-1/2, 3/4; -1, -1/2]
 preimages{2}: [2, 1, 3]
    images{2}: [1, 0; 0, -1]

ans =

  -0.5000   0.7500
  -1.0000  -0.5000

To check whether the representation is defined correctly, one can simply run a few randomized checks.

rep.check
Checking commutes with commutant algebra...
Checking composition...
Checking identity...
Checking matrixColAction...
Checking matrixRowAction...
Checking respects division algebra...
Checking unitary...
Checking withTorusImage->torusImage...

Natural/defining representations

Permutation groups have a natural representation that permutes Euclidean coordinates. While there are two choices on how to encode a permutation as a permutation matrix, there is only one choice that obeys \(\rho_{g \cdot h} = \rho_g \cdot \rho_h\), which is the one that RepLAB provides.

S3 = replab.S(3);
rep = S3.naturalRep;
rep.image([2 3 1])
ans =

   0   0   1
   1   0   0
   0   1   0

Classical compact matrix groups have a defining representation, which simply returns the matrix element.

U2 = replab.U(2);
rep = U2.definingRep;
g = U2.sample
img = rep.image(g)
g =

   0.6632 + 0.7012i   0.1530 + 0.2122i
   0.2144 + 0.1499i  -0.7109 - 0.6528i

img =

   0.6632 + 0.7012i   0.1530 + 0.2122i
   0.2144 + 0.1499i  -0.7109 - 0.6528i

Irreducible representations of \(S_n\)

RepLAB provides three constructions of the irreducible representations of the symmetric group: Specht modules, seminormal and orthogonal representations. Those irreducible representations are indexed by Young diagrams, which are simply written as integer row vectors.

The constructions below are similar to the ones proposed by Sage, though we wrote an independent implementation.

S3 = replab.S(3);
youngDiagram = [2 1];
repSpecht = S3.irrep(youngDiagram, 'specht');
repSeminormal = S3.irrep(youngDiagram, 'seminormal');
repOrthogonal = S3.irrep(youngDiagram, 'orthogonal');
g = [2 3 1];
imgSpecht = repSpecht.image(g, 'exact')
imgSeminormal = repSeminormal.image(g, 'exact')
imgOrthogonal = repOrthogonal.image(g, 'exact')
ans =
  -1  -1  
   1   0  
ans =
  -1/2   3/4  
   -1   -1/2  
ans =
     -1/2     sqrt(3)/2  
  -sqrt(3)/2    -1/2