In the explanations below, we use the standard representation of \(S_3\), which corresponds to the 2D representation of \(S_3\) permuting the vertices of a triangle.
S3 = replab.S(3);
rep = S3.irrep([2 1], 'seminormal');
From a representation, one can return another representation similar under a change of basis: \(\rho_g \to T \rho_g T^{-1}\)
T = [1 0; 0 -1];
sim = rep.similarRep(T)
sim =
Real subrepresentation
dimension: 2
field: 'R'
group: Symmetric group acting on 3 elements
isUnitary: false
parent: Real representation
basis(1,'exact'): [1; 0]
basis(2,'exact'): [0; -1]
The original representation is called the parent, and the change of basis matrix is available through the basis method.
At construction, one can provide the inverse of the basis change, if known, so it does not need to be recomputed.
T = [1 0; 0 -1];
rep.similarRep(T, 'inverse', inv(T))
ans =
Real subrepresentation
dimension: 2
field: 'R'
group: Symmetric group acting on 3 elements
isUnitary: false
parent: Real representation
basis(1,'exact'): [1; 0]
basis(2,'exact'): [0; -1]
Given a non-unitary representation, we can automatically construct a unitary similar representation. The method unitarize computes this similar representation.
uni = rep.unitarize;
basis = uni.basis
uni.isUnitary
basis =
0.9258 0
0 1.0690
ans = 1
Given a representation over \(\mathbb{R}\), one can easily construct a representation over \(\mathbb{C}\) by extending the field of scalars through the complexification method.
rep.complexification
ans =
Encoding of representation: R^d -> C^d
dimension: 2
field: 'C'
group: Symmetric group acting on 3 elements
isUnitary: false
parent: Real representation
type: 'R^d -> C^d'
Given a representation, one can compute the conjugate representation; of course this has an effect only on complex-valued representations. The standard conj syntax is available for that purpose.
C4 = replab.C(4);
repC4 = C4.repByImages('C', 1, 'preimages', {[2 3 4 1]}, 'images', {[1i]});
img = repC4.image([2 3 4 1])
conjRep = conj(repC4);
conjImg = conjRep.image([2 3 4 1])
img = 0 + 1i
conjImg = 0 - 1i
The dual representation has images that are the transpose of the inverse of the original images; it is computed through the dual method.
img = rep.image([2 3 1]);
img1 = inv(img).'
dualRep = dual(rep);
img2 = dualRep.image([2 3 1])
img1 =
-0.5000 1.0000
-0.7500 -0.5000
img2 =
-0.5000 1.0000
-0.7500 -0.5000
Given two (or more!) representations of the same group, one can compute their tensor product. For that purpose, we provide an overload of the standard kron MATLAB/Octave syntax.
rep2 = kron(rep, rep)
rep2.image([2 3 1])
rep2 =
Real tensor representation
dimension: 4
field: 'R'
group: Symmetric group acting on 3 elements
isUnitary: false
factor(1): Real representation
factor(2): Real representation
ans =
0.2500 -0.3750 -0.3750 0.5625
0.5000 0.2500 -0.7500 -0.3750
0.5000 -0.7500 0.2500 -0.3750
1.0000 0.5000 0.5000 0.2500
We have a dedicated method tensorPower to computing the tensor product of several identical representations.
rep2 = rep.tensorPower(2);
rep2.image([2 3 1])
ans =
0.2500 -0.3750 -0.3750 0.5625
0.5000 0.2500 -0.7500 -0.3750
0.5000 -0.7500 0.2500 -0.3750
1.0000 0.5000 0.5000 0.2500
Given two (or more) representations, one can compute their direct sum, whose images are block-diagonal matrices; this is provided through the overload of the standard blkdiag syntax.
rep2 = blkdiag(rep, rep)
rep2.image([2 3 1])
rep2 =
Real direct sum representation
dimension: 4
field: 'R'
group: Symmetric group acting on 3 elements
isUnitary: false
factor(1): Real representation
factor(2): Real representation
ans =
-0.5000 0.7500 0 0
-1.0000 -0.5000 0 0
0 0 -0.5000 0.7500
0 0 -1.0000 -0.5000