這是上一篇文章中Yn.exe工具的推廣。
D:\go20190906\src\SmallRing>cl /c /D PRINT_STDOUT GD.cpp
用於 x86 的 Microsoft (R) C/C++ 優化編譯器 17.00.50727.1 版版權所有(C) Microsoft Corporation。保留所有權利。
GD.cpp
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xlocale(336) : warning C4530: 使用了 C++ 異常處理程序,但
未啓用展開語義。請指定 /EHsc
D:\go20190906\src\SmallRing>link /OUT:GD.exe GD.obj
Microsoft (R) Incremental Linker Version 11.00.50727.1
Copyright (C) Microsoft Corporation. All rights reserved.
D:\go20190906\src\SmallRing>GD 3,3
9階Abel羣AbelianGroup(3,3)的不變量N0=[1,8,0],指數n0=3
1 2 3 4 5 6 7 8 9
2 3 1 5 6 4 8 9 7
3 1 2 6 4 5 9 7 8
4 5 6 7 8 9 1 2 3
5 6 4 8 9 7 2 3 1
6 4 5 9 7 8 3 1 2
7 8 9 1 2 3 4 5 6
8 9 7 2 3 1 5 6 4
9 7 8 3 1 2 6 4 5
18階廣義二面體羣GeneralizedDihedralGroup(3,3)的不變量N0=[1,9,8,0,0,0],指數n0=6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
2 1 6 5 4 3 14 13 18 17 16 15 8 7 12 11 10 9
3 4 5 6 1 2 9 10 11 12 7 8 15 16 17 18 13 14
4 3 2 1 6 5 16 15 14 13 18 17 10 9 8 7 12 11
5 6 1 2 3 4 11 12 7 8 9 10 17 18 13 14 15 16
6 5 4 3 2 1 18 17 16 15 14 13 12 11 10 9 8 7
7 8 9 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6
8 7 12 11 10 9 2 1 6 5 4 3 14 13 18 17 16 15
9 10 11 12 7 8 15 16 17 18 13 14 3 4 5 6 1 2
10 9 8 7 12 11 4 3 2 1 6 5 16 15 14 13 18 17
11 12 7 8 9 10 17 18 13 14 15 16 5 6 1 2 3 4
12 11 10 9 8 7 6 5 4 3 2 1 18 17 16 15 14 13
13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12
14 13 18 17 16 15 8 7 12 11 10 9 2 1 6 5 4 3
15 16 17 18 13 14 3 4 5 6 1 2 9 10 11 12 7 8
16 15 14 13 18 17 10 9 8 7 12 11 4 3 2 1 6 5
17 18 13 14 15 16 5 6 1 2 3 4 11 12 7 8 9 10
18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
請按任意鍵繼續. . .
D:\go20190906\src\SmallRing>GD 4,4
16階Abel羣AbelianGroup(4,4)的不變量N0=[1,3,12,0,0],指數n0=4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 3 4 1 6 7 8 5 10 11 12 9 14 15 16 13
3 4 1 2 7 8 5 6 11 12 9 10 15 16 13 14
4 1 2 3 8 5 6 7 12 9 10 11 16 13 14 15
5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4
6 7 8 5 10 11 12 9 14 15 16 13 2 3 4 1
7 8 5 6 11 12 9 10 15 16 13 14 3 4 1 2
8 5 6 7 12 9 10 11 16 13 14 15 4 1 2 3
9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8
10 11 12 9 14 15 16 13 2 3 4 1 6 7 8 5
11 12 9 10 15 16 13 14 3 4 1 2 7 8 5 6
12 9 10 11 16 13 14 15 4 1 2 3 8 5 6 7
13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12
14 15 16 13 2 3 4 1 6 7 8 5 10 11 12 9
15 16 13 14 3 4 1 2 7 8 5 6 11 12 9 10
16 13 14 15 4 1 2 3 8 5 6 7 12 9 10 11
32階廣義二面體羣GeneralizedDihedralGroup(4,4)的不變量N0=[1,19,12,0,0,0],指數n0=4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
2 1 8 7 6 5 4 3 26 25 32 31 30 29 28 27 18 17 24 23 22 21 20 19 10 9 16 15 14 13 12 11
3 4 5 6 7 8 1 2 11 12 13 14 15 16 9 10 19 20 21 22 23 24 17 18 27 28 29 30 31 32 25 26
4 3 2 1 8 7 6 5 28 27 26 25 32 31 30 29 20 19 18 17 24 23 22 21 12 11 10 9 16 15 14 13
5 6 7 8 1 2 3 4 13 14 15 16 9 10 11 12 21 22 23 24 17 18 19 20 29 30 31 32 25 26 27 28
6 5 4 3 2 1 8 7 30 29 28 27 26 25 32 31 22 21 20 19 18 17 24 23 14 13 12 11 10 9 16 15
7 8 1 2 3 4 5 6 15 16 9 10 11 12 13 14 23 24 17 18 19 20 21 22 31 32 25 26 27 28 29 30
8 7 6 5 4 3 2 1 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 1 2 3 4 5 6 7 8
10 9 16 15 14 13 12 11 2 1 8 7 6 5 4 3 26 25 32 31 30 29 28 27 18 17 24 23 22 21 20 19
11 12 13 14 15 16 9 10 19 20 21 22 23 24 17 18 27 28 29 30 31 32 25 26 3 4 5 6 7 8 1 2
12 11 10 9 16 15 14 13 4 3 2 1 8 7 6 5 28 27 26 25 32 31 30 29 20 19 18 17 24 23 22 21
13 14 15 16 9 10 11 12 21 22 23 24 17 18 19 20 29 30 31 32 25 26 27 28 5 6 7 8 1 2 3 4
14 13 12 11 10 9 16 15 6 5 4 3 2 1 8 7 30 29 28 27 26 25 32 31 22 21 20 19 18 17 24 23
15 16 9 10 11 12 13 14 23 24 17 18 19 20 21 22 31 32 25 26 27 28 29 30 7 8 1 2 3 4 5 6
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
18 17 24 23 22 21 20 19 10 9 16 15 14 13 12 11 2 1 8 7 6 5 4 3 26 25 32 31 30 29 28 27
19 20 21 22 23 24 17 18 27 28 29 30 31 32 25 26 3 4 5 6 7 8 1 2 11 12 13 14 15 16 9 10
20 19 18 17 24 23 22 21 12 11 10 9 16 15 14 13 4 3 2 1 8 7 6 5 28 27 26 25 32 31 30 29
21 22 23 24 17 18 19 20 29 30 31 32 25 26 27 28 5 6 7 8 1 2 3 4 13 14 15 16 9 10 11 12
22 21 20 19 18 17 24 23 14 13 12 11 10 9 16 15 6 5 4 3 2 1 8 7 30 29 28 27 26 25 32 31
23 24 17 18 19 20 21 22 31 32 25 26 27 28 29 30 7 8 1 2 3 4 5 6 15 16 9 10 11 12 13 14
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 32 31 30 29 28 27 26 25
25 26 27 28 29 30 31 32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
26 25 32 31 30 29 28 27 18 17 24 23 22 21 20 19 10 9 16 15 14 13 12 11 2 1 8 7 6 5 4 3
27 28 29 30 31 32 25 26 3 4 5 6 7 8 1 2 11 12 13 14 15 16 9 10 19 20 21 22 23 24 17 18
28 27 26 25 32 31 30 29 20 19 18 17 24 23 22 21 12 11 10 9 16 15 14 13 4 3 2 1 8 7 6 5
29 30 31 32 25 26 27 28 5 6 7 8 1 2 3 4 13 14 15 16 9 10 11 12 21 22 23 24 17 18 19 20
30 29 28 27 26 25 32 31 22 21 20 19 18 17 24 23 14 13 12 11 10 9 16 15 6 5 4 3 2 1 8 7
31 32 25 26 27 28 29 30 7 8 1 2 3 4 5 6 15 16 9 10 11 12 13 14 23 24 17 18 19 20 21 22
32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
請按任意鍵繼續. . .
D:\go20190906\src\SmallRing>GD 2,4
8階Abel羣AbelianGroup(2,4)的不變量N0=[1,3,4,0],指數n0=4
1 2 3 4 5 6 7 8
2 3 4 1 6 7 8 5
3 4 1 2 7 8 5 6
4 1 2 3 8 5 6 7
5 6 7 8 1 2 3 4
6 7 8 5 2 3 4 1
7 8 5 6 3 4 1 2
8 5 6 7 4 1 2 3
16階廣義二面體羣GeneralizedDihedralGroup(2,4)的不變量N0=[1,11,4,0,0],指數n0=4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 1 8 7 6 5 4 3 10 9 16 15 14 13 12 11
3 4 5 6 7 8 1 2 11 12 13 14 15 16 9 10
4 3 2 1 8 7 6 5 12 11 10 9 16 15 14 13
5 6 7 8 1 2 3 4 13 14 15 16 9 10 11 12
6 5 4 3 2 1 8 7 14 13 12 11 10 9 16 15
7 8 1 2 3 4 5 6 15 16 9 10 11 12 13 14
8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9
9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8
10 9 16 15 14 13 12 11 2 1 8 7 6 5 4 3
11 12 13 14 15 16 9 10 3 4 5 6 7 8 1 2
12 11 10 9 16 15 14 13 4 3 2 1 8 7 6 5
13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4
14 13 12 11 10 9 16 15 6 5 4 3 2 1 8 7
15 16 9 10 11 12 13 14 7 8 1 2 3 4 5 6
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
請按任意鍵繼續. . .
D:\go20190906\src\SmallRing>GD 8
8階Abel羣AbelianGroup(8)的不變量N0=[1,1,2,4],指數n0=8
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
5 6 7 8 1 2 3 4
6 7 8 1 2 3 4 5
7 8 1 2 3 4 5 6
8 1 2 3 4 5 6 7
16階廣義二面體羣GeneralizedDihedralGroup(8)的不變量N0=[1,9,2,4,0],指數n0=8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 1 16 15 14 13 12 11 10 9 8 7 6 5 4 3
3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2
4 3 2 1 16 15 14 13 12 11 10 9 8 7 6 5
5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4
6 5 4 3 2 1 16 15 14 13 12 11 10 9 8 7
7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6
8 7 6 5 4 3 2 1 16 15 14 13 12 11 10 9
9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8
10 9 8 7 6 5 4 3 2 1 16 15 14 13 12 11
11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10
12 11 10 9 8 7 6 5 4 3 2 1 16 15 14 13
13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12
14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15
15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
請按任意鍵繼續. . .
D:\go20190906\src\SmallRing>GD 4
4階Abel羣AbelianGroup(4)的不變量N0=[1,1,2],指數n0=4
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
8階廣義二面體羣GeneralizedDihedralGroup(4)的不變量N0=[1,5,2,0],指數n0=4
1 2 3 4 5 6 7 8
2 1 8 7 6 5 4 3
3 4 5 6 7 8 1 2
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 4 3 2 1 8 7
7 8 1 2 3 4 5 6
8 7 6 5 4 3 2 1
請按任意鍵繼續. . .
D:\go20190906\src\SmallRing>GD 2,2
4階Abel羣AbelianGroup(2,2)的不變量N0=[1,3,0],指數n0=2
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
8階廣義二面體羣GeneralizedDihedralGroup(2,2)的不變量N0=[1,7,0,0],指數n0=2
1 2 3 4 5 6 7 8
2 1 4 3 6 5 8 7
3 4 1 2 7 8 5 6
4 3 2 1 8 7 6 5
5 6 7 8 1 2 3 4
6 5 8 7 2 1 4 3
7 8 5 6 3 4 1 2
8 7 6 5 4 3 2 1
請按任意鍵繼續. . .
// 生成n階Abel羣AbelianGroup(L)及其對應的2n階廣義二面體羣GeneralizedDihedralGroup(L)=AbelianGroup(L):C_2的凱萊表GD.exe,L=[n]時即爲二面體羣DihedralGroup(2n),L=[n,n]時即爲Y_n
#include <iostream>
#include <vector>
#include <string>
using namespace std;
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<int> IsLegalMtx(const vector<vector<int>> &mtx)
{
vector<int> ret(3);
int illegal=-1;
ret[1]=mtx.size();
if(ret[1]==0)
{
ret[0]=illegal;//不是合法矩陣
return ret;
}
ret[2]=mtx[0].size();
if(ret[2]==0)
{
ret[0]=illegal;//不是合法矩陣
return ret;
}
for(int i=1;i<ret[1];i++)
{
if(mtx[i].size()!=ret[2])
{
ret[0]=illegal;//不是合法矩陣
return ret;
}
}
ret[0]=0;//是合法矩陣
return ret;
}
vector<vector<int>> DirectProduct(const vector<vector<int>> &A,const vector<vector<int>> &B)
{
vector<vector<int>> C;
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return C;
vector<int> BFlag=IsLegalMtx(B);
if(BFlag[0]==-1)
return C;
int nB=BFlag[1];
int n=AFlag[1]*BFlag[1];
for(int a=0;a<n;a++)
{
vector<int> iRow;
for(int b=0;b<n;b++)
{
int aj=a%nB;
int ai=a/nB;
int bj=b%nB;
int bi=b/nB;
int i=A[ai][bi]-1;
int j=B[aj][bj]-1;
int c=nB*i+j+1;
iRow.push_back(c);
}
C.push_back(iRow);
}
return C;
}
// 半直積羣G:C2
vector<vector<int>> GC2(const vector<vector<int>> &A)
{
vector<vector<int>> C;
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return C;
vector<vector<int>> B;
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
vector<int> v2;
v2.push_back(2);
v2.push_back(1);
B.push_back(v1);
B.push_back(v2);
vector<int> BFlag=IsLegalMtx(B);
if(BFlag[0]==-1)
return C;
int nB=BFlag[1];
int n=AFlag[1]*BFlag[1];
for(int a=0;a<n;a++)
{
vector<int> iRow;
for(int b=0;b<n;b++)
{
int aj=a%nB;
int ai=a/nB;
int bj=b%nB;
int bi=b/nB;
int bii=bi;
//aj不是C_2={0,1}的單位元0
if(aj==1)
{
for(int ii=0;ii<AFlag[1];ii++)
{
if(A[bi][ii]==1)
{
bii=ii;
break;
}
}
}
int i=A[ai][bii]-1;
int j=B[aj][bj]-1;
int c=nB*i+j+1;
iRow.push_back(c);
}
C.push_back(iRow);
}
return C;
}
vector<int> Factors(int n)
{
vector<int> ret;
if(n<1)
return ret;
for(int i=1;i<=n;i++)
{
if(n%i==0)
{
ret.push_back(i);
}
}
return ret;
}
// 未知n階羣的羣元的階
int getGnEOrder(const vector<vector<int>> &A,int a)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return -1;
int n=AFlag[1];
if(a<0||a>=n)
return -1;
int t=0;
for(int i=1;i<=n;i++)
{
t=A[t][a]-1;
if(t==0)
return i;
}
return -1;
}
//利用歐幾里得算法計算兩個數的最大公約數
int gcd(int a, int b)
{
int temp;
if(b == 0) return a;
if(a == 0) return b;
if(a%b == 0) return b;
else return gcd(b, a%b);
}
int lcm(const vector<int>& v)
{
int n=v.size();
if(n<1)
return 0;
if(n==1)
return v[0];
int ret=v[0];
for(int i=1;i<n;i++)
{
ret=(ret*v[i]/gcd(ret,v[i]));
}
return ret;
}
int Exponent(const vector<vector<int>> &A)
{
vector<int> v;
int n=A.size();
vector<int> vOrders=Factors(n);
vector<int> vCounts(n+1);
for(int i=0;i<n;i++)
{
int ord=getGnEOrder(A,i);
vCounts[ord]=vCounts[ord]+1;
}
for(int i=0;i<vOrders.size();i++)
{
if(vCounts[vOrders[i]]!=0)
v.push_back(vOrders[i]);
}
int n0=lcm(v);
return n0;
}
string calN0(const vector<vector<int>> &A)
{
int n=A.size();
vector<int> vOrders=Factors(n);
vector<int> vCounts(n+1);
for(int i=0;i<n;i++)
{
int ord=getGnEOrder(A,i);
vCounts[ord]=vCounts[ord]+1;
}
string str="[";
for(int i=0;i<vOrders.size();i++)
{
char sz[40]={0};
sprintf(sz,"%d",vCounts[vOrders[i]]);
str+=sz;
if(i<vOrders.size()-1)
str+=",";
}
str+="]";
return str;
}
vector<vector<int> > CyclicGroup(int n)
{
vector<vector<int> > ret(n,vector<int>(n,0));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
ret[i][j]=(i+j)%n+1;
}
}
return ret;
}
vector<vector<int> > AbelianGroup(const vector<int>& L)
{
vector<vector<int> > ret;
int n=L.size();
if(n<1)
return ret;
ret=CyclicGroup(L[0]);
for(int i=1;i<n;i++)
{
vector<vector<int> > Ci=CyclicGroup(L[i]);
ret=DirectProduct(ret,Ci);
}
return ret;
}
int main(int argc, char **argv)
{
char sz[100]={0};
if(argc<2)
{
printf("請輸入L:");
scanf("%s",sz);
}
else
strcpy(sz,argv[1]);
string str=sz;
vector<int> L;
vector<string> All=split(str,",");
for(int i=0;i<All.size();i++)
{
int a=atoi(All[i].c_str());
L.push_back(a);
}
vector<vector<int> > A=AbelianGroup(L);
vector<vector<int> > GD=GC2(A);
int nA=A.size();
string N0A=calN0(A);
int n0A=Exponent(A);
printf("%d階Abel羣AbelianGroup(%s)的不變量N0=%s,指數n0=%d\n",nA,sz,N0A.c_str(),n0A);
char sz1[100]={0};
sprintf(sz1,"G%d.txt",nA);
// 生成AbelianGroup(L)的凱萊表
FILE *fp=fopen(sz1,"w");
for(int i=0;i<nA;i++)
{
for(int j=0;j<nA;j++)
{
#ifdef PRINT_STDOUT
printf("%d ",A[i][j]);
#endif
fprintf(fp,"%d ",A[i][j]);
}
#ifdef PRINT_STDOUT
printf("\n");
#endif
fprintf(fp,"\n");
}
fclose(fp);
int nGD=GD.size();
string N0GD=calN0(GD);
int n0GD=Exponent(GD);
printf("%d階廣義二面體羣GeneralizedDihedralGroup(%s)的不變量N0=%s,指數n0=%d\n",nGD,sz,N0GD.c_str(),n0GD);
char sz2[100]={0};
sprintf(sz2,"GD%d.txt",nGD);
// 生成廣義二面體羣GeneralizedDihedralGroup(L)的凱萊表
fp=fopen(sz2,"w");
for(int i=0;i<nGD;i++)
{
for(int j=0;j<nGD;j++)
{
#ifdef PRINT_STDOUT
printf("%d ",GD[i][j]);
#endif
fprintf(fp,"%d ",GD[i][j]);
}
#ifdef PRINT_STDOUT
printf("\n");
#endif
fprintf(fp,"\n");
}
fclose(fp);
system("pause");
return 0;
}