結論:
1.如果χ是群G的一個不可約表示的特征标,則(χ|χ)=|G|=g。【這裡的特征标内積對應GAP中的ScalarProduct,與向量内積的定義保持一緻,有些文獻的定義相差一個系數1/|G|】
特征标内積為∑[R∈G]χ^j(R)*χ^j(R)=|χ^j(R)|^2—a_j=1—>∑[R∈G]|χ(R)|^2=g
注意:
有些文獻上定義特征标内積為(χ^i(R)|χ^j(R))=(1/g)∑[R∈G]χ^i(R)*χ^j(R)
則表示不可約的充要條件為(χ(R)|χ(R))=1
gap> [1,ComplexConjugate(E(3)),ComplexConjugate(E(3)^2)];
[ 1, E(3)^2, E(3) ]
gap> ScalarProduct([1,E(3),E(3)^2],[1,ComplexConjugate(E(3)),ComplexConjugate(E(3)^2)]);
3【是以[1,E(3),E(3)^2]、[ 1, E(3)^2, E(3) ]這2個C_3的1階複表示都是不可約的】
2.如果χ與χ'是兩個不同構的不可約表示的特征标,則(χ|χ')=0(正交關系)。
3.如果χ_1, χ_2, χ_h,是G的所有兩兩不同的不可約特征标,則G的每個表示的特征标φ,φ=∑[i=1->h]m_iχ_i,這裡m_i=(φ|χ_i)是非負整數,(φ|φ)= ∑[i=1->h]m_i^2。
我們有一個一般的定理:
如果φ是G的一個表示的特征标,則(φ|φ)是一個正整數n|G|,且表示不可約目前僅當(φ|φ)=|G|。
C_4、C_2×C_2的2階表示:
C_4=<(1234)>={{{1,0},{0,1}},{{0,1},{-1,0}},{{-1,0},{0,-1}},{{0,-1},{1,0}}{<}GL_2(R),1階元和2階元的表示矩陣是可約的
gap> ScalarProduct([2,0,0,0],[2,0,0,0]);
4【是以C_4的這個2階表示是不可約的】
C_2×C_2={(1),(12)(34),(13)(24),(14)(23)}={{{1,0},{0,1}},{{1,0},{0,-1}},{{-1,0},{0,1}},{{-1,0},{0,-1}}{<}GL_2(R):1階元和3個2階元的表示矩陣都是可約的
gap> ScalarProduct([2,0,0,-2],[2,0,0,-2]);
8【是以C_2×C_2的這個2階表示是可約的】
C_4={1,-1,i,-i}的1階忠實表示:1,-1,i,-i
a+bi->{{a,b},{-b,a}}
1->{{1,0},{0,1}},-1->{{-1,0},{0,-1}},i->{{0,1},{-1,0}},-i->{{0,-1},{1,0}}
gap> ScalarProduct([1,-1,E(4),-E(4)],[1,-1,-E(4),E(4)]);
4【是以C_4的這個1階複表示是不可約的】
S_3={(1,2,3),(2,1,3),(1,3,2),(3,2,1),(3,1,2),(2,3,1)} 的2階【維】表示:
{{1,0},{0,1}},{{-1,1},{0,1}},{{1,0},{1,-1}},{{0,-1},{-1,0}},{{-1,1},{-1,0}},{{0,-1},{1,-1}}
【1階元和2個2階元的表示矩陣是可約的,2個3階元和另外1個2階元"0,-1;-1,0"的表示矩陣是不可約的】其相應的特征标是
2,0,0,0,-1,-1
gap> ScalarProduct([2,0,0,0,-1,-1],[2,0,0,0,-1,-1]);
6【是以S_3的這個2階表示是不可約的】
gap> g:=SymmetricGroup(3);;L:=Irr(g);;n:=Size(L);;for i in [1..n] do Print(DegreeOfCharacter(a),"->X",i,"=",List(L[i]),"\n");od;
1->X1=[ 1, -1, 1 ]
1->X2=[ 2, 0, -1 ]
1->X3=[ 1, 1, 1 ]
gap> g:=SymmetricGroup(3);;L:=Irr(g);;n:=Size(L);;for i in [1..n] do for j in [1..n] do Print("X",i,"X",j,"=",ScalarProduct(L[i],L[j]),"\n");od;od;
X1X1=1
X1X2=0
X1X3=0
X2X1=0
X2X2=1
X2X3=0
X3X1=0
X3X2=0
X3X3=1
1 -> 1
2 -> 2
3 -> 2
4 -> 3
5 -> 3
6 -> 2
N1= 6
D3的中心Z(D_3): [1]
D3的換位子群(D_3)': [1,4,5]
D3的群元階的分布: [1,3,2,0]
D3每個共轭類: [[1],[2,3,6],[4,5]]
D3每個共轭類的長度: [1,2,3]
[email protected]:/home/cpptest# ./ReachableMatrix "0,-1;1,0"
A=[[0 ,-1 ],[1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩陣不可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "-1,0;0,-1"
A=[[-1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩陣可約
Tr(A)=-2
[email protected]:/home/cpptest# ./ReachableMatrix "0,1;-1,0"
A=[[0 ,1 ],[-1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩陣不可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "1,0;0,1"
A=[[1 ,0 ],[0 ,1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩陣可約
Tr(A)=2
[email protected]:/home/cpptest# ./ReachableMatrix "1,0;0,-1"
A=[[1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩陣可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "-1,0;0,1"
A=[[-1 ,0 ],[0 ,1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩陣可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "-1,0;0,-1"
A=[[-1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩陣可約
Tr(A)=-2
[email protected]:/home/cpptest# ./ReachableMatrix "-1,0;0,-1"
A=[[-1 ,0 ],[0 ,-1 ]]
RA=[[1 ,0 ],[0 ,1 ]]矩陣可約
Tr(A)=-2
[email protected]:/home/cpptest# ./ReachableMatrix "-1,1;0,1"
A=[[-1 ,1 ],[0 ,1 ]]
RA=[[1 ,1 ],[0 ,1 ]]矩陣可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "1,0;1,-1"
A=[[1 ,0 ],[1 ,-1 ]]
RA=[[1 ,0 ],[1 ,1 ]]矩陣可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "0,-1;-1,0"
A=[[0 ,-1 ],[-1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩陣不可約
Tr(A)=0
[email protected]:/home/cpptest# ./ReachableMatrix "-1,1;-1,0"
A=[[-1 ,1 ],[-1 ,0 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩陣不可約
Tr(A)=-1
[email protected]:/home/cpptest# ./ReachableMatrix "0,-1;1,-1"
A=[[0 ,-1 ],[1 ,-1 ]]
RA=[[1 ,1 ],[1 ,1 ]]矩陣不可約
Tr(A)=-1
[email protected]:/home/cpptest# ./ReachableMatrix "4,1,2,3;0,2,3,2;0,3,5,8;0,5,0,8"
A=[[4 ,1 ,2 ,3 ],[0 ,2 ,3 ,2 ],[0 ,3 ,5 ,8 ],[0 ,5 ,0 ,8 ]]
RA=[[1 ,1 ,1 ,1 ],[0 ,1 ,1 ,1 ],[0 ,1 ,1 ,1 ],[0 ,1 ,1 ,1 ]]矩陣可約
Tr(A)[email protected]:/home/cpptest# ./ReachableMatrix "1, 0, 0, 0, 0, 0;0, 1, 0, 0, 0, 0;0, 0, 1, 0, 0, 0;0, 0, 0, 1, 0, 0;0, 0, 0, 0, 1, 0;0, 0, 0, 0, 0, 1"
A=[[1 ,0 ,0 ,0 ,0 ,0 ],[0 ,1 ,0 ,0 ,0 ,0 ],[0 ,0 ,1 ,0 ,0 ,0 ],[0 ,0 ,0 ,1 ,0 ,0 ],[0 ,0 ,0 ,0 ,1 ,0 ],[0 ,0 ,0 ,0 ,0 ,1 ]]
RA=[[1 ,0 ,0 ,0 ,0 ,0 ],[0 ,1 ,0 ,0 ,0 ,0 ],[0 ,0 ,1 ,0 ,0 ,0 ],[0 ,0 ,0 ,1 ,0 ,0 ],[0 ,0 ,0 ,0 ,1 ,0 ],[0 ,0 ,0 ,0 ,0 ,1 ]]矩陣可約
Tr(A)=6
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
// 矩陣的迹Trρ(g)稱為表示的特征标
int TraceMat(const vector<vector<int> >&Matrix)
{
int Tr=0;
int n=Matrix.size();
for(int i=0;i<n;i++){
Tr+=Matrix[i][i];
}
return Tr;
}
// 傳回n階機關矩陣
vector<vector<int> > IdentityMat(int n)
{
vector<vector<int> > Matrix(n, vector<int>(n,0));
for(int i=0;i<n;i++){
Matrix[i][i]=1;
}
return Matrix;
}
// 求矩陣A的可達矩陣RA
// 根據可達矩陣來判斷矩陣的可約性;若可達矩陣中至少有一個元素為0時,則矩陣為可約矩陣;若可達矩陣中每個元素都為1,則矩陣是不可約的。
vector<vector<int> > ReachableMatrix(const vector<vector<int> >&Matrix,bool *pIrr=NULL)
{
int n=Matrix.size();
vector<vector<int> > In=IdentityMat(n);
vector<vector<int> > Matrix1(n, vector<int>(n,0));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
Matrix1[i][j]=In[i][j]||Matrix[i][j];
}
}
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
for (int k=0;k<n;k++)
{
Matrix1[j][k]=Matrix1[j][k]||(Matrix1[j][i]&&Matrix1[i][k]);
}
}
}
// 輸出參數用來存放矩陣是否可約
if(pIrr)
{
(*pIrr)=true;// 矩陣不可約
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (Matrix1[i][j]!=1)
{
(*pIrr)=false;// 矩陣可約
return Matrix1;
}
}
}
}
return Matrix1;
}
string itos(int a)
{
char sz[20]={0};
sprintf(sz,"%d",a);
return sz;
}
string MStr(const vector<vector<int> >&Matrix)
{
string str="[";
for(int i=0;i<Matrix.size();i++){
str+="[";
for(int j=0;j<Matrix[i].size();j++){
str+=itos(Matrix[i][j])+" ";
if(j<Matrix[i].size()-1)
str+=",";
}
str+="]";
if(i<Matrix.size()-1)
str+=",";
}
str+="]";
return str;
}
std::vector<string> split( const std::string& str, const std::string& delims, unsigned int maxSplits = 0)
{
std::vector<string> ret;
unsigned int numSplits = 0;
// Use STL methods
size_t start, pos;
start = 0;
do
{
pos = str.find_first_of(delims, start);
if (pos == start)
{
// Do nothing
start = pos + 1;
}
else if (pos == std::string::npos || (maxSplits && numSplits == maxSplits))
{
// Copy the rest of the std::string
ret.push_back( str.substr(start) );
break;
}
else
{
// Copy up to delimiter
ret.push_back( str.substr(start, pos - start) );
start = pos + 1;
}
// parse up to next real data
start = str.find_first_not_of(delims, start);
++numSplits;
} while (pos != std::string::npos);
return ret;
}
vector<vector<int> > atoMat(const char *str)
{
vector<string> vs;
vector<int> vi(2);
int rows=0;
int cols=0;
if(str!=NULL)
{
vs=split(str,";");
rows=vs.size();
vi[0]=rows;
for(int i=0;i<vs.size();i++)
{
vector<string> vsi=split(vs[i],",");
if(cols>0 && vsi.size()!=cols)
{
vi.clear();
vector<vector<int> > vv;
return vv;
}
cols=vsi.size();
vi[1]=cols;
for(int j=0;j<vsi.size();j++)
{
vi.push_back(atoi(vsi[j].c_str()));
}
}
}
else
{
vi.clear();
}
vector<vector<int> > vv(rows, vector<int>(cols,0));
for(int k=0;k<vi.size()-2;k++)
{
int i=k/cols;
int j=k%cols;
vv[i][j]=vi[k+2];
}
return vv;
}
int main(int argc, char *argv[])
{
char sz[1024]={0};
char sz1[1024]={0};
if(argc<2)
{
printf("請輸入矩陣A:");
scanf("%s",&sz);
}
else
{
strcpy(sz,argv[1]);
}
// #if 1
// vector<vector<int> > A=atoMat("4,1,2,3;0,2,3,2;0,3,5,8;0,5,0,8");
// #else
// int a[4][4]={{4,1,2,3},{0,2,3,2},{0,3,5,8},{0,5,0,8}};
// vector<vector<int> > A(4, vector<int>(4,0));
// for(int i=0;i<4;i++)
// memcpy(&A[i][0],&a[i][0],sizeof(int)*4);
// #endif
vector<vector<int> > A=atoMat(sz);
cout<<"A="<<MStr(A)<<endl;
bool bIrr;
vector<vector<int> > RA=ReachableMatrix(A,&bIrr);
cout<<"RA="<<MStr(RA)<<(bIrr?"矩陣不可約":"矩陣可約")<<endl;
cout<<"Tr(A)="<<TraceMat(A)<<endl;
return EXIT_SUCCESS;
}