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;
}