GL(n,C)的有限子羣

D:\go20190906\src\IGroup>GLnC
GL(2,C)的8階子羣:bU=1,bO=0
0,Tr=(2.000,0.000)=>0,Tr=(2.000,0.000)
1,Tr=(-0.000,0.000)=>6,Tr=(0.000,0.000)
2,Tr=(0.000,0.000)=>7,Tr=(0.000,0.000)
3,Tr=(-2.000,0.000)=>3,Tr=(-2.000,0.000)
4,Tr=(0.000,0.000)=>5,Tr=(0.000,0.000)
5,Tr=(0.000,0.000)=>4,Tr=(0.000,0.000)
6,Tr=(0.000,0.000)=>1,Tr=(-0.000,0.000)
7,Tr=(0.000,0.000)=>2,Tr=(0.000,0.000)
GL(2,C)的8階子羣:
1 2 3 4 5 6 7 8
2 4 5 7 8 3 1 6
3 6 4 8 2 7 5 1
4 7 8 1 6 5 2 3
5 3 7 6 4 1 8 2
6 8 2 5 1 4 3 7
7 1 6 2 3 8 4 5
8 5 1 3 7 2 6 4
GL(1,C)的4階子羣:bU=1,bO=0
0,Tr=(1.000,0.000)=>0,Tr=(1.000,0.000)
1,Tr=(-0.000,1.000)=>3,Tr=(0.000,-1.000)
2,Tr=(-1.000,-0.000)=>2,Tr=(-1.000,-0.000)
3,Tr=(0.000,-1.000)=>1,Tr=(-0.000,1.000)
GL(1,C)的4階子羣:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
GL(1,C)的6階子羣:bU=1,bO=0
0,Tr=(1.000,0.000)=>0,Tr=(1.000,0.000)
1,Tr=(0.500,0.866)=>5,Tr=(0.500,-0.866)
2,Tr=(-0.500,0.866)=>4,Tr=(-0.500,-0.866)
3,Tr=(-1.000,0.000)=>3,Tr=(-1.000,0.000)
4,Tr=(-0.500,-0.866)=>2,Tr=(-0.500,0.866)
5,Tr=(0.500,-0.866)=>1,Tr=(0.500,0.866)
GL(1,C)的6階子羣:
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
5 6 1 2 3 4
6 1 2 3 4 5
GL(2,C)的16階子羣:bU=0,bO=0
0,Tr=(2.000,0.000)=>0,Tr=(2.000,0.000)
1,Tr=(-2.000,0.000)=>1,Tr=(-2.000,0.000)
2,Tr=(0.000,0.000)=>11,Tr=(0.000,0.000)
3,Tr=(0.000,0.000)=>3,Tr=(0.000,0.000)
4,Tr=(0.000,2.000)=>10,Tr=(0.000,-2.000)
5,Tr=(0.000,0.000)=>8,Tr=(0.000,0.000)
6,Tr=(0.000,0.000)=>13,Tr=(0.000,0.000)
7,Tr=(0.000,0.000)=>14,Tr=(0.000,0.000)
8,Tr=(0.000,0.000)=>5,Tr=(0.000,0.000)
9,Tr=(0.000,0.000)=>9,Tr=(0.000,0.000)
10,Tr=(0.000,-2.000)=>4,Tr=(0.000,2.000)
11,Tr=(0.000,0.000)=>2,Tr=(0.000,0.000)
12,Tr=(0.000,0.000)=>15,Tr=(0.000,0.000)
13,Tr=(0.000,0.000)=>6,Tr=(0.000,0.000)
14,Tr=(0.000,0.000)=>7,Tr=(0.000,0.000)
15,Tr=(0.000,0.000)=>12,Tr=(0.000,0.000)
GL(2,C)的16階子羣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 1 9 10 11 12 8 7 3 4 5 6 16 15 14 13
3 9 5 7 6 2 13 16 11 8 12 1 14 10 4 15
4 10 8 1 13 15 9 3 7 2 16 14 5 12 6 11
5 11 6 13 2 9 14 15 12 16 1 3 10 8 7 4
6 12 2 14 9 11 10 4 1 15 3 5 8 16 13 7
7 8 16 3 14 4 11 5 13 9 15 10 6 1 2 12
8 7 13 9 15 10 5 11 16 3 14 4 12 2 1 6
9 3 11 8 12 1 16 13 5 7 6 2 15 4 10 14
10 4 7 2 16 14 3 9 8 1 13 15 11 6 12 5
11 5 12 16 1 3 15 14 6 13 2 9 4 7 8 10
12 6 1 15 3 5 4 10 2 14 9 11 7 13 16 8
13 16 15 5 10 7 12 6 14 11 4 8 2 3 9 1
14 15 4 6 8 13 1 2 10 12 7 16 9 5 11 3
15 14 10 12 7 16 2 1 4 6 8 13 3 11 5 9
16 13 14 11 4 8 6 12 15 5 10 7 1 9 3 2
GL(2,C)的16階子羣:bU=1,bO=0
0,Tr=(2.000,0.000)=>0,Tr=(2.000,0.000)
1,Tr=(-2.000,0.000)=>1,Tr=(-2.000,0.000)
2,Tr=(0.000,2.000)=>3,Tr=(0.000,-2.000)
3,Tr=(0.000,-2.000)=>2,Tr=(0.000,2.000)
4,Tr=(0.000,0.000)=>4,Tr=(0.000,0.000)
5,Tr=(0.000,0.000)=>5,Tr=(0.000,0.000)
6,Tr=(0.000,0.000)=>7,Tr=(0.000,0.000)
7,Tr=(0.000,0.000)=>6,Tr=(0.000,0.000)
8,Tr=(0.000,0.000)=>8,Tr=(0.000,0.000)
9,Tr=(0.000,0.000)=>9,Tr=(0.000,0.000)
10,Tr=(0.000,0.000)=>11,Tr=(0.000,0.000)
11,Tr=(0.000,0.000)=>10,Tr=(0.000,0.000)
12,Tr=(0.000,0.000)=>12,Tr=(0.000,0.000)
13,Tr=(0.000,0.000)=>13,Tr=(0.000,0.000)
14,Tr=(0.000,0.000)=>15,Tr=(0.000,0.000)
15,Tr=(0.000,0.000)=>14,Tr=(0.000,0.000)
GL(2,C)的16階子羣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15
3 4 2 1 7 8 6 5 11 12 10 9 15 16 14 13
4 3 1 2 8 7 5 6 12 11 9 10 16 15 13 14
5 6 7 8 1 2 3 4 15 16 14 13 12 11 9 10
6 5 8 7 2 1 4 3 16 15 13 14 11 12 10 9
7 8 6 5 3 4 2 1 14 13 16 15 9 10 11 12
8 7 5 6 4 3 1 2 13 14 15 16 10 9 12 11
9 10 11 12 16 15 13 14 1 2 3 4 7 8 6 5
10 9 12 11 15 16 14 13 2 1 4 3 8 7 5 6
11 12 10 9 13 14 15 16 3 4 2 1 6 5 8 7
12 11 9 10 14 13 16 15 4 3 1 2 5 6 7 8
13 14 15 16 11 12 10 9 8 7 5 6 1 2 3 4
14 13 16 15 12 11 9 10 7 8 6 5 2 1 4 3
15 16 14 13 10 9 12 11 5 6 7 8 3 4 2 1
16 15 13 14 9 10 11 12 6 5 8 7 4 3 1 2

#include<iostream>
#include<iomanip> 
#include<complex>
#include"IGroup.h"
using namespace std;

float g_M16[16][8]={
 {1,0,0,1,0,0,0,0},//I=Y^2
 {-1,0,0,-1,0,0,0,0},//-I=X^4
 {0,1,0,0,0,0,1,0},//X
 {0,1,1,0,1,1,-1,-1},//Y
 {0,0,0,0,1,0,0,1},//X^2
 {0,0,-1,0,0,1,0,0},//X^3
 {1,0,-1,-1,-1,-1,0,1},//XY
 {-1,0,1,1,1,1,0,-1},//YX=-XY
 {0,-1,0,0,0,0,-1,0},//-X
 {0,-1,-1,0,-1,-1,1,1},//-Y
 {0,0,0,0,-1,0,0,-1},//-X^2
 {0,0,1,0,0,-1,0,0},//-X^3
 {-1,-1,1,1,0,1,1,0},//X^2Y=YX^2
 {1,1,0,-1,1,0,-1,-1},//X^3Y
 {-1,-1,0,1,-1,0,1,1},//YX^3=-X^3Y
 {1,1,-1,-1,0,-1,-1,0}//-X^2Y=-YX^2
};

float g_P16[16][8]={
 {1,0,0,1,0,0,0,0},//I
 {-1,0,0,-1,0,0,0,0},//-I
 {0,0,0,0,1,0,0,1},//iI
 {0,0,0,0,-1,0,0,-1},//-iI
 {0,1,1,0,0,0,0,0},//X
 {0,-1,-1,0,0,0,0,0},//-X
 {0,0,0,0,0,1,1,0},//iX
 {0,0,0,0,0,-1,-1,0},//-iX
 {0,0,0,0,0,-1,1,0},//Y
 {0,0,0,0,0,1,-1,0},//-Y
 {0,1,-1,0,0,0,0,0},//iY
 {0,-1,1,0,0,0,0,0},//-iY
 {1,0,0,-1,0,0,0,0},//Z
 {-1,0,0,1,0,0,0,0},//-Z
 {0,0,0,0,1,0,0,-1},//iZ
 {0,0,0,0,-1,0,0,1}//-iZ
};    

typedef vector<vector<float> > MATRIXf;
typedef pair<MATRIXf,MATRIXf> CMATRIXf;

// GL(n,C)的N階有限子羣
struct GLnC:public IGroup
{
public:
   //  靜態函數
   static CMATRIXf IdentityMat(int n);
   static vector<CMATRIXf> FG(vector<CMATRIXf>& gen);
   static int getidx(vector<CMATRIXf> &Arr2,CMATRIXf &Arr1);
   static bool IsEqual(const MATRIXf &t,const MATRIXf &m);   
   static bool IsEqual(const CMATRIXf &t,const CMATRIXf &m);
   static MATRIXf add(const MATRIXf &t,const MATRIXf &m,int k=1);
   static MATRIXf sub(const MATRIXf &t,const MATRIXf &m);   
   static MATRIXf mul(const MATRIXf &t,const MATRIXf &m);   
   static CMATRIXf mul(const CMATRIXf &t,const CMATRIXf &m);   
   static CMATRIXf inv(const CMATRIXf &t);
   static vector<CMATRIXf> Order(const CMATRIXf & m); 
   static MATRIXf TransposedMat(const MATRIXf &m);   
   static CMATRIXf TransposedMat(const CMATRIXf &m);
   static CMATRIXf ConjugateMat(const CMATRIXf &m);  
   static bool IsUnitaryMat(const CMATRIXf &m);
   static bool IsOrthogonalMat(const CMATRIXf &m);   
   static float TraceMat(const MATRIXf &m);
   static complex<float> TraceMat(const CMATRIXf &m);   
   static GLnC CyclicGroup(int n);
   static GLnC QuaternionGroup(int n);
public:
   // 實現抽象基類的方法
   virtual void printSet();
   virtual void printTable();     
   virtual int mul(int a,int b);
   virtual int size();
   virtual int inv(int a);
   // 構造函數
   GLnC(){}// 默認構造函數
   GLnC(float* set,int n,int N);
   // 成員函數
   bool IsUnitaryGroup()const;  
   bool IsOrthogonalGroup()const;
   // 成員變量
   vector<CMATRIXf> s_Arr;
   int m_n;  
};

CMATRIXf GLnC::IdentityMat(int n){
    MATRIXf m0r(n,vector<float>(n,0));
    MATRIXf m0i(n,vector<float>(n,0));    
    for(int i=0;i<n;i++){
        m0r[i][i]=1;
    }
    CMATRIXf m0=make_pair(m0r,m0i);
    return m0;
}

vector<CMATRIXf> GLnC::FG(vector<CMATRIXf>& gen){
    vector<CMATRIXf> S;
    int n=gen[0].first.size();
    CMATRIXf m0=IdentityMat(n);
    S.push_back(m0);
    int R=gen.size();
    for(int i=0;i<R;i++){
        if(IsEqual(gen[i],m0))
            continue;
        S.push_back(gen[i]);
    }
    int cnt=R+1;
    int cnt1=R+1;
    do{
        cnt=S.size();
        for(int i=1;i<cnt;i++){
            for(int j=1;j<cnt;j++){
                CMATRIXf IJ=mul(S[i],S[j]);
                //vector<CMATRIXf>::iterator p=std::find(S.begin(),S.end(),IJ);// 請用下面的find_if語句,用這個會陷入死循環
                vector<CMATRIXf>::iterator p=std::find_if(S.begin(),S.end(),[IJ](CMATRIXf& m)->bool{return IsEqual(m,IJ);});
                if(p==S.end()){
                    S.push_back(IJ);
                }
            }
        }
        cnt1=S.size();
    }while(cnt1>cnt);    
   return S;
}

/* 
GL(1,C)的子羣圓羣的元素可表示爲複數cosθ+isinθ或1階復矩陣{{cosθ+isinθ}}
*/
GLnC GLnC::CyclicGroup(int n){
    MATRIXf mr(1,vector<float>(1,0));
    MATRIXf mi(1,vector<float>(1,0));    
    mr[0][0]=cos(2*3.141592654/n);
    mi[0][0]=sin(2*3.141592654/n);
    CMATRIXf m=make_pair(mr,mi);
    GLnC Cn;
    Cn.s_Arr=Order(m);
    Cn.m_n=1;
    return Cn;
}

GLnC GLnC::QuaternionGroup(int n){
    int n4=n/4;
    vector<CMATRIXf> gen(2);    
    MATRIXf mr(2,vector<float>(2,0));
    MATRIXf mi(2,vector<float>(2,0));    
    // 2n次本原單位根對應的復矩陣
    mr[0][0]=cos(3.141592654/n4);
    mr[0][1]=0;
    mr[1][0]=0;        
    mr[1][1]=cos(3.141592654/n4);
    mi[0][0]=sin(3.141592654/n4);
    mi[0][1]=0;
    mi[1][0]=0;        
    mi[1][1]=-sin(3.141592654/n4);
    gen[0]=make_pair(mr,mi);
    mr[0][0]=0;
    mr[0][1]=-1;
    mr[1][0]=1;        
    mr[1][1]=0;
    mi[0][0]=0;
    mi[0][1]=0;
    mi[1][0]=0;        
    mi[1][1]=0;
    gen[1]=make_pair(mr,mi);
    GLnC Qn;
    Qn.s_Arr=FG(gen);
    Qn.m_n=2;    
    return Qn;
}

// 矩陣D(R)的轉置D(R)^T
MATRIXf GLnC::TransposedMat(const MATRIXf &m){
    int nm=m.size();
    MATRIXf t(nm,vector<float>(nm,0));
    for(int i=0;i<nm;i++){
        for(int j=0;j<nm;j++){
            t[i][j]=m[j][i];
        }
    }
    return t;
}

// 矩陣D(R)的轉置D(R)^T
CMATRIXf GLnC::TransposedMat(const CMATRIXf &m){
    MATRIXf tr=TransposedMat(m.first);
    MATRIXf ti=TransposedMat(m.second);
    return make_pair(tr,ti);    
}

float GLnC::TraceMat(const MATRIXf &m){
    float Tr=0;
    int nm=m.size();
    for(int i=0;i<nm;i++){
        Tr+=m[i][i];
    }
    return Tr;
}

complex<float> GLnC::TraceMat(const CMATRIXf &m){
    float r=TraceMat(m.first);
    float i=TraceMat(m.second);
    return complex<float>(r,i);    
}

// 矩陣D(R)的複共軛D(R)*
CMATRIXf GLnC::ConjugateMat(const CMATRIXf &m){
    int nm=m.first.size();
    MATRIXf ci(nm,vector<float>(nm,0));    
    ci=sub(ci,m.second);
    return make_pair(m.first,ci);
}

/*
酉矩陣,即逆陣是複共軛轉置(或轉置複共軛):D(R)^*D(R)=I,detD(R)=±1,實正交矩陣的一種推廣
1902年,L.Autonne給出酉矩陣(幺正矩陣)的概念,即逆矩陣的轉置等於它的共軛矩陣;
同年他又得出結論:一個矩陣若滿足實矩陣、正交矩陣、酉矩陣中的兩個則另一個也成立。
*/
bool GLnC::IsUnitaryMat(const CMATRIXf &m){
    CMATRIXf t=ConjugateMat(TransposedMat(m));// 矩陣D(R)的轉置複共軛D(R)^*
    CMATRIXf m1=inv(m);
    bool IsU=IsEqual(t,m1);
    return IsU;
}

// 酉羣U(n)即由酉矩陣構成的線性羣,U(n)是一個非單連通非半單緊的單Lie羣。
bool GLnC::IsUnitaryGroup()const{
    int N=s_Arr.size();
    for(int i=0;i<N;i++){
        if(!IsUnitaryMat(s_Arr[i]))
            return false;
    }
    return true;
}

// 復正交矩陣:D(R)^TD(R)=I,detD(R)=±1,實正交矩陣的另一種推廣
bool GLnC::IsOrthogonalMat(const CMATRIXf &m){
    CMATRIXf t=TransposedMat(m);
    CMATRIXf m1=inv(m);
    bool IsO=IsEqual(t,m1);
    return IsO;
}

bool GLnC::IsOrthogonalGroup()const{
    int N=s_Arr.size();
    for(int i=0;i<N;i++){
        if(!IsOrthogonalMat(s_Arr[i]))
            return false;
    }
    return true;
}

int GLnC::getidx(vector<CMATRIXf> &Arr2,CMATRIXf &Arr1){
    int N=Arr2.size();
    for(int i=0;i<N;i++){
        if(IsEqual(Arr2[i],Arr1))
            return i;
    }
    return -1;
}

bool GLnC::IsEqual(const MATRIXf &t,const MATRIXf &m){
    int nt=t.size();
    int nm=m.size();
    if(nt!=nm)
        return false;
    for(int i=0;i<nt;i++){
        for(int j=0;j<nt;j++){
            if(abs(t[i][j]-m[i][j])>0.01)
                return false;
        }
    }
    return true;
}

bool GLnC::IsEqual(const CMATRIXf &t,const CMATRIXf &m){
    bool bE=IsEqual(t.first,m.first)&&IsEqual(t.second,m.second);
    return bE;
}

vector<CMATRIXf> GLnC::Order(const CMATRIXf & m){
    vector<CMATRIXf> ret;
    int nm=m.first.size();
    CMATRIXf mi=m;
    MATRIXf m0r(nm,vector<float>(nm,0));
    MATRIXf m0i(nm,vector<float>(nm,0));    
    for(int i=0;i<nm;i++){
        m0r[i][i]=1;
    }
    CMATRIXf m0=make_pair(m0r,m0i);
    ret.push_back(m0);
    while(!IsEqual(mi,m0)){
        ret.push_back(mi);
        mi=mul(mi,m);
    }
    return ret;
}

CMATRIXf GLnC::inv(const CMATRIXf &t){
    vector<CMATRIXf> S1=Order(t);
    int ord=S1.size();
    return S1[ord-1];    
}

/*
復矩陣乘法(A_1,A_2)×(B_1,B_2)=(A_1B_1-A_2B_2,A_1B_2+A_2B_1)=>二維實Banach代數中的乘法(複數乘法):(a_1,a_2)×(b_1,b_2)=(a_1b_1-a_2b_2,a_1b_2+a_2b_1)。
*/
CMATRIXf GLnC::mul(const CMATRIXf &t,const CMATRIXf &m){
    int nt=t.first.size();
    int nm=m.first.size();
    MATRIXf cr(nm,vector<float>(nm,0));
    MATRIXf ci(nm,vector<float>(nm,0));    
    if(nt!=nm)
        return make_pair(cr,ci);
    cr=sub(mul(t.first,m.first),mul(t.second,m.second));
    ci=add(mul(t.first,m.second),mul(t.second,m.first));    
    return make_pair(cr,ci);
}

MATRIXf GLnC::add(const MATRIXf &t,const MATRIXf &m,int k){
    int nt=t.size();
    int nm=m.size();
    MATRIXf c(nm,vector<float>(nm,0));
    if(nt!=nm)
        return c;
    for (int i=0;i<nm;i++){
        for (int j=0;j<nm;j++){ 
            c[i][j]=t[i][j]+k*m[i][j];
        }
    }
    return c;
}

MATRIXf GLnC::sub(const MATRIXf &t,const MATRIXf &m){
    return add(t,m,-1);
}

MATRIXf GLnC::mul(const MATRIXf &t,const MATRIXf &m){
    int nt=t.size();
    int nm=m.size();
    MATRIXf c(nm,vector<float>(nm,0));
    if(nt!=nm)
        return c;
    for (int i=0;i<nm;i++){
        for (int j=0;j<nm;j++){ 
            c[i][j]=0.0;
            for(int l=0;l<nm;l++)
                c[i][j]=c[i][j]+t[i][l]*m[l][j];
        }
    }
    return c;
}

GLnC::GLnC(float* set,int n,int N){
    m_n=n;
    MATRIXf vr(n,vector<float>(n,0));
    MATRIXf vi(n,vector<float>(n,0));    
    for(int i=0;i<N;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                vr[j][k]=*(set+n*n*2*i+n*j+k);
                vi[j][k]=*(set+n*n*2*i+n*n+n*j+k);                
            }            
        }
        s_Arr.push_back(make_pair(vr,vi));
    }
}

void GLnC::printSet(){
    bool bU=IsUnitaryGroup();
    bool bO=IsOrthogonalGroup();    
    printf("GL(%d,C)的%d階子羣:bU=%d,bO=%d\n",m_n,size(),bU,bO);
    for(int i=0;i<size();i++){
        int i1=inv(i);
        complex<float> tr=TraceMat(s_Arr[i]);
        complex<float> tr1=TraceMat(s_Arr[i1]);        
        cout<<setiosflags(ios::fixed)<<i<<",Tr="<<setprecision(3)<<tr<<"=>"<<i1<<",Tr="<<tr1<<endl;
    }
}

void GLnC::printTable(){
   printf("GL(%d,C)的%d階子羣:\n",m_n,size());
   printGroup(this);
}

int GLnC::mul(int a,int b){
    CMATRIXf A=s_Arr[a];
    CMATRIXf B=s_Arr[b];
    CMATRIXf C=mul(A,B);
    int idx=getidx(s_Arr,C);
    return idx;
}

int GLnC::inv(int a){
    CMATRIXf v=inv(s_Arr[a]);
    int idx=getidx(s_Arr,v);
    return idx;
}

int GLnC::size(){
    return s_Arr.size();    
}

int main(){
    GLnC Q8=GLnC::QuaternionGroup(8);
    Q8.printSet();    
    Q8.printTable();    
    
    GLnC C4=GLnC::CyclicGroup(4);
    C4.printSet();    
    C4.printTable();
    
    GLnC C6=GLnC::CyclicGroup(6);
    C6.printSet();    
    C6.printTable();
    
    GLnC _M16(&g_M16[0][0],2,sizeof(g_M16)/sizeof(g_M16[0]));
    _M16.printSet();
    _M16.printTable();    
    
    GLnC _P16(&g_P16[0][0],2,sizeof(g_P16)/sizeof(g_P16[0]));
    _P16.printSet();
    _P16.printTable();        
    
    return 0;
}    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章