GL(n,R)的有限子羣

D:\go20190906\src\IGroup>GLnR
GL(2,R)的4階子羣:bO=1
0->Det=1,Tr=2.000=>0->Det=1,Tr=2.000
1->Det=1,Tr=-0.000=>3->Det=1,Tr=0.000
2->Det=1,Tr=-2.000=>2->Det=1,Tr=-2.000
3->Det=1,Tr=0.000=>1->Det=1,Tr=-0.000
GL(2,R)的4階子羣:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
GL(2,R)的6階子羣:bO=1
0->Det=1,Tr=2.000=>0->Det=1,Tr=2.000
1->Det=1,Tr=1.000=>5->Det=1,Tr=1.000
2->Det=1,Tr=-1.000=>4->Det=1,Tr=-1.000
3->Det=1,Tr=-2.000=>3->Det=1,Tr=-2.000
4->Det=1,Tr=-1.000=>2->Det=1,Tr=-1.000
5->Det=1,Tr=1.000=>1->Det=1,Tr=1.000
GL(2,R)的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,R)的6階子羣:bO=0
0->Det=1,Tr=2.000=>0->Det=1,Tr=2.000
1->Det=-1,Tr=0.000=>1->Det=-1,Tr=0.000
2->Det=-1,Tr=0.000=>2->Det=-1,Tr=0.000
3->Det=-1,Tr=0.000=>3->Det=-1,Tr=0.000
4->Det=1,Tr=-1.000=>5->Det=1,Tr=-1.000
5->Det=1,Tr=-1.000=>4->Det=1,Tr=-1.000
GL(2,R)的6階子羣:
1 2 3 4 5 6
2 1 6 5 4 3
3 5 1 6 2 4
4 6 5 1 3 2
5 3 4 2 6 1
6 4 2 3 1 5
3階子羣[0,4,5]:
1 2 3
2 3 1
3 1 2
GL(2,R)的6階子羣:bO=1
0->Det=1,Tr=2.000=>0->Det=1,Tr=2.000
1->Det=1,Tr=-1.000=>2->Det=1,Tr=-1.000
2->Det=1,Tr=-1.000=>1->Det=1,Tr=-1.000
3->Det=-1,Tr=0.000=>3->Det=-1,Tr=0.000
4->Det=-1,Tr=0.000=>4->Det=-1,Tr=0.000
5->Det=-1,Tr=0.000=>5->Det=-1,Tr=0.000
GL(2,R)的6階子羣:
1 2 3 4 5 6
2 3 1 6 4 5
3 1 2 5 6 4
4 5 6 1 2 3
5 6 4 3 1 2
6 4 5 2 3 1
3階子羣[0,1,2]:
1 2 3
2 3 1
3 1 2
GL(4,R)的24階子羣:bO=1
0->Det=1,Tr=4.000=>0->Det=1,Tr=4.000
1->Det=-1,Tr=2.000=>1->Det=-1,Tr=2.000
2->Det=-1,Tr=2.000=>2->Det=-1,Tr=2.000
3->Det=1,Tr=1.000=>4->Det=1,Tr=1.000
4->Det=1,Tr=1.000=>3->Det=1,Tr=1.000
5->Det=-1,Tr=2.000=>5->Det=-1,Tr=2.000
6->Det=-1,Tr=2.000=>6->Det=-1,Tr=2.000
7->Det=1,Tr=0.000=>7->Det=1,Tr=0.000
8->Det=1,Tr=1.000=>12->Det=1,Tr=1.000
9->Det=-1,Tr=0.000=>18->Det=-1,Tr=0.000
10->Det=-1,Tr=0.000=>13->Det=-1,Tr=0.000
11->Det=1,Tr=1.000=>19->Det=1,Tr=1.000
12->Det=1,Tr=1.000=>8->Det=1,Tr=1.000
13->Det=-1,Tr=0.000=>10->Det=-1,Tr=0.000
14->Det=-1,Tr=2.000=>14->Det=-1,Tr=2.000
15->Det=1,Tr=1.000=>20->Det=1,Tr=1.000
16->Det=1,Tr=0.000=>16->Det=1,Tr=0.000
17->Det=-1,Tr=0.000=>22->Det=-1,Tr=0.000
18->Det=-1,Tr=0.000=>9->Det=-1,Tr=0.000
19->Det=1,Tr=1.000=>11->Det=1,Tr=1.000
20->Det=1,Tr=1.000=>15->Det=1,Tr=1.000
21->Det=-1,Tr=2.000=>21->Det=-1,Tr=2.000
22->Det=-1,Tr=0.000=>17->Det=-1,Tr=0.000
23->Det=1,Tr=0.000=>23->Det=1,Tr=0.000
GL(4,R)的24階子羣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
2 1 5 6 3 4 8 7 11 12 9 10 19 20 21 22 23 24 13 14 15 16 17 18
3 4 1 2 6 5 13 14 15 16 17 18 7 8 9 10 11 12 20 19 23 24 21 22
4 3 6 5 1 2 14 13 17 18 15 16 20 19 23 24 21 22 7 8 9 10 11 12
5 6 2 1 4 3 19 20 21 22 23 24 8 7 11 12 9 10 14 13 17 18 15 16
6 5 4 3 2 1 20 19 23 24 21 22 14 13 17 18 15 16 8 7 11 12 9 10
7 8 9 10 11 12 1 2 3 4 5 6 15 16 13 14 18 17 21 22 19 20 24 23
8 7 11 12 9 10 2 1 5 6 3 4 21 22 19 20 24 23 15 16 13 14 18 17
9 10 7 8 12 11 15 16 13 14 18 17 1 2 3 4 5 6 22 21 24 23 19 20
10 9 12 11 7 8 16 15 18 17 13 14 22 21 24 23 19 20 1 2 3 4 5 6
11 12 8 7 10 9 21 22 19 20 24 23 2 1 5 6 3 4 16 15 18 17 13 14
12 11 10 9 8 7 22 21 24 23 19 20 16 15 18 17 13 14 2 1 5 6 3 4
13 14 15 16 17 18 3 4 1 2 6 5 9 10 7 8 12 11 23 24 20 19 22 21
14 13 17 18 15 16 4 3 6 5 1 2 23 24 20 19 22 21 9 10 7 8 12 11
15 16 13 14 18 17 9 10 7 8 12 11 3 4 1 2 6 5 24 23 22 21 20 19
16 15 18 17 13 14 10 9 12 11 7 8 24 23 22 21 20 19 3 4 1 2 6 5
17 18 14 13 16 15 23 24 20 19 22 21 4 3 6 5 1 2 10 9 12 11 7 8
18 17 16 15 14 13 24 23 22 21 20 19 10 9 12 11 7 8 4 3 6 5 1 2
19 20 21 22 23 24 5 6 2 1 4 3 11 12 8 7 10 9 17 18 14 13 16 15
20 19 23 24 21 22 6 5 4 3 2 1 17 18 14 13 16 15 11 12 8 7 10 9
21 22 19 20 24 23 11 12 8 7 10 9 5 6 2 1 4 3 18 17 16 15 14 13
22 21 24 23 19 20 12 11 10 9 8 7 18 17 16 15 14 13 5 6 2 1 4 3
23 24 20 19 22 21 17 18 14 13 16 15 6 5 4 3 2 1 12 11 10 9 8 7
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
12階子羣[0,3,4,7,8,11,12,15,16,19,20,23]:
1 2 3 4 5 6 7 8 9 10 11 12
2 3 1 7 9 8 10 12 11 4 5 6
3 1 2 10 11 12 4 6 5 7 9 8
4 6 5 1 3 2 11 10 12 8 7 9
5 4 6 8 7 9 1 2 3 11 12 10
6 5 4 11 12 10 8 9 7 1 3 2
7 8 9 2 1 3 5 4 6 12 10 11
8 9 7 5 6 4 12 11 10 2 1 3
9 7 8 12 10 11 2 3 1 5 6 4
10 12 11 3 2 1 9 7 8 6 4 5
11 10 12 6 4 5 3 1 2 9 8 7
12 11 10 9 8 7 6 5 4 3 2 1

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

float g_S3[6][2][2]=
{
    {{1,0},{0,1}},//I
    {{-1.f/2,sqrtf(3)/2},{-sqrtf(3)/2,-1.f/2}},//r
    {{-1.f/2,-sqrtf(3)/2},{sqrtf(3)/2,-1.f/2}},//r^2
    {{1,0},{0,-1}},//f
    {{-1.f/2,sqrtf(3)/2},{sqrtf(3)/2,1.f/2}},//fr
    {{-1.f/2,-sqrtf(3)/2},{-sqrtf(3)/2,1.f/2}},//fr^2
};

// S_3的2維不可約表示
float g_S3a[6][2][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}},
};    

float g_S4[24][4][4]=

{ {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,0,1},{0,0,1,0}},
{ {1,0,0,0},{0,0,1,0},{0,1,0,0},{0,0,0,1}},
{ {1,0,0,0},{0,0,0,1},{0,1,0,0},{0,0,1,0}},
{ {1,0,0,0},{0,0,1,0},{0,0,0,1},{0,1,0,0}},
{ {1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}},
{ {0,1,0,0},{1,0,0,0},{0,0,1,0},{0,0,0,1}},
{ {0,1,0,0},{1,0,0,0},{0,0,0,1},{0,0,1,0}},
{ {0,0,1,0},{1,0,0,0},{0,1,0,0},{0,0,0,1}},
{ {0,0,0,1},{1,0,0,0},{0,1,0,0},{0,0,1,0}},
{ {0,0,1,0},{1,0,0,0},{0,0,0,1},{0,1,0,0}},
{ {0,0,0,1},{1,0,0,0},{0,0,1,0},{0,1,0,0}},
{ {0,1,0,0},{0,0,1,0},{1,0,0,0},{0,0,0,1}},
{ {0,1,0,0},{0,0,0,1},{1,0,0,0},{0,0,1,0}},
{ {0,0,1,0},{0,1,0,0},{1,0,0,0},{0,0,0,1}},
{ {0,0,0,1},{0,1,0,0},{1,0,0,0},{0,0,1,0}},
{ {0,0,1,0},{0,0,0,1},{1,0,0,0},{0,1,0,0}},
{ {0,0,0,1},{0,0,1,0},{1,0,0,0},{0,1,0,0}},
{ {0,1,0,0},{0,0,1,0},{0,0,0,1},{1,0,0,0}},
{ {0,1,0,0},{0,0,0,1},{0,0,1,0},{1,0,0,0}},
{ {0,0,1,0},{0,1,0,0},{0,0,0,1},{1,0,0,0}},
{ {0,0,0,1},{0,1,0,0},{0,0,1,0},{1,0,0,0}},
{ {0,0,1,0},{0,0,0,1},{0,1,0,0},{1,0,0,0}},
{ {0,0,0,1},{0,0,1,0},{0,1,0,0},{1,0,0,0}},
};

typedef vector<vector<float> > MATRIXf;

// GL(n,R)的N階有限子羣
struct GLnR:public IGroup
{
public:
   //  靜態函數
   static int getidx(vector<MATRIXf> &Arr2,MATRIXf &Arr1);
   static bool IsEqual(const MATRIXf &t,const MATRIXf &m);
   static MATRIXf mul(const MATRIXf &t,const MATRIXf &m);
   static MATRIXf inv(const MATRIXf &t);
   static vector<MATRIXf> Order(const MATRIXf & m); 
   static MATRIXf TransposedMat(const MATRIXf &m);
   static bool IsOrthogonalMat(const MATRIXf &m);
   static float DeterminantMat(const MATRIXf &m);
   static float TraceMat(const MATRIXf &m);   
   static GLnR CyclicGroup(int n);
public:
   // 實現抽象基類的方法
   virtual void printSet();
   virtual void printTable();     
   virtual int mul(int a,int b);
   virtual int size();
   virtual int inv(int a);
   // 構造函數
   GLnR(){}// 默認構造函數
   GLnR(float* set,int n,int N);
   // 成員函數
   bool IsOrthogonalGroup()const;
   // 成員變量
   vector<MATRIXf> s_Arr;
   int m_n;  
};

/* 
SO(2,R)的子羣圓羣的元素可表示爲複數cosθ+isinθ或矩陣{{cosθ,-sinθ},{sinθ,cosθ}},複數a+bi表示爲矩陣{{a,-b},{b,a}},複數的乘法表示爲矩陣的乘法
*/
GLnR GLnR::CyclicGroup(int n){
    MATRIXf m(2,vector<float>(2,0));
    m[0][0]=cos(2*3.141592654/n);
    m[1][1]=m[0][0];
    m[0][1]=-sin(2*3.141592654/n);
    m[1][0]=-m[0][1];
    GLnR Cn;
    Cn.s_Arr=Order(m);
    Cn.m_n=2;
    return Cn;
}

MATRIXf GLnR::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;    
}

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

// 實正交表示就是轉置矩陣等於逆矩陣。
bool GLnR::IsOrthogonalMat(const MATRIXf &m){
    MATRIXf t=TransposedMat(m);
    MATRIXf m1=inv(m);
    bool IsO=IsEqual(t,m1);
    return IsO;    
}

/*
定理:設O(n)爲n*n正交實矩陣組成的羣,任何n階的有限羣同構於O(n)的一個子羣。
任何有限羣都是S_n的子羣,而S_n又是O(n)的子羣,任何有限羣都是A_n的子羣嗎?
*/
bool GLnR::IsOrthogonalGroup()const{
    int N=s_Arr.size();
    for(int i=0;i<N;i++){
        if(!IsOrthogonalMat(s_Arr[i]))
            return false;
    }
    return true;
}

// 用全選主元高斯消去法求行列式的值
float GLnR::DeterminantMat(const MATRIXf &m){
    // 局部變量
    MATRIXf mtxA=m;    
    int n=m.size();
    int nIs, nJs;
    float q,d;
    float f = 1;
    float det = 1;

    // 選主元
    for(int k = 1;k<=n - 1;k++){
        q = 0;
        for(int i = k;i<=n;i++){
            for(int j = k;j<=n;j++){
                d = abs(mtxA[i-1][j-1]);
                if (d > q){
                    q = d;
                    nIs = i;
                    nJs = j;
                }
            }
        }//end for i

        // 求解失敗
        if (q + 1 == 1) {
            return 0;
        }

        if (nIs != k) {
            f = -f;
            for(int j = k;j<=n;j++){
                d = mtxA[k-1][j-1];
                mtxA[k-1][j-1] = mtxA[nIs-1][j-1];
                mtxA[nIs-1][j-1] = d;
            }
        }

        // 調整
        if (nJs != k){
            f = -f;
            for(int i = k;i<=n;i++){
                d = mtxA[i-1][nJs-1];
                mtxA[i-1][nJs-1] = mtxA[i-1][k-1];
                mtxA[i-1][k-1] = d;
            }
        }

        // 計算行列式的值
        det = det * mtxA[k-1][k-1];
        
        // 調整方陣爲上三角矩陣
        for(int i = k+1;i<=n;i++){
            d = mtxA[i-1][k-1] / mtxA[k-1][k-1];
            for(int j = k+1;j<=n;j++){
                mtxA[i-1][j-1] = mtxA[i-1][j-1] - d * mtxA[k-1][j-1];
            }
        }
    }//end for k

    // 計算行列式的值
    det = f * det * mtxA[n-1][n-1];

    // 求解成功
    return det;    
}

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

bool GLnR::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;
}

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

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

MATRIXf GLnR::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;
}

GLnR::GLnR(float* set,int n,int N){
    m_n=n;
    MATRIXf v(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++){
                v[j][k]=*(set+n*n*i+n*j+k);                        
            }            
        }
        s_Arr.push_back(v);
    }
}

void GLnR::printSet(){
    bool bO=IsOrthogonalGroup();
    printf("GL(%d,R)的%d階子羣:bO=%d\n",m_n,size(),bO);
    for(int i=0;i<size();i++){
        int i1=inv(i);
        float det=DeterminantMat(s_Arr[i]);
        float det1=DeterminantMat(s_Arr[i1]);
        float tr=TraceMat(s_Arr[i]);
        float tr1=TraceMat(s_Arr[i1]);        
        printf("%d->Det=%.0f,Tr=%.3f=>%d->Det=%.0f,Tr=%.3f\n",i,det,tr,i1,det1,tr1);
    }
}

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

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

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

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

int main(){
    GLnR C4=GLnR::CyclicGroup(4);
    C4.printSet();    
    C4.printTable();
    
    GLnR C6=GLnR::CyclicGroup(6);
    C6.printSet();    
    C6.printTable();    
    
    GLnR _S3a(&g_S3a[0][0][0],2,sizeof(g_S3a)/sizeof(g_S3a[0]));
    _S3a.printSet();
    _S3a.printTable();
    
    vector<int> vA3a;
    for(int i=0;i<_S3a.size();i++){
        float det=GLnR::DeterminantMat(_S3a.s_Arr[i]);
        if(abs(det-1)<0.01){
            vA3a.push_back(i);
        }
    }
    vector<int> fgA3a=FG(&_S3a,vA3a);
    printSubGroup(&_S3a,fgA3a);
    
    GLnR _S3(&g_S3[0][0][0],2,sizeof(g_S3)/sizeof(g_S3[0]));
    _S3.printSet();
    _S3.printTable();
    
    vector<int> vA3;
    for(int i=0;i<_S3.size();i++){
        float det=GLnR::DeterminantMat(_S3.s_Arr[i]);
        if(abs(det-1)<0.01){
            vA3.push_back(i);
        }
    }
    vector<int> fgA3=FG(&_S3,vA3);
    printSubGroup(&_S3,fgA3);    
    
    GLnR _S4(&g_S4[0][0][0],4,sizeof(g_S4)/sizeof(g_S4[0]));
    _S4.printSet();
    _S4.printTable();
    
    vector<int> vA4;
    for(int i=0;i<_S4.size();i++){
        float det=GLnR::DeterminantMat(_S4.s_Arr[i]);
        if(abs(det-1)<0.01){
            vA4.push_back(i);
        }
    }
    vector<int> fgA4=FG(&_S4,vA4);
    printSubGroup(&_S4,fgA4);
    
    return 0;
}    

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