天天看點

判斷矩陣是否可約、表示是否可約

結論:

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;

}