CITE THIS NOTEBOOK: Obtaining a unitary representation for a given group by Hans Dolhaine. Wolfram Community DEC 6 2022.
Assume you have a set of matrices which are a representation for a given group. It may occur that this representation has to be unitary.
In this notebook the necessary calculations to transform a given to a unitary representation are shown. The underlying math is described here
​https://www.mathe2.uni-bayreuth.de/match/online/dolhaine.pdf​
on pages 45 to 47.
If you have a set of matrices,for example these
gT=
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
,
0
I
0
0
-I
0
-1-I
0
0
1-I
0
I
1-I
0
-I
0
,
1
0
1-I
0
0
-1
0
1-I
0
0
-1
0
0
0
0
1
,
0
-I
0
1+I
-I
0
0
0
0
-1+I
0
-I
1-I
0
-I
0
;
lg=Length[gT]
4
which form a representation of a group : that means, the Identity - matrix is contained in the set as well as any product of two matrices
multab=Table[Position[gT,gT[[i]].gT[[j]]][[1,1]],{i,1,lg},{j,1,lg}];​​MatrixForm[multab]
1
2
3
4
2
3
4
1
3
4
1
2
4
1
2
3
But the matrices of this representations are not unitary :
MatrixForm/@(ConjugateTranspose[#].#&/@gT)

1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
,
3
0
2-2
0
0
3
0
-1+
2+2
0
3
0
0
-1-
0
1
,
1
0
1-
0
0
1
0
-1+
1+
0
3
0
0
-1-
0
3
,
3
0
1-
0
0
3
0
-2+2
1+
0
1
0
0
-2-2
0
3

To construct from the given representation a unitary representation form matrix mH
mH=Sum[ConjugateTranspose[gT[[i]]].gT[[i]],{i,1,lg}];​​mH//MatrixForm
8
0
4-4
0
0
8
0
-4+4
4+4
0
8
0
0
-4-4
0
8
From this stage on I proceed with umerical data as general expressions could become rather lengthy
Eigenvalues[N[mH]]//Chop
{13.6569,13.6569,2.34315,2.34315}
Calculate the Eigenvectors of mH and orthogonalize them and take into account, that the Eigenvectors given here are a list and not a matrix. This list has to be transposed
mX=Eigenvectors[N[mH]];​​mX1=Transpose[Orthogonalize[mX]]//Chop​​
{{0.0919562-0.202304,0.474667-0.474667,0.707107,0},{-0.474667+0.474667,0.202304-0.0919562,0,0.707107},{0.208073-0.0780274,0.67128,-0.5-0.5,0},{0.67128,-0.208073-0.0780274,0,0.5+0.5}}
mX1 is unitary
ConjugateTranspose[mX1].mX1//Chop//MatrixForm
1.
0
0
0
0
1.
0
0
0
0
1.
0
0
0
0
1.
and mX1 diagonalizes matrix mH
mD=Chop[ConjugateTranspose[mX1].mH.mX1];​​mD//MatrixForm
13.6569
0
0
0
0
13.6569
0
0
0
0
2.34315
0
0
0
0
2.34315
Calculate Sqrt[mD] and Sqrt[mD^(-1)]
mD2=Map[If[#0,0,Sqrt[#]]&,mD,{2}]​​mD2m=Map[If[#0,0,1/Sqrt[#]]&,mD,{2}]
{{3.69552,0,0,0},{0,3.69552,0,0},{0,0,1.53073,0},{0,0,0,1.53073}}
{{0.270598,0,0,0},{0,0.270598,0,0},{0,0,0.653281,0},{0,0,0,0.653281}}
and get the new representation gTu
gTu=mD2.ConjugateTranspose[mX1].#.mX1.mD2m&/@gT;​​ColumnForm[MatrixForm/@Chop[gTu]]
1.
0
0
0
0
1.
0
0
0
0
1.
0
0
0
0
1.
-0.0740741+0.197531
0.0459207-0.0526175
0.67128-0.67128
-0.202304+0.0919562
0.637269
0.0740741-0.197531
-0.130046+0.286101
-0.474667+0.474667
-0.474667-0.474667
0.0919562+0.202304
0
0.707107
-0.286101-0.130046
-0.67128-0.67128
0
0
-0.567431
0.395062+0.148148
0.0919562+0.202304
0.474667+0.474667
0.395062-0.148148
0.567431
0.474667+0.474667
-0.202304-0.0919562
0.0919562-0.202304
0.474667-0.474667
-0.707107
0
0.474667-0.474667
-0.202304+0.0919562
0
0.707107
-0.0740741-0.197531
-0.637269
-0.474667+0.474667
-0.286101+0.130046
0.0459207+0.0526175
0.0740741+0.197531
0.0919562-0.202304
-0.67128+0.67128
0.67128+0.67128
-0.130046-0.286101
0
0
-0.202304-0.0919562
-0.474667-0.474667
-0.707107
0
This representation is unitary, as wanted:
MatrixForm/@Chop[ConjugateTranspose[#].#&/@gTu]

1.
0
0
0
0
1.
0
0
0
0
1.
0
0
0
0
1.
,
1.
0
0
0
0
1.
0
0
0
0
1.
0
0
0
0
1.
,
1.
0
0
0
0
1.
0
0
0
0
1.
0
0
0
0
1.
,
1.
0
0
0
0
1.
0
0
0
0
1.
0
0
0
0
1.

Position does not work properly on this type of matrices
Position[gTu,gTu[[1]].gTu[[2]]]
{}
so get a specialized one
mypos[i_,j_]:=Position[DeleteDuplicates[Flatten[Chop[gTu[[i]].gTu[[j]]-#]]]&/@gTu,{0}][[1,1]]
Table[mypos[i,j],{i,1,lg},{j,1,lg}]//MatrixForm​​multab//MatrixForm​​
1
2
3
4
2
3
4
1
3
4
1
2
4
1
2
3
1
2
3
4
2
3
4
1
3
4
1
2
4
1
2
3
Knowing the history of gT I define a similarity transformation
tM=
0
-1
0
1
1
0
1
0
0
1
0
I
1
0
-I
0
;
and get a representation which is unitary as well (even orthogonal) and gives the same multab
gTnew2=tM.#.Inverse[tM]&/@gT;​​MatrixForm/@gTnew2​​MatrixForm/@(ConjugateTranspose[#].#&/@gTnew2)​​Table[Position[gT,gT[[i]].gT[[j]]][[1,1]],{i,1,lg},{j,1,lg}]//MatrixForm​​

1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
,
0
1
0
0
0
0
1
0
0
0
0
1
1
0
0
0
,
0
0
1
0
0
0
0
1
1
0
0
0
0
1
0
0
,
0
0
0
1
1
0
0
0
0
1
0
0
0
0
1
0


1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
,
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
,
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
,
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1

1
2
3
4
2
3
4
1
3
4
1
2
4
1
2
3