100阶以下子群和商群的搜索

D:\MathTool\gaptool>Subgroup 11 0 100
置换群S_11的子群:
0,1->[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,7,8,9,11,10]=>GAP[2,1]:
0,3->[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,7,8,10,11,9]=>GAP[3,1]:
0,9->[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,7,9,10,11,8]=>GAP[4,1]:
0,27->[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,8,7,10,11,9]=>GAP[6,2]:
0,33->[1,2,3,4,5,6,7,8,9,10,11],[1,2,3,4,5,6,8,9,10,11,7]=>GAP[5,1]:
1,2->[1,2,3,4,5,6,7,8,9,11,10],[1,2,3,4,5,6,7,8,10,9,11]=>GAP[6,1]:
1,6->[1,2,3,4,5,6,7,8,9,11,10],[1,2,3,4,5,6,7,9,8,10,11]=>GAP[4,2]:
1,8->[1,2,3,4,5,6,7,8,9,11,10],[1,2,3,4,5,6,7,9,10,8,11]=>GAP[24,12]:
1,16->[1,2,3,4,5,6,7,8,9,11,10],[1,2,3,4,5,6,7,10,11,8,9]=>GAP[8,3]:
1,26->[1,2,3,4,5,6,7,8,9,11,10],[1,2,3,4,5,6,8,7,10,9,11]=>GAP[12,4]:
3,7->[1,2,3,4,5,6,7,8,10,11,9],[1,2,3,4,5,6,7,9,8,11,10]=>GAP[12,3]:
3,30->[1,2,3,4,5,6,7,8,10,11,9],[1,2,3,4,5,6,8,9,7,10,11]=>GAP[60,5]:
7,26->[1,2,3,4,5,6,7,9,8,11,10],[1,2,3,4,5,6,8,7,10,9,11]=>GAP[10,1]:
7,32->[1,2,3,4,5,6,7,9,8,11,10],[1,2,3,4,5,6,8,9,10,7,11]=>GAP[20,3]:
^C
D:\MathTool\gaptool>Subgroup 11 150 1000
置换群S_11的子群:
150,151->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,5,7,8,9,6,11,10]=>GAP[8,2]:
150,168->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,5,7,9,6,8,10,11]=>GAP[24,12]:
150,169->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,5,7,9,6,8,11,10]=>GAP[48,48]:
150,176->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,5,7,9,8,10,6,11]=>GAP[20,3]:
150,264->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,5,8,7,6,9,10,11]=>GAP[8,3]:
150,288->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,5,8,9,6,7,10,11]=>GAP[4,1]:
150,727->[1,2,3,4,5,7,8,9,6,10,11],[1,2,3,4,6,5,7,9,8,11,10]=>GAP[40,-1]:
N0C1Nk=1,11,20,4,0,4,0,0,[[0,20],[1,20]],[[1,1,1],[2,1,1],[2,5,10],[4,5,20],[5,4,4],[10,4,4]]
S2=0,11,65,10,60,94,300,240
kKEZDCANS=10,[2,0,2,6,0,0,0,0],20,2,5,0,0,0,1
151,153->[1,2,3,4,5,7,8,9,6,11,10],[1,2,3,4,5,7,8,9,10,11,6]=>GAP[72,40]:
151,160->[1,2,3,4,5,7,8,9,6,11,10],[1,2,3,4,5,7,8,10,11,6,9]=>GAP[36,9]:
^C
D:\MathTool\gaptool>Subgroup 6
720阶置换群S_6的子群:
0,1->[1,2,3,4,5,6],[1,2,3,4,6,5]=>GAP[2,1]:
0,3->[1,2,3,4,5,6],[1,2,3,5,6,4]=>GAP[3,1]:
0,9->[1,2,3,4,5,6],[1,2,4,5,6,3]=>GAP[4,1]:
0,27->[1,2,3,4,5,6],[1,3,2,5,6,4]=>GAP[6,2]:
0,33->[1,2,3,4,5,6],[1,3,4,5,6,2]=>GAP[5,1]:
1,2->[1,2,3,4,6,5],[1,2,3,5,4,6]=>GAP[6,1]:
1,6->[1,2,3,4,6,5],[1,2,4,3,5,6]=>GAP[4,2]:
1,8->[1,2,3,4,6,5],[1,2,4,5,3,6]=>GAP[24,12]:
1,16->[1,2,3,4,6,5],[1,2,5,6,3,4]=>GAP[8,3]:
1,26->[1,2,3,4,6,5],[1,3,2,5,4,6]=>GAP[12,4]:
1,128->[1,2,3,4,6,5],[2,1,4,5,3,6]=>GAP[48,48]:
1,146->[1,2,3,4,6,5],[2,3,1,5,4,6]=>GAP[18,3]:
1,150->[1,2,3,4,6,5],[2,3,4,1,5,6]=>GAP[8,2]:
1,160->[1,2,3,4,6,5],[2,3,5,6,1,4]=>GAP[72,40]:
1,208->[1,2,3,4,6,5],[2,5,4,6,1,3]=>GAP[24,13]:
^C
D:\MathTool\gaptool>Subgroup 3
6阶置换群S_3的子群:
0,1->[1,2,3],[1,3,2]=>GAP[2,1]:
0,3->[1,2,3],[2,3,1]=>GAP[3,1]:
1,2->[1,3,2],[2,1,3]=>GAP[6,1]:

D:\MathTool\gaptool>Subgroup 4
24阶置换群S_4的子群:
0,1->[1,2,3,4],[1,2,4,3]=>GAP[2,1]:
0,3->[1,2,3,4],[1,3,4,2]=>GAP[3,1]:
0,9->[1,2,3,4],[2,3,4,1]=>GAP[4,1]:
1,2->[1,2,4,3],[1,3,2,4]=>GAP[6,1]:
1,6->[1,2,4,3],[2,1,3,4]=>GAP[4,2]:
1,8->[1,2,4,3],[2,3,1,4]=>GAP[24,12]:
1,16->[1,2,4,3],[3,4,1,2]=>GAP[8,3]:
3,7->[1,3,4,2],[2,1,4,3]=>GAP[12,3]:

D:\MathTool\gaptool>Subgroup 5
120阶置换群S_5的子群:
0,1->[1,2,3,4,5],[1,2,3,5,4]=>GAP[2,1]:
0,3->[1,2,3,4,5],[1,2,4,5,3]=>GAP[3,1]:
0,9->[1,2,3,4,5],[1,3,4,5,2]=>GAP[4,1]:
0,27->[1,2,3,4,5],[2,1,4,5,3]=>GAP[6,2]:
0,33->[1,2,3,4,5],[2,3,4,5,1]=>GAP[5,1]:
1,2->[1,2,3,5,4],[1,2,4,3,5]=>GAP[6,1]:
1,6->[1,2,3,5,4],[1,3,2,4,5]=>GAP[4,2]:
1,8->[1,2,3,5,4],[1,3,4,2,5]=>GAP[24,12]:
1,16->[1,2,3,5,4],[1,4,5,2,3]=>GAP[8,3]:
1,26->[1,2,3,5,4],[2,1,4,3,5]=>GAP[12,4]:
D:\MathTool\gaptool>Subgroup 5 0 120 3
置换群S_5的子群:
0,1,2->[1,2,3,4,5],[1,2,3,5,4],[1,2,4,3,5]=>GAP[6,1]:
0,1,6->[1,2,3,4,5],[1,2,3,5,4],[1,3,2,4,5]=>GAP[4,2]:
0,1,8->[1,2,3,4,5],[1,2,3,5,4],[1,3,4,2,5]=>GAP[24,12]:
0,1,16->[1,2,3,4,5],[1,2,3,5,4],[1,4,5,2,3]=>GAP[8,3]:
0,1,26->[1,2,3,4,5],[1,2,3,5,4],[2,1,4,3,5]=>GAP[12,4]:
0,1,30->[1,2,3,4,5],[1,2,3,5,4],[2,3,1,4,5]=>GAP[6,2]:
0,3,4->[1,2,3,4,5],[1,2,4,5,3],[1,2,5,3,4]=>GAP[3,1]:
0,3,7->[1,2,3,4,5],[1,2,4,5,3],[1,3,2,5,4]=>GAP[12,3]:
0,3,30->[1,2,3,4,5],[1,2,4,5,3],[2,3,1,4,5]=>GAP[60,5]:
0,7,17->[1,2,3,4,5],[1,3,2,5,4],[1,4,5,3,2]=>GAP[4,1]:
0,7,26->[1,2,3,4,5],[1,3,2,5,4],[2,1,4,3,5]=>GAP[10,1]:
0,7,32->[1,2,3,4,5],[1,3,2,5,4],[2,3,4,1,5]=>GAP[20,3]:

D:\MathTool\gaptool>quotientGroup 3
6阶置换群S_3的商群:
0,3->[1,2,3],[2,3,1]=>S_3/GAP[3,1]=GAP[2,1]:

D:\MathTool\gaptool>quotientGroup 4
24阶置换群S_4的商群:
3,7->[1,3,4,2],[2,1,4,3]=>S_4/GAP[12,3]=GAP[2,1]:
7,16->[2,1,4,3],[3,4,1,2]=>S_4/GAP[4,2]=GAP[6,1]:

D:\MathTool\gaptool>quotientGroup 4 0 0
24阶置换群S_4的商群:
3,7,8->[1,3,4,2],[2,1,4,3],[2,3,1,4]=>S_4/GAP[12,3]=GAP[2,1]:
7,16,17->[2,1,4,3],[3,4,1,2],[3,4,2,1]=>S_4/GAP[4,2]=GAP[6,1]:

D:\MathTool\gaptool>quotientGroup 5
120阶置换群S_5的商群:
3,30->[1,2,4,5,3],[2,3,1,4,5]=>S_5/GAP[60,5]=GAP[2,1]:

#include"PermGroup.h"
#include"quotientGroup.h"
#include
#include
#include

string V2S(vector& v){
   string str="[";
   int n=v.size();
   for(int i=0;i    {
       str+=itos(v[i]);
       if(i            str+=",";   
   }       
   str+="]";
   return str;
}

set gS;
set> gM;
int g_a=0;

void QFindquotientGroup2(int n,int m)
{    
    Sn sn(n);
    for(int i=g_a;i     for(int j=i+1;j         vector S;
        SnE vi=sn.s_Arr[i];
        SnE vj=sn.s_Arr[j];
        S.push_back(vi);
        S.push_back(vj);
        vector v;
        v.push_back(i);
        v.push_back(j);
        Subgroup s;
        bool b=s.init(&sn,v,m/2);
        if(!b)
            continue;
        int ni=s.size();
        if(sn.size()/ni>100)
            continue;
        int isN=IsNormalSubgroup(&sn,s.m_Set,true);
        if(isN!=1)
            continue;    
        quotientGroup G(&sn,s.m_Set);        
        //bool bG=IsGroup(&G);
        //if(!bG)
        //    continue;
        int ID=IdGroup(&G);
        int cnt=gM.size();
        gM.insert(make_pair(G.size(),ID));
        int cnt1=gM.size();
        if(cnt1>cnt){
            int sID=IdGroup(&s);
            printf("%d,%d->%s,%s=>S_%d/GAP[%d,%d]=GAP[%d,%d]:\n",i,j,V2S(vi).c_str(),V2S(vj).c_str(),n,ni,sID,G.size(),ID);                
        }
        if(ID==-1){        
            string N0=calcN0(&G);  
            string C1=calcC1(&G);    
            string Nk=calcNk(&G);    
            string S2=calcS2(&G);
            string kKEZDCANS=calckKEZDCANS(&G);
            string strG=N0+C1+Nk+S2+kKEZDCANS;
            if(gS.find(strG)==gS.end()){            
                printf("N0C1Nk=%s,%s,%s\n",N0.c_str(),C1.c_str(),Nk.c_str());  
                printf("S2=%s\n",S2.c_str());
                printf("kKEZDCANS=%s\n",kKEZDCANS.c_str());            
            }
            gS.insert(strG);
        }
    }
}

void QFindquotientGroup3(int n,int m)
{
    Sn sn(n);
    for(int i=g_a;i     for(int j=i+1;j     for(int k=j+1;k         vector S;
        SnE vi=sn.s_Arr[i];
        SnE vj=sn.s_Arr[j];
        SnE vk=sn.s_Arr[k];
        S.push_back(vi);
        S.push_back(vj);
        S.push_back(vk);
        vector v;
        v.push_back(i);
        v.push_back(j);
        Subgroup s;
        bool b=s.init(&sn,v,m/2);
        if(!b)
            continue;
        int ni=s.size();
        if(sn.size()/ni>100)
            continue;
        int isN=IsNormalSubgroup(&sn,s.m_Set,true);
        if(isN!=1)
            continue;    
        quotientGroup G(&sn,s.m_Set);
        //bool bG=IsGroup(&G);
        //if(!bG)
        //    continue;
        int ID=IdGroup(&G);
        int cnt=gM.size();
        gM.insert(make_pair(G.size(),ID));
        int cnt1=gM.size();
        if(cnt1>cnt){
            int sID=IdGroup(&s);
            printf("%d,%d,%d->%s,%s,%s=>S_%d/GAP[%d,%d]=GAP[%d,%d]:\n",i,j,k,V2S(vi).c_str(),V2S(vj).c_str(),V2S(vk).c_str(),n,ni,sID,G.size(),ID);                
        }
        if(ID==-1){        
            string N0=calcN0(&G);  
            string C1=calcC1(&G);    
            string Nk=calcNk(&G);    
            string S2=calcS2(&G);
            string kKEZDCANS=calckKEZDCANS(&G); 
            string strG=N0+C1+Nk+S2+kKEZDCANS;
            if(gS.find(strG)==gS.end()){            
                printf("N0C1Nk=%s,%s,%s\n",N0.c_str(),C1.c_str(),Nk.c_str());  
                printf("S2=%s\n",S2.c_str());
                printf("kKEZDCANS=%s\n",kKEZDCANS.c_str());            
            }
            gS.insert(strG);
        }
    }
    }
}

int fact(int n)
{
    static int result[]={1,2,6,24,120,720,5040,40320,362880,362880};
    int idx=(n<1||n>10?0:n-1);
    return result[idx];
}

int main(int argc, char * argv[])
{
    char sz[100]={0};
    if(argc<2)
    {
        printf("Usage:  quotientGroup n [g_a] [r]\n");
        return 0;
    }
    int n=atoi(argv[1]);
    g_a=argc>2?atoi(argv[2]):0;        
    int r=argc>3?3:2;
    if(n<1||n>10)
    {
        return 0;
    }
    int m=m=fact(n);
    printf("%d阶置换群S_%d的商群:\n",m,n);
    if(r==2)QFindquotientGroup2(n,m);
    if(r==3)QFindquotientGroup3(n,m);
#ifdef _DEBUG
    system("pause");
#endif    
    return 0;
}

你可能感兴趣的:(数学笔记)