IdGroup算法在G32、G48时遇到的情形
问题:进一步区分GAP[32,36]和GAP[32,37]、GAP[48,23]和GAP[48,24]?
可以用kKEZDCANS这组群不变量进行区分,k表示共轭类的个数,K表示共轭类长度的分布,E表示指数,Z表示中心大小,D表示换位子群大小,C表示是否是循环群,A表示是否是交换群,N表示是否是幂零群,S表示是否是可解群。
gap> b2i:=function(b) ret:=0;;if b then ret:=1;fi;return ret;;end;;n:=32;;m:=NumberSmallGroups(n);;for ii in [1..m] do G:=SmallGroup(n,ii);cl:=ConjugacyClasses(G);L:=[];len:=Size(cl);for i in [1..len] do Add(L,Size(cl[i]));od;M:=DivisorsInt(n);K:=[];for i in M do Add(K,Size(Positions(L,i)));od;Print("kKEZDCANS(G",n,"_",ii,")=",Size(ConjugacyClasses(G)),",",K,",",Exponent(G),",",Size(Center(G)),",",Size(DerivedSubgroup(G)),",",b2i(IsCyclic(G)),",",b2i(IsAbelian(G)),",",b2i(IsNilpotentGroup(G)),",",b2i(IsSolvableGroup(G)),"\n");od;
kKEZDCANS(G32_1)=32,[ 32, 0, 0, 0, 0, 0 ],32,32,1,1,1,1,1
kKEZDCANS(G32_2)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_3)=32,[ 32, 0, 0, 0, 0, 0 ],8,32,1,0,1,1,1
kKEZDCANS(G32_4)=20,[ 8, 12, 0, 0, 0, 0 ],8,8,2,0,0,1,1
kKEZDCANS(G32_5)=20,[ 8, 12, 0, 0, 0, 0 ],8,8,2,0,0,1,1
kKEZDCANS(G32_6)=11,[ 2, 3, 6, 0, 0, 0 ],4,2,4,0,0,1,1
kKEZDCANS(G32_7)=11,[ 2, 3, 6, 0, 0, 0 ],8,2,4,0,0,1,1
kKEZDCANS(G32_8)=11,[ 2, 3, 6, 0, 0, 0 ],8,2,4,0,0,1,1
kKEZDCANS(G32_9)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_10)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_11)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_12)=20,[ 8, 12, 0, 0, 0, 0 ],8,8,2,0,0,1,1
kKEZDCANS(G32_13)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_14)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_15)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_16)=32,[ 32, 0, 0, 0, 0, 0 ],16,32,1,0,1,1,1
kKEZDCANS(G32_17)=20,[ 8, 12, 0, 0, 0, 0 ],16,8,2,0,0,1,1
kKEZDCANS(G32_18)=11,[ 2, 7, 0, 2, 0, 0 ],16,2,8,0,0,1,1
kKEZDCANS(G32_19)=11,[ 2, 7, 0, 2, 0, 0 ],16,2,8,0,0,1,1
kKEZDCANS(G32_20)=11,[ 2, 7, 0, 2, 0, 0 ],16,2,8,0,0,1,1
kKEZDCANS(G32_21)=32,[ 32, 0, 0, 0, 0, 0 ],4,32,1,0,1,1,1
kKEZDCANS(G32_22)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_23)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_24)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_25)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_26)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_27)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_28)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_29)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_30)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_31)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_32)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_33)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_34)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_35)=14,[ 4, 6, 4, 0, 0, 0 ],4,4,4,0,0,1,1
kKEZDCANS(G32_36)=32,[ 32, 0, 0, 0, 0, 0 ],8,32,1,0,1,1,1
kKEZDCANS(G32_37)=20,[ 8, 12, 0, 0, 0, 0 ],8,8,2,0,0,1,1
kKEZDCANS(G32_38)=20,[ 8, 12, 0, 0, 0, 0 ],8,8,2,0,0,1,1
kKEZDCANS(G32_39)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_40)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_41)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_42)=14,[ 4, 6, 4, 0, 0, 0 ],8,4,4,0,0,1,1
kKEZDCANS(G32_43)=11,[ 2, 3, 6, 0, 0, 0 ],8,2,4,0,0,1,1
kKEZDCANS(G32_44)=11,[ 2, 3, 6, 0, 0, 0 ],8,2,4,0,0,1,1
kKEZDCANS(G32_45)=32,[ 32, 0, 0, 0, 0, 0 ],4,32,1,0,1,1,1
kKEZDCANS(G32_46)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_47)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_48)=20,[ 8, 12, 0, 0, 0, 0 ],4,8,2,0,0,1,1
kKEZDCANS(G32_49)=17,[ 2, 15, 0, 0, 0, 0 ],4,2,2,0,0,1,1
kKEZDCANS(G32_50)=17,[ 2, 15, 0, 0, 0, 0 ],4,2,2,0,0,1,1
kKEZDCANS(G32_51)=32,[ 32, 0, 0, 0, 0, 0 ],2,32,1,0,1,1,1
gap> b2i:=function(b) ret:=0;;if b then ret:=1;fi;return ret;;end;;n:=48;;m:=NumberSmallGroups(n);;for ii in [1..m] do G:=SmallGroup(n,ii);cl:=ConjugacyClasses(G);L:=[];len:=Size(cl);for i in [1..len] do Add(L,Size(cl[i]));od;M:=DivisorsInt(n);K:=[];for i in M do Add(K,Size(Positions(L,i)));od;Print("kKEZDCANS(G",n,"_",ii,")=",Size(ConjugacyClasses(G)),",",K,",",Exponent(G),",",Size(Center(G)),",",Size(DerivedSubgroup(G)),",",b2i(IsCyclic(G)),",",b2i(IsAbelian(G)),",",b2i(IsNilpotentGroup(G)),",",b2i(IsSolvableGroup(G)),"\n");od;
kKEZDCANS(G48_1)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],48,8,3,0,0,0,1
kKEZDCANS(G48_2)=48,[ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],48,48,1,1,1,1,1
kKEZDCANS(G48_3)=8,[ 1, 0, 5, 0, 0, 0, 0, 2, 0, 0 ],12,1,16,0,0,0,1
kKEZDCANS(G48_4)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],24,8,3,0,0,0,1
kKEZDCANS(G48_5)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],24,4,6,0,0,0,1
kKEZDCANS(G48_6)=15,[ 2, 11, 0, 0, 0, 0, 2, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_7)=15,[ 2, 11, 0, 0, 0, 0, 2, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_8)=15,[ 2, 11, 0, 0, 0, 0, 2, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_9)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],24,8,3,0,0,0,1
kKEZDCANS(G48_10)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],24,4,6,0,0,0,1
kKEZDCANS(G48_11)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],12,8,3,0,0,0,1
kKEZDCANS(G48_12)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_13)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_14)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_15)=12,[ 2, 3, 0, 4, 2, 0, 1, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_16)=12,[ 2, 3, 0, 4, 2, 0, 1, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_17)=12,[ 2, 3, 0, 4, 2, 0, 1, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_18)=12,[ 2, 3, 0, 4, 2, 0, 1, 0, 0, 0 ],24,2,12,0,0,0,1
kKEZDCANS(G48_19)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_20)=48,[ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],12,48,1,0,1,1,1
kKEZDCANS(G48_21)=30,[ 12, 18, 0, 0, 0, 0, 0, 0, 0, 0 ],12,12,2,0,0,1,1
kKEZDCANS(G48_22)=30,[ 12, 18, 0, 0, 0, 0, 0, 0, 0, 0 ],12,12,2,0,0,1,1
kKEZDCANS(G48_23)=48,[ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],24,48,1,0,1,1,1
kKEZDCANS(G48_24)=30,[ 12, 18, 0, 0, 0, 0, 0, 0, 0, 0 ],24,12,2,0,0,1,1
kKEZDCANS(G48_25)=21,[ 6, 9, 0, 6, 0, 0, 0, 0, 0, 0 ],24,6,4,0,0,1,1
kKEZDCANS(G48_26)=21,[ 6, 9, 0, 6, 0, 0, 0, 0, 0, 0 ],24,6,4,0,0,1,1
kKEZDCANS(G48_27)=21,[ 6, 9, 0, 6, 0, 0, 0, 0, 0, 0 ],24,6,4,0,0,1,1
kKEZDCANS(G48_28)=8,[ 2, 0, 0, 0, 3, 2, 1, 0, 0, 0 ],24,2,24,0,0,0,1
kKEZDCANS(G48_29)=8,[ 2, 0, 0, 0, 3, 2, 1, 0, 0, 0 ],24,2,24,0,0,0,1
kKEZDCANS(G48_30)=10,[ 2, 0, 2, 0, 4, 2, 0, 0, 0, 0 ],12,2,12,0,0,0,1
kKEZDCANS(G48_31)=16,[ 4, 0, 4, 8, 0, 0, 0, 0, 0, 0 ],12,4,4,0,0,0,1
kKEZDCANS(G48_32)=14,[ 4, 0, 0, 8, 2, 0, 0, 0, 0, 0 ],12,4,8,0,0,0,1
kKEZDCANS(G48_33)=14,[ 4, 0, 0, 8, 2, 0, 0, 0, 0, 0 ],12,4,8,0,0,0,1
kKEZDCANS(G48_34)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_35)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],12,8,3,0,0,0,1
kKEZDCANS(G48_36)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_37)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_38)=15,[ 2, 5, 2, 3, 3, 0, 0, 0, 0, 0 ],12,2,6,0,0,0,1
kKEZDCANS(G48_39)=15,[ 2, 5, 2, 3, 3, 0, 0, 0, 0, 0 ],12,2,6,0,0,0,1
kKEZDCANS(G48_40)=15,[ 2, 5, 2, 3, 3, 0, 0, 0, 0, 0 ],12,2,6,0,0,0,1
kKEZDCANS(G48_41)=15,[ 2, 5, 2, 3, 3, 0, 0, 0, 0, 0 ],12,2,6,0,0,0,1
kKEZDCANS(G48_42)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],12,8,3,0,0,0,1
kKEZDCANS(G48_43)=18,[ 4, 10, 0, 0, 4, 0, 0, 0, 0, 0 ],12,4,6,0,0,0,1
kKEZDCANS(G48_44)=48,[ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],12,48,1,0,1,1,1
kKEZDCANS(G48_45)=30,[ 12, 18, 0, 0, 0, 0, 0, 0, 0, 0 ],12,12,2,0,0,1,1
kKEZDCANS(G48_46)=30,[ 12, 18, 0, 0, 0, 0, 0, 0, 0, 0 ],12,12,2,0,0,1,1
kKEZDCANS(G48_47)=30,[ 12, 18, 0, 0, 0, 0, 0, 0, 0, 0 ],12,12,2,0,0,1,1
kKEZDCANS(G48_48)=10,[ 2, 0, 2, 0, 4, 2, 0, 0, 0, 0 ],12,2,12,0,0,0,1
kKEZDCANS(G48_49)=16,[ 4, 0, 4, 8, 0, 0, 0, 0, 0, 0 ],6,4,4,0,0,0,1
kKEZDCANS(G48_50)=8,[ 1, 0, 5, 0, 0, 0, 0, 2, 0, 0 ],6,1,16,0,0,0,1
kKEZDCANS(G48_51)=24,[ 8, 8, 8, 0, 0, 0, 0, 0, 0, 0 ],6,8,3,0,0,0,1
kKEZDCANS(G48_52)=48,[ 48, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],6,48,1,0,1,1,1
D:\go20190906\src\IGroup>FiniteGroup
GAP[12,2]:
GAP[24,9]=GAP[12,2]×GAP[2,1]:
GAP[12,3]:
GAP[24,13]=GAP[12,3]×GAP[2,1]:
GAP[12,4]:
GAP[24,14]=GAP[12,4]×GAP[2,1]:
GAP[12,5]:
GAP[24,15]=GAP[12,5]×GAP[2,1]:
GAP[8,1]:
GAP[8,2]:
GAP[24,2]=GAP[8,1]×GAP[3,1]:
GAP[24,9]=GAP[8,2]×GAP[3,1]:
GAP[16,5]:
GAP[16,13]:
GAP[32,37]=GAP[16,5]×GAP[2,1]:
GAP[32,48]=GAP[16,13]×GAP[2,1]:
GAP[48,24]=GAP[16,5]×GAP[3,1]:
GAP[48,47]=GAP[16,13]×GAP[3,1]:
class IDHelper
{
public:
IDHelper();
~IDHelper();
private:
multimap<string,int> m_N0;
multimap<string,int> m_S2;
multimap<string,int> m_kKEZDCANS;
public:
vector<int> IDFromN0(string& N0);//根据N0返回ID编号列表
vector<int> IDFromS2(string& S2);//根据S2返回ID编号列表
vector<int> IDFromkKEZDCANS(string& kKEZDCANS);//根据kKEZDCANS返回ID编号列表
};
IDHelper::IDHelper(){
//G2
m_N0.insert(make_pair("1,1",1));
//G3
m_N0.insert(make_pair("1,2",1));
//G4
m_N0.insert(make_pair("1,1,2",1));
m_N0.insert(make_pair("1,3,0",2));
//G6
m_N0.insert(make_pair("1,3,2,0",1));
m_N0.insert(make_pair("1,1,2,2",2));
//G8
m_N0.insert(make_pair("1,1,2,4",1));
m_N0.insert(make_pair("1,3,4,0",2));
m_N0.insert(make_pair("1,5,2,0",3));
m_N0.insert(make_pair("1,1,6,0",4));
m_N0.insert(make_pair("1,7,0,0",5));
//G9
m_N0.insert(make_pair("1,2,6",1));
m_N0.insert(make_pair("1,8,0",2));
//G12
m_N0.insert(make_pair("1,1,2,6,2,0",1));
m_N0.insert(make_pair("1,1,2,2,2,4",2));
m_N0.insert(make_pair("1,3,8,0,0,0",3));
m_N0.insert(make_pair("1,7,2,0,2,0",4));
m_N0.insert(make_pair("1,3,2,0,6,0",5));
//G16
m_N0.insert(make_pair("1,1,2,4,8",1));
m_N0.insert(make_pair("1,3,12,0,0",2));
m_N0.insert(make_pair("1,7,8,0,0",3));
m_N0.insert(make_pair("1,3,12,0,0",4));
m_N0.insert(make_pair("1,3,4,8,0",5));
m_N0.insert(make_pair("1,1,2,4,8",6));
m_N0.insert(make_pair("1,9,2,4,0",7));
m_N0.insert(make_pair("1,5,6,4,0",8));
m_N0.insert(make_pair("1,1,10,4,0",9));
m_N0.insert(make_pair("1,7,8,0,0",10));
m_N0.insert(make_pair("1,11,4,0,0",11));
m_N0.insert(make_pair("1,3,12,0,0",12));
m_N0.insert(make_pair("1,7,8,0,0",13));
m_N0.insert(make_pair("1,15,0,0,0",14));
//G16
m_S2.insert(make_pair("0,1,5,22,92",1));
m_S2.insert(make_pair("0,3,33,36,48",2));
m_S2.insert(make_pair("0,7,41,24,48",3));
m_S2.insert(make_pair("0,3,33,36,48",4));
m_S2.insert(make_pair("0,3,13,56,48",5));
m_S2.insert(make_pair("0,3,13,56,48",6));
m_S2.insert(make_pair("0,9,17,46,48",7));
m_S2.insert(make_pair("0,5,21,46,48",8));
m_S2.insert(make_pair("0,1,25,46,48",9));
m_S2.insert(make_pair("0,7,41,72,0",10));
m_S2.insert(make_pair("0,11,49,60,0",11));
m_S2.insert(make_pair("0,3,33,84,0",12));
m_S2.insert(make_pair("0,7,29,84,0",13));
m_S2.insert(make_pair("0,15,105,0,0",14));
//G24
m_N0.insert(make_pair("1,1,2,2,2,12,4,0",1));
m_N0.insert(make_pair("1,1,2,2,2,4,4,8",2));
m_N0.insert(make_pair("1,1,8,6,8,0,0,0",3));
m_N0.insert(make_pair("1,1,2,14,2,0,4,0",4));
m_N0.insert(make_pair("1,7,2,8,2,0,4,0",5));
m_N0.insert(make_pair("1,13,2,2,2,0,4,0",6));
m_N0.insert(make_pair("1,3,2,12,6,0,0,0",7));
m_N0.insert(make_pair("1,9,2,6,6,0,0,0",8));
m_N0.insert(make_pair("1,3,2,4,6,0,8,0",9));
m_N0.insert(make_pair("1,5,2,2,10,0,4,0",10));
m_N0.insert(make_pair("1,1,2,6,2,0,12,0",11));
m_N0.insert(make_pair("1,9,8,6,0,0,0,0",12));
m_N0.insert(make_pair("1,7,8,0,8,0,0,0",13));
m_N0.insert(make_pair("1,15,2,0,6,0,0,0",14));
m_N0.insert(make_pair("1,7,2,0,14,0,0,0",15));
//G24
m_S2.insert(make_pair("0,1,3,5,11,66,46,144",1));
m_S2.insert(make_pair("0,1,3,5,11,22,46,188",2));
m_S2.insert(make_pair("0,1,12,15,44,12,0,192",3));
m_S2.insert(make_pair("0,1,3,35,11,36,118,72",4));
m_S2.insert(make_pair("0,7,3,29,29,36,100,72",5));
m_S2.insert(make_pair("0,13,3,23,47,36,82,72",6));
m_S2.insert(make_pair("0,3,3,33,33,36,96,72",7));
m_S2.insert(make_pair("0,9,3,27,51,36,78,72",8));
m_S2.insert(make_pair("0,3,3,13,33,12,116,96",9));
m_S2.insert(make_pair("0,5,3,11,55,12,94,96",10));
m_S2.insert(make_pair("0,1,3,15,11,12,138,96",11));
m_S2.insert(make_pair("0,9,12,27,36,36,48,108",12));
m_S2.insert(make_pair("0,7,12,21,44,0,48,144",13));
m_S2.insert(make_pair("0,15,3,57,69,0,132,0",14));
m_S2.insert(make_pair("0,7,3,21,77,0,168,0",15));
//G32
m_N0.insert(make_pair("1,1,2,4,8,16",1));
m_N0.insert(make_pair("1,3,12,16,0,0",3));
m_N0.insert(make_pair("1,3,12,16,0,0",4));
m_N0.insert(make_pair("1,11,20,0,0,0",6));
m_N0.insert(make_pair("1,11,4,16,0,0",7));
m_N0.insert(make_pair("1,11,12,8,0,0",9));
m_N0.insert(make_pair("1,7,16,8,0,0",11));
m_N0.insert(make_pair("1,3,12,16,0,0",12));
m_N0.insert(make_pair("1,3,20,8,0,0",14));
m_N0.insert(make_pair("1,3,4,24,0,0",15));
m_N0.insert(make_pair("1,3,4,8,16,0",16));
m_N0.insert(make_pair("1,3,4,8,16,0",17));
m_N0.insert(make_pair("1,17,2,4,8,0",18));
m_N0.insert(make_pair("1,9,10,4,8,0",19));
m_N0.insert(make_pair("1,1,18,4,8,0",20));
m_N0.insert(make_pair("1,7,24,0,0,0",21));
m_N0.insert(make_pair("1,15,16,0,0,0",22));
m_N0.insert(make_pair("1,7,24,0,0,0",23));
m_N0.insert(make_pair("1,7,24,0,0,0",24));
m_N0.insert(make_pair("1,11,20,0,0,0",25));
m_N0.insert(make_pair("1,3,28,0,0,0",26));
m_N0.insert(make_pair("1,19,12,0,0,0",27));
m_N0.insert(make_pair("1,15,16,0,0,0",28));
m_N0.insert(make_pair("1,19,12,0,0,0",34));
m_N0.insert(make_pair("1,7,8,16,0,0",36));
m_N0.insert(make_pair("1,7,8,16,0,0",37));
m_N0.insert(make_pair("1,7,8,16,0,0",38));
m_N0.insert(make_pair("1,19,4,8,0,0",39));
m_N0.insert(make_pair("1,11,12,8,0,0",40));
m_N0.insert(make_pair("1,3,20,8,0,0",41));
m_N0.insert(make_pair("1,11,12,8,0,0",42));
m_N0.insert(make_pair("1,15,8,8,0,0",43));
m_N0.insert(make_pair("1,15,16,0,0,0",45));
m_N0.insert(make_pair("1,23,8,0,0,0",46));
m_N0.insert(make_pair("1,7,24,0,0,0",47));
m_N0.insert(make_pair("1,15,16,0,0,0",48));
m_N0.insert(make_pair("1,19,12,0,0,0",49));
m_N0.insert(make_pair("1,31,0,0,0,0",51));
//G32
m_S2.insert(make_pair("0,1,5,22,92,376",1));
m_S2.insert(make_pair("0,3,33,124,144,192",3));
m_S2.insert(make_pair("0,3,33,124,144,192",4));
m_S2.insert(make_pair("0,11,89,108,96,192",6));
m_S2.insert(make_pair("0,11,49,148,96,192",7));
m_S2.insert(make_pair("0,11,69,128,96,192",9));
m_S2.insert(make_pair("0,7,49,152,96,192",11));
m_S2.insert(make_pair("0,3,33,124,144,192",12));
m_S2.insert(make_pair("0,3,53,104,144,192",14));
m_S2.insert(make_pair("0,3,13,144,144,192",15));
m_S2.insert(make_pair("0,3,13,56,232,192",16));
m_S2.insert(make_pair("0,3,13,56,232,192",17));
m_S2.insert(make_pair("0,17,29,70,188,192",18));
m_S2.insert(make_pair("0,9,37,70,188,192",19));
m_S2.insert(make_pair("0,1,45,70,188,192",20));
m_S2.insert(make_pair("0,7,81,216,192,0",21));
m_S2.insert(make_pair("0,15,145,144,192,0",22));
m_S2.insert(make_pair("0,7,81,216,192,0",23));
m_S2.insert(make_pair("0,7,81,120,288,0",24));
m_S2.insert(make_pair("0,11,89,204,192,0",25));
m_S2.insert(make_pair("0,3,73,132,288,0",26));
m_S2.insert(make_pair("0,19,153,180,144,0",27));
m_S2.insert(make_pair("0,15,97,240,144,0",28));
m_S2.insert(make_pair("0,19,105,324,48,0",34));
m_S2.insert(make_pair("0,7,41,160,288,0",36));
m_S2.insert(make_pair("0,7,41,160,288,0",37));
m_S2.insert(make_pair("0,7,29,172,288,0",38));
m_S2.insert(make_pair("0,19,85,152,240,0",39));
m_S2.insert(make_pair("0,11,69,176,240,0",40));
m_S2.insert(make_pair("0,3,53,200,240,0",41));
m_S2.insert(make_pair("0,11,45,200,240,0",42));
m_S2.insert(make_pair("0,15,65,176,240,0",43));
m_S2.insert(make_pair("0,15,145,336,0,0",45));
m_S2.insert(make_pair("0,23,209,264,0,0",46));
m_S2.insert(make_pair("0,7,81,408,0,0",47));
m_S2.insert(make_pair("0,15,97,384,0,0",48));
m_S2.insert(make_pair("0,19,129,348,0,0",49));
m_S2.insert(make_pair("0,31,465,0,0,0",51));
//G32
m_kKEZDCANS.insert(make_pair("32,[32,0,0,0,0,0],8,32,1,0,1,1,1",36));
m_kKEZDCANS.insert(make_pair("20,[8,12,0,0,0,0],8,8,2,0,0,1,1",37));
//G48
m_N0.insert(make_pair("1,1,2,2,2,4,4,24,8,0",1));
m_N0.insert(make_pair("1,1,2,2,2,4,4,8,8,16",2));
m_N0.insert(make_pair("1,3,32,12,0,0,0,0,0,0",3));
m_N0.insert(make_pair("1,7,2,8,2,16,4,0,8,0",4));
m_N0.insert(make_pair("1,13,2,14,2,4,4,0,8,0",6));
m_N0.insert(make_pair("1,25,2,2,2,4,4,0,8,0",7));
m_N0.insert(make_pair("1,1,2,26,2,4,4,0,8,0",8));
m_N0.insert(make_pair("1,3,2,4,6,24,8,0,0,0",9));
m_N0.insert(make_pair("1,3,2,4,6,24,8,0,0,0",10));
m_N0.insert(make_pair("1,3,2,28,6,0,8,0,0,0",13));
m_N0.insert(make_pair("1,15,2,16,6,0,8,0,0,0",14));
m_N0.insert(make_pair("1,17,2,2,10,12,4,0,0,0",15));
m_N0.insert(make_pair("1,3,2,12,6,0,24,0,0,0",20));
m_N0.insert(make_pair("1,7,2,8,14,0,16,0,0,0",21));
m_N0.insert(make_pair("1,3,2,12,6,0,24,0,0,0",22));
m_N0.insert(make_pair("1,3,2,4,6,8,8,0,16,0",23));
m_N0.insert(make_pair("1,3,2,4,6,8,8,0,16,0",24));
m_N0.insert(make_pair("1,9,2,2,18,4,4,0,8,0",25));
m_N0.insert(make_pair("1,5,2,6,10,4,12,0,8,0",26));
m_N0.insert(make_pair("1,1,2,10,2,4,20,0,8,0",27));
m_N0.insert(make_pair("1,13,8,6,8,12,0,0,0,0",29));
m_N0.insert(make_pair("1,7,8,24,8,0,0,0,0,0",30));
m_N0.insert(make_pair("1,7,8,8,8,0,16,0,0,0",31));
m_N0.insert(make_pair("1,3,8,12,24,0,0,0,0,0",32));
m_N0.insert(make_pair("1,7,8,8,8,0,16,0,0,0",33));
m_N0.insert(make_pair("1,3,2,28,6,0,8,0,0,0",34));
m_N0.insert(make_pair("1,15,2,16,6,0,8,0,0,0",35));
m_N0.insert(make_pair("1,27,2,4,6,0,8,0,0,0",36));
m_N0.insert(make_pair("1,15,2,16,6,0,8,0,0,0",37));
m_N0.insert(make_pair("1,23,2,8,10,0,4,0,0,0",38));
m_N0.insert(make_pair("1,7,2,24,2,0,12,0,0,0",40));
m_N0.insert(make_pair("1,7,2,24,14,0,0,0,0,0",42));
m_N0.insert(make_pair("1,19,2,12,14,0,0,0,0,0",43));
m_N0.insert(make_pair("1,7,2,8,14,0,16,0,0,0",44));
m_N0.insert(make_pair("1,11,2,4,22,0,8,0,0,0",45));
m_N0.insert(make_pair("1,3,2,12,6,0,24,0,0,0",46));
m_N0.insert(make_pair("1,7,2,8,14,0,16,0,0,0",47));
m_N0.insert(make_pair("1,19,8,12,8,0,0,0,0,0",48));
m_N0.insert(make_pair("1,15,8,0,24,0,0,0,0,0",49));
m_N0.insert(make_pair("1,15,32,0,0,0,0,0,0,0",50));
m_N0.insert(make_pair("1,31,2,0,14,0,0,0,0,0",51));
m_N0.insert(make_pair("1,15,2,0,30,0,0,0,0,0",52));
//G48
m_S2.insert(make_pair("0,1,3,5,11,22,46,276,188,576",1));
m_S2.insert(make_pair("0,1,3,5,11,22,46,92,188,760",2));
m_S2.insert(make_pair("0,3,48,33,0,36,192,48,0,768",3));
m_S2.insert(make_pair("0,7,3,29,29,124,100,144,404,288",4));
m_S2.insert(make_pair("0,13,3,53,47,94,154,144,332,288",6));
m_S2.insert(make_pair("0,25,3,41,83,94,118,144,332,288",7));
m_S2.insert(make_pair("0,1,3,65,11,94,190,144,332,288",8));
m_S2.insert(make_pair("0,3,3,13,33,144,116,144,384,288",9));
m_S2.insert(make_pair("0,3,3,13,33,144,116,144,384,288",10));
m_S2.insert(make_pair("0,3,3,73,33,84,260,144,240,288",13));
m_S2.insert(make_pair("0,15,3,97,69,48,296,144,168,288",14));
m_S2.insert(make_pair("0,17,3,29,91,114,130,144,312,288",15));
m_S2.insert(make_pair("0,3,3,33,33,36,300,48,288,384",20));
m_S2.insert(make_pair("0,7,3,41,77,24,352,48,192,384",21));
m_S2.insert(make_pair("0,3,3,33,33,36,300,48,288,384",22));
m_S2.insert(make_pair("0,3,3,13,33,56,116,48,472,384",23));
m_S2.insert(make_pair("0,3,3,13,33,56,116,48,472,384",24));
m_S2.insert(make_pair("0,9,3,17,99,46,142,48,380,384",25));
m_S2.insert(make_pair("0,5,3,21,55,46,186,48,380,384",26));
m_S2.insert(make_pair("0,1,3,25,11,46,230,48,380,384",27));
m_S2.insert(make_pair("0,13,12,33,116,114,72,144,192,432",29));
m_S2.insert(make_pair("0,7,12,81,44,72,192,144,144,432",30));
m_S2.insert(make_pair("0,7,12,41,44,72,232,0,144,576",31));
m_S2.insert(make_pair("0,3,12,33,132,84,96,0,192,576",32));
m_S2.insert(make_pair("0,7,12,29,44,84,184,0,192,576",33));
m_S2.insert(make_pair("0,3,3,73,33,228,260,0,528,0",34));
m_S2.insert(make_pair("0,15,3,97,69,192,296,0,456,0",35));
m_S2.insert(make_pair("0,27,3,121,105,156,332,0,384,0",36));
m_S2.insert(make_pair("0,15,3,61,69,228,224,0,528,0",37));
m_S2.insert(make_pair("0,23,3,125,109,156,328,0,384,0",38));
m_S2.insert(make_pair("0,7,3,69,29,228,264,0,528,0",40));
m_S2.insert(make_pair("0,7,3,81,77,216,312,0,432,0",42));
m_S2.insert(make_pair("0,19,3,105,113,180,348,0,360,0",43));
m_S2.insert(make_pair("0,7,3,41,77,72,352,0,576,0",44));
m_S2.insert(make_pair("0,11,3,49,121,60,404,0,480,0",45));
m_S2.insert(make_pair("0,3,3,33,33,84,300,0,672,0",46));
m_S2.insert(make_pair("0,7,3,29,77,84,256,0,672,0",47));
m_S2.insert(make_pair("0,19,12,105,116,180,120,0,360,216",48));
m_S2.insert(make_pair("0,15,12,105,132,0,144,0,432,288",49));
m_S2.insert(make_pair("0,15,48,105,0,0,960,0,0,0",50));
m_S2.insert(make_pair("0,31,3,273,149,0,672,0,0,0",51));
m_S2.insert(make_pair("0,15,3,105,165,0,840,0,0,0",52));
//G48
m_kKEZDCANS.insert(make_pair("48,[48,0,0,0,0,0,0,0,0,0],24,48,1,0,1,1,1",23));
m_kKEZDCANS.insert(make_pair("30,[12,18,0,0,0,0,0,0,0,0],24,12,2,0,0,1,1",24));
}
//-----------------------------Begin of calckKEZDCANS---------------------------------
// 判断群g是否真的是群(没有利用群的正则表示,仅仅根据抽象群的定义)
bool IsGroup(IGroup* g){
int N=g->size();
// 0是乘法单位元
// 乘法封闭性
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
int ij=g->mul(i,j);
if(ij<0||ij>=N){
return false;
}
}
}
// 有乘法逆元
for(int i=0;i<N;i++){
int i1=g->inv(i);
if(i1<0||i1>=N){
return false;
}
}
// 结合律(利用群的正则表示判断时没有加这一条件)
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
for(int k=0;k<N;k++){
int ij_k=g->mul(g->mul(i,j),k);
int i_jk=g->mul(i,g->mul(j,k));
if(ij_k!=i_jk){
return false;
}
}
}
}
return true;
}
vector<int> Order(IGroup* g,int m){
vector<int> ret;
int mi=m;
int m0=0;
ret.push_back(m0);
while(mi!=m0){
ret.push_back(mi);
mi=g->mul(mi,m);
}
return ret;
}
bool IsCyclic(IGroup* g){
if(!IsGroup(g))
return false;
int N=g->size();
for(int i=0;i<N;i++){
vector<int> S1=Order(g,i);
int ord=S1.size();
if(ord==N){
return true;
}
}
return false;
}
bool IsAbelian(IGroup* g){
if(!IsGroup(g))
return false;
int N=g->size();
// 乘法交换性
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
int ij=g->mul(i,j);
int ji=g->mul(j,i);
if(ij==ji)
continue;
else
return false;
}
}
return true;
}
// 降中心列:G,G'=[G,G],G''=[G',G],……
vector<int> commutatorOfGn(IGroup* g,const vector<int> &vGn){
vector<int> ret;
int M=vGn.size();
int N=g->size();
for(int k=0;k<M;k++){
int i=vGn[k];
int I=g->inv(i);
for(int j=0;j<N;j++){
int ij=g->mul(i,j);
int J=g->inv(j);
int IJ=g->mul(I,J);
int ijIJ=g->mul(ij,IJ);
ret.push_back(ijIJ);
}
}
sort(ret.begin(),ret.end());
ret.erase(unique(ret.begin(),ret.end()),ret.end());
return ret;
}
int IsNilpotentGroup(IGroup* g){
if(!IsGroup(g))
return false;
int N=g->size();
if(N==1)
return true;
vector<int> vGn;
for(int i=0;i<N;i++){
vGn.push_back(i);
}
for(int i=0;i<N;i++){
int n=vGn.size();
vGn=commutatorOfGn(g,vGn);
int n1=vGn.size();
if(n1==1)
return true;
if(n1>1 && n==n1)
return false;
}
return false;
}
int Inv(const vector<vector<int>> &vvG,int j){
int N=vvG.size();
for(int i=0;i<N;i++)
{
int ij=vvG[i][j];
if(ij==0)
return i;
}
return -1;
}
vector<int> commutatorOfG(const vector<vector<int>> &vvG){
vector<int> ret;
int N=vvG.size();
for(int i=0;i<N;i++)
{
int I=Inv(vvG,i);
for(int j=0;j<N;j++)
{
int ij=vvG[i][j];
int J=Inv(vvG,j);
int IJ=vvG[I][J];
int ijIJ=vvG[ij][IJ];
ret.push_back(ijIJ);
}
}
sort(ret.begin(),ret.end());
ret.erase(unique(ret.begin(),ret.end()),ret.end());
return ret;
}
vector<vector<int> > getTable(IGroup *g,int delt)
{
vector<vector<int> > vv(g->size(),vector<int>(g->size()));
for(int i=0;i<g->size();i++)
for(int j=0;j<g->size();j++)
{
vv[i][j]=g->mul(i,j)+delt;
}
return vv;
}
vector<int> commutatorOfG(IGroup* g){
vector<int> ret;
int N=g->size();
for(int i=0;i<N;i++){
int I=g->inv(i);
for(int j=0;j<N;j++){
int ij=g->mul(i,j);
int J=g->inv(j);
int IJ=g->mul(I,J);
int ijIJ=g->mul(ij,IJ);
ret.push_back(ijIJ);
}
}
sort(ret.begin(),ret.end());
ret.erase(unique(ret.begin(),ret.end()),ret.end());
return ret;
}
int ToNormal(const vector<int> &v,int a){
for(int i=0;i<v.size();i++)
{
if(v[i]==a)
return i;
}
return -1;
}
// 群G的换位子群或导群G'
vector<vector<int> > DG(const vector<vector<int>> &vvG){
vector<int> DA=commutatorOfG(vvG);
int n=DA.size();
vector<vector<int> > ret(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int ij=vvG[DA[i]][DA[j]];
int ij2=ToNormal(DA,ij);
ret[i].push_back(ij2);
}
}
return ret;
}
int IsSolvableGroup(IGroup* g){
if(!IsGroup(g))
return false;
int N=g->size();
vector<vector<int> > vvG=getTable(g,0);
for(int i=0;i<N;i++)
{
int n=vvG.size();
vvG=DG(vvG);
int n1=vvG.size();
if(n1==1)
return true;
if(n1>1 && n==n1)
return false;
}
return true;
}
bool IsInCenterOfG(IGroup* g,int j){
int N=g->size();
for(int i=0;i<N;i++){
int ij=g->mul(i,j);
int ji=g->mul(j,i);
if(ij==ji)
continue;
else
return false;
}
return true;
}
vector<int> CenterOfG(IGroup* g){
vector<int> ret;
int N=g->size();
for(int i=0;i<N;i++){
if(IsInCenterOfG(g,i))
ret.push_back(i);
else
continue;
}
return ret;
}
//利用欧几里得算法计算两个数的最大公约数
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(IGroup* g)
{
vector<vector<int>> A=getTable(g,1);
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;
}
// 定义:给定群G,对G中的两个元a,b,若存在G中的某个元g,使得g^-1ag=b,就称元素a,b在G中共轭,记为a~b。
bool IsConjugacy(IGroup* g,int a,int b){
int N=g->size();
for(int i=0;i<N;i++){
int ai=g->mul(a,i);
int ib=g->mul(i,b);
if(ai==ib)
return true;
}
return false;
}
vector<int> ConjugacyClasses(IGroup* g,int a){
vector<int> ret;
int N=g->size();
for(int i=0;i<N;i++){
bool bCon=IsConjugacy(g,a,i);
if(bCon)
ret.push_back(i);
}
return ret;
}
vector<vector<int> > ConjugacyClasses(IGroup* g){
vector<vector<int> > vv;
int N=g->size();
for(int i=0;i<N;i++){
vector<int> v=ConjugacyClasses(g,i);
vv.push_back(v);
}
sort(vv.begin(),vv.end());
vv.erase(unique(vv.begin(),vv.end()),vv.end());
return vv;
}
// G表示有限群,k=Con(G)表示G的共轭类个数
int calk(IGroup* g)
{
if(!IsGroup(g))
return 0;
vector<vector<int> > vv=ConjugacyClasses(g);
int k=vv.size();
return k;
}
// G表示有限群,K表示G的共轭类长度的分布
string calK(IGroup* g)
{
if(!IsGroup(g))
return "";
vector<vector<int> > vv=ConjugacyClasses(g);
int k=vv.size();
int n=g->size();
vector<int> vOrders=Factors(n);
vector<int> vCounts(n+1);
for(int i=0;i<k;i++)
{
int ord=vv[i].size();
vCounts[ord]=vCounts[ord]+1;
}
string strK="";
for(int i=0;i<vOrders.size();i++)
{
char sz[200]={0};
sprintf(sz,"%d,",vCounts[vOrders[i]]);
strK+=sz;
}
if(strK.size()>2)
{
strK=strK.substr(0,strK.size()-1);
}
return strK;
}
string calckKEZDCANS(IGroup* g){
int k=calk(g);
string K=calK(g);
int E=Exponent(g);
vector<int> vZ=CenterOfG(g);
int Z=vZ.size();
vector<int> vD=commutatorOfG(g);
int D=vD.size();
bool bC=IsCyclic(g);
bool bA=IsAbelian(g);
bool bN=IsNilpotentGroup(g);
bool bS=IsSolvableGroup(g);
char sz[1024]={0};
sprintf(sz,"%d,[%s],%d,%d,%d,%d,%d,%d,%d",k,K.c_str(),E,Z,D,bC,bA,bN,bS);
return sz;
}
//-----------------------------End of calckKEZDCANS---------------------------------
#include"IGroup.h"
#include<iostream>
#include<complex>
using namespace std;
int G12_2[12][12]=
{
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
{2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11 },
{3, 4, 5, 6, 1, 2, 9, 10, 11, 12, 7, 8 },
{4, 3, 6, 5, 2, 1, 10, 9, 12, 11, 8, 7 },
{5, 6, 1, 2, 3, 4, 11, 12, 7, 8, 9, 10 },
{6, 5, 2, 1, 4, 3, 12, 11, 8, 7, 10, 9},
{7, 8, 9, 10, 11, 12, 2, 1, 4, 3, 6, 5},
{8, 7, 10, 9, 12, 11, 1, 2, 3, 4, 5, 6},
{9, 10, 11, 12, 7, 8, 4, 3, 6, 5, 2, 1},
{10, 9, 12, 11, 8, 7, 3, 4, 5, 6, 1, 2},
{11, 12, 7, 8, 9, 10, 6, 5, 2, 1, 4, 3},
{12, 11, 8, 7, 10, 9, 5, 6, 1, 2, 3, 4}
};
int G12_3[12][12]=
{
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
{2, 1, 4, 3, 8, 7, 6, 5, 11, 12, 9, 10 },
{3, 4, 1, 2, 6, 5, 8, 7, 12, 11, 10, 9 },
{4, 3, 2, 1, 7, 8, 5, 6, 10, 9, 12, 11 },
{5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4 },
{6, 5, 8, 7, 12, 11, 10, 9, 3, 4, 1, 2},
{7, 8, 5, 6, 10, 9, 12, 11, 4, 3, 2, 1},
{8, 7, 6, 5, 11, 12, 9, 10, 2, 1, 4, 3},
{9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8},
{10, 9, 12, 11, 4, 3, 2, 1, 7, 8, 5, 6},
{11, 12, 9, 10, 2, 1, 4, 3, 8, 7, 6, 5},
{12, 11, 10, 9, 3, 4, 1, 2, 6, 5, 8, 7}
};
int G12_4[12][12]=
{
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
{2, 3, 1, 5, 6, 4, 9, 7, 8, 12, 10, 11 },
{3, 1, 2, 6, 4, 5, 8, 9, 7, 11, 12, 10 },
{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9 },
{5, 6, 4, 2, 3, 1, 12, 10, 11, 9, 7, 8 },
{6, 4, 5, 3, 1, 2, 11, 12, 10, 8, 9, 7},
{7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6},
{8, 9, 7, 11, 12, 10, 3, 1, 2, 6, 4, 5},
{9, 7, 8, 12, 10, 11, 2, 3, 1, 5, 6, 4},
{10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3},
{11, 12, 10, 8, 9, 7, 6, 4, 5, 3, 1, 2},
{12, 10, 11, 9, 7, 8, 5, 6, 4, 2, 3, 1}
};
int G12_5[12][12]=
{
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
{2, 3, 1, 5, 6, 4, 8, 9, 7, 11, 12, 10 },
{3, 1, 2, 6, 4, 5, 9, 7, 8, 12, 10, 11 },
{4, 5, 6, 1, 2, 3, 10, 11, 12, 7, 8, 9 },
{5, 6, 4, 2, 3, 1, 11, 12, 10, 8, 9, 7 },
{6, 4, 5, 3, 1, 2, 12, 10, 11, 9, 7, 8},
{7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6 },
{8, 9, 7, 11, 12, 10, 2, 3, 1, 5, 6, 4},
{9, 7, 8, 12, 10, 11, 3, 1, 2, 6, 4, 5},
{10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3},
{11, 12, 10, 8, 9, 7, 5, 6, 4, 2, 3, 1},
{12, 10, 11, 9, 7, 8, 6, 4, 5, 3, 1, 2}
};
int g_C8Mul_2[8][8]={
{0,1,2,3,4,5,6,7},
{1,2,3,4,5,6,7,0},
{2,3,4,5,6,7,0,1},
{3,4,5,6,7,0,1,2},
{4,5,6,7,0,1,2,3},
{5,6,7,0,1,2,3,4},
{6,7,0,1,2,3,4,5},
{7,0,1,2,3,4,5,6}
};
int g_C2C4Mul_2[8][8]={
{0,1,2,3,4,5,6,7},
{1,4,7,2,5,0,3,6},
{2,7,4,1,6,3,0,5},
{3,2,1,0,7,6,5,4},
{4,5,6,7,0,1,2,3},
{5,0,3,6,1,4,7,2},
{6,3,0,5,2,7,4,1},
{7,6,5,4,3,2,1,0}
};
int g_M16Mul[16][16]={
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
{1,0,8,9,10,11,7,6,2,3,4,5,15,14,13,12},
{2,8,4,6,5,1,12,15,10,7,11,0,13,9,3,14},
{3,9,7,0,12,14,8,2,6,1,15,13,4,11,5,10},
{4,10,5,12,1,8,13,14,11,15,0,2,9,7,6,3},
{5,11,1,13,8,10,9,3,0,14,2,4,7,15,12,6},
{6,7,15,2,13,3,10,4,12,8,14,9,5,0,1,11},
{7,6,12,8,14,9,4,10,15,2,13,3,11,1,0,5},
{8,2,10,7,11,0,15,12,4,6,5,1,14,3,9,13},
{9,3,6,1,15,13,2,8,7,0,12,14,10,5,11,4},
{10,4,11,15,0,2,14,13,5,12,1,8,3,6,7,9},
{11,5,0,14,2,4,3,9,1,13,8,10,6,12,15,7},
{12,15,14,4,9,6,11,5,13,10,3,7,1,2,8,0},
{13,14,3,5,7,12,0,1,9,11,6,15,8,4,10,2},
{14,13,9,11,6,15,1,0,3,5,7,12,2,10,4,8},
{15,12,13,10,3,7,5,11,14,4,9,6,0,8,2,1},
};
int g_P16Mul[16][16]={
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
{1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14},
{2,3,1,0,6,7,5,4,10,11,9,8,14,15,13,12},
{3,2,0,1,7,6,4,5,11,10,8,9,15,14,12,13},
{4,5,6,7,0,1,2,3,14,15,13,12,11,10,8,9},
{5,4,7,6,1,0,3,2,15,14,12,13,10,11,9,8},
{6,7,5,4,2,3,1,0,13,12,15,14,8,9,10,11},
{7,6,4,5,3,2,0,1,12,13,14,15,9,8,11,10},
{8,9,10,11,15,14,12,13,0,1,2,3,6,7,5,4},
{9,8,11,10,14,15,13,12,1,0,3,2,7,6,4,5},
{10,11,9,8,12,13,14,15,2,3,1,0,5,4,7,6},
{11,10,8,9,13,12,15,14,3,2,0,1,4,5,6,7},
{12,13,14,15,10,11,9,8,7,6,4,5,0,1,2,3},
{13,12,15,14,11,10,8,9,6,7,5,4,1,0,3,2},
{14,15,13,12,9,8,11,10,4,5,6,7,2,3,1,0},
{15,14,12,13,8,9,10,11,5,4,7,6,3,2,0,1},
};
// 生成循环群C_n的凯莱表
vector<int> Cn(int n)
{
vector<int> v(n*n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int ij=(i+j)%n;
v[i*n+j]=ij;
}
}
return v;
}
// 直接从凯莱表构造一个有限群
struct FiniteGroup:public IGroup
{
public:
// 静态函数
public:
// 实现抽象基类的方法
virtual void printSet();
virtual void printTable();
virtual int mul(int a,int b);
virtual int size();
virtual int inv(int a);
// 构造函数
FiniteGroup(int n,int* arr,int delt);
// 成员函数
vector<int> Order(int m);
// 成员变量
int m_n;
int* m_Arr;
int m_delt;
};
FiniteGroup::FiniteGroup(int n,int* arr,int delt)
{
m_n=n;
m_Arr=arr;
m_delt=delt;
}
void FiniteGroup::printSet()
{
/*
int ID=IdGroup(this);
printf("GAP[%d,%d]:\n",m_n,ID);
for(int i=0;i<m_n;i++){
int i1=inv(i);
printf("%d->%d\n",i,i1);
}
*/
}
void FiniteGroup::printTable()
{
int ID=IdGroup(this);
printf("GAP[%d,%d]:\n",m_n,ID);
//printGroup(this);
}
int FiniteGroup::mul(int a,int b)
{
int c=*(m_Arr+a*m_n+b);
return c-m_delt;
}
int FiniteGroup::inv(int a)
{
vector<int> S1=Order(a);
int ord=S1.size();
int v=S1[ord-1];
return v;
}
int FiniteGroup::size()
{
return m_n;
}
vector<int> FiniteGroup::Order(int m)
{
vector<int> ret;
int mi=m;
int m0=0;
ret.push_back(m0);
while(mi!=m0){
ret.push_back(mi);
mi=mul(mi,m);
}
return ret;
}
// 有限可分解群
struct DecompositionGroup:public IGroup
{
public:
// 静态函数
static vector<vector<int> > getTable(IGroup *g);
static vector<vector<int> > DirectProduct(const vector<vector<int>> &A,const vector<vector<int>> &B);
public:
// 实现抽象基类的方法
virtual void printSet();
virtual void printTable();
virtual int mul(int a,int b);
virtual int size();
virtual int inv(int a);
// 构造函数
DecompositionGroup(IGroup *g1,IGroup *g2);
// 成员函数
vector<int> Order(int m);
// 成员变量
IGroup *m_g1;
IGroup *m_g2;
vector<vector<int> > s_Arr;
};
vector<vector<int> > DecompositionGroup::getTable(IGroup *g)
{
vector<vector<int> > vv(g->size(),vector<int>(g->size()));
for(int i=0;i<g->size();i++)
for(int j=0;j<g->size();j++)
{
vv[i][j]=g->mul(i,j);
}
return vv;
}
vector<vector<int> > DecompositionGroup::DirectProduct(const vector<vector<int>> &A,const vector<vector<int>> &B)
{
vector<vector<int> > C;
int nA=A.size();
int nB=B.size();
int n=nA*nB;
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];
int j=B[aj][bj];
int c=nB*i+j;
iRow.push_back(c);
}
C.push_back(iRow);
}
return C;
}
DecompositionGroup::DecompositionGroup(IGroup *g1,IGroup *g2)
{
m_g1=g1;
m_g2=g2;
vector<vector<int> > A=getTable(g1);
vector<vector<int>> B=getTable(g2);
s_Arr=DirectProduct(A,B);
}
void DecompositionGroup::printSet()
{
/*
int ID=IdGroup(this);
int ID1=IdGroup(m_g1);
int ID2=IdGroup(m_g2);
printf("GAP[%d,%d]=GAP[%d,%d]×GAP[%d,%d]:\n",size(),ID,m_g1->size(),ID1,m_g2->size(),ID2);
for(int i=0;i<size();i++){
int i1=inv(i);
printf("%d->%d\n",i,i1);
}
*/
}
void DecompositionGroup::printTable()
{
int ID=IdGroup(this);
int ID1=IdGroup(m_g1);
int ID2=IdGroup(m_g2);
printf("GAP[%d,%d]=GAP[%d,%d]×GAP[%d,%d]:\n",size(),ID,m_g1->size(),ID1,m_g2->size(),ID2);
//printGroup(this);
}
int DecompositionGroup::mul(int a,int b)
{
int c=s_Arr[a][b];
return c;
}
int DecompositionGroup::inv(int a)
{
vector<int> S1=Order(a);
int ord=S1.size();
int v=S1[ord-1];
return v;
}
int DecompositionGroup::size()
{
return s_Arr.size();
}
vector<int> DecompositionGroup::Order(int m)
{
vector<int> ret;
int mi=m;
int m0=0;
ret.push_back(m0);
while(mi!=m0){
ret.push_back(mi);
mi=mul(mi,m);
}
return ret;
}
int main(){
vector<int> vC2=Cn(2);
FiniteGroup C2(2,&vC2[0],0);
int *G12[]={&G12_2[0][0],&G12_3[0][0],&G12_4[0][0],&G12_5[0][0]};
int nArr[]={12,12,12,12};
int nDelt[]={1,1,1,1};
int nNum=sizeof(nArr)/sizeof(nArr[0]);
for(int i=0;i<nNum;i++)
{
FiniteGroup fg(nArr[i],G12[i],nDelt[i]);
fg.printSet();
fg.printTable();
DecompositionGroup dg(&fg,&C2);
dg.printSet();
dg.printTable();
}
vector<int> vC3=Cn(3);
FiniteGroup C3(3,&vC3[0],0);
FiniteGroup C8(8,&g_C8Mul_2[0][0],0);
FiniteGroup C4C2(8,&g_C2C4Mul_2[0][0],0);
C8.printSet();
C8.printTable();
C4C2.printSet();
C4C2.printTable();
DecompositionGroup C8C3(&C8,&C3);
C8C3.printSet();
C8C3.printTable();
DecompositionGroup C4C2C3(&C4C2,&C3);
C4C2C3.printSet();
C4C2C3.printTable();
FiniteGroup M16(16,&g_M16Mul[0][0],0);
FiniteGroup P16(16,&g_P16Mul[0][0],0);
M16.printSet();
M16.printTable();
P16.printSet();
P16.printTable();
DecompositionGroup M16C2(&M16,&C2);
M16C2.printSet();
M16C2.printTable();
DecompositionGroup P16C2(&P16,&C2);
P16C2.printSet();
P16C2.printTable();
DecompositionGroup M16C3(&M16,&C3);
M16C3.printSet();
M16C3.printTable();
DecompositionGroup P16C3(&P16,&C3);
P16C3.printSet();
P16C3.printTable();
return 0;
}
浙公网安备 33010602011771号