生成Abel羣及其對應的廣義二面體羣凱萊表的工具GD.exe(C++版本)

這是上一篇文章中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;
}

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