自己写的gaptool(Lua版本)

有限Abel群的结构定理:一个有限Abel群可唯一的分解为素数幂循环群的直和。【通过模论的语言,你会看到这个分解定理和矩阵的Jordan标准形的存在性是一回事】
D:\hxh\bin\LUA资料\LUA\luatest\luatest1>luatest SmallGroup.lua
GAP[4,1]群元阶的分布:[1,1,2],S2=[0,1,5]
GAP[4,2]群元阶的分布:[1,3,0],S2=[0,3,3]
GAP[6,1]群元阶的分布:[1,3,2,0],S2=[0,3,3,9]
GAP[6,2]群元阶的分布:[1,1,2,2],S2=[0,1,3,11]
GAP[8,1]群元阶的分布:[1,1,2,4],S2=[0,1,5,22]
GAP[8,2]群元阶的分布:[1,3,4,0],S2=[0,3,13,12]
GAP[8,3]群元阶的分布:[1,5,2,0],S2=[0,5,11,12]
GAP[8,4]群元阶的分布:[1,1,6,0],S2=[0,1,15,12]
GAP[8,5]群元阶的分布:[1,7,0,0],S2=[0,7,21,0]
GAP[10,1]群元阶的分布:[1,5,4,0],S2=[0,5,10,30]
GAP[10,2]群元阶的分布:[1,1,4,4],S2=[0,1,10,34]
GAP[12,1]群元阶的分布:[1,1,2,6,2,0],S2=[0,1,3,15,11,36]
GAP[12,2]群元阶的分布:[1,1,2,2,2,4],S2=[0,1,3,5,11,46]
GAP[12,3]群元阶的分布:[1,3,8,0,0,0],S2=[0,3,12,3,0,48]
GAP[12,4]群元阶的分布:[1,7,2,0,2,0],S2=[0,7,3,9,29,18]
GAP[12,5]群元阶的分布:[1,3,2,0,6,0],S2=[0,3,3,3,33,24]
GAP[14,1]群元阶的分布:[1,7,6,0],S2=[0,7,21,63]
GAP[14,2]群元阶的分布:[1,1,6,6],S2=[0,1,21,69]
GAP[16,1]群元阶的分布:[1,1,2,4,8],S2=[0,1,5,22,92]
GAP[16,2]群元阶的分布:[1,3,12,0,0],S2=[0,3,33,36,48]
GAP[16,3]群元阶的分布:[1,7,8,0,0],S2=[0,7,41,24,48]
GAP[16,4]群元阶的分布:[1,3,12,0,0],S2=[0,3,33,36,48]
GAP[16,5]群元阶的分布:[1,3,4,8,0],S2=[0,3,13,56,48]
GAP[16,6]群元阶的分布:[1,3,4,8,0],S2=[0,3,13,56,48]
GAP[16,7]群元阶的分布:[1,9,2,4,0],S2=[0,9,17,46,48]
GAP[16,8]群元阶的分布:[1,5,6,4,0],S2=[0,5,21,46,48]
GAP[16,9]群元阶的分布:[1,1,10,4,0],S2=[0,1,25,46,48]
GAP[16,10]群元阶的分布:[1,7,8,0,0],S2=[0,7,41,72,0]
GAP[16,11]群元阶的分布:[1,11,4,0,0],S2=[0,11,49,60,0]
GAP[16,12]群元阶的分布:[1,3,12,0,0],S2=[0,3,33,84,0]
GAP[16,13]群元阶的分布:[1,7,8,0,0],S2=[0,7,29,84,0]
GAP[16,14]群元阶的分布:[1,15,0,0,0],S2=[0,15,105,0,0]
GAP[18,1]群元阶的分布:[1,9,2,0,6,0],S2=[0,9,3,27,33,81]
GAP[18,2]群元阶的分布:[1,1,2,2,6,6],S2=[0,1,3,11,33,105]
GAP[18,3]群元阶的分布:[1,3,8,6,0,0],S2=[0,3,12,42,24,72]
GAP[18,4]群元阶的分布:[1,9,8,0,0,0],S2=[0,9,12,108,24,0]
GAP[18,5]群元阶的分布:[1,1,8,8,0,0],S2=[0,1,12,44,24,72]
GAP[20,1]群元阶的分布:[1,1,10,4,4,0],S2=[0,1,25,10,34,120]
GAP[20,2]群元阶的分布:[1,1,2,4,4,8],S2=[0,1,5,10,34,140]
GAP[20,3]群元阶的分布:[1,5,10,4,0,0],S2=[0,5,25,10,30,120]
GAP[20,4]群元阶的分布:[1,11,0,4,4,0],S2=[0,11,15,10,94,60]
GAP[20,5]群元阶的分布:[1,3,0,4,12,0],S2=[0,3,3,10,102,72]
GAP[24,1]群元阶的分布:[1,1,2,2,2,12,4,0],S2=[0,1,3,5,11,66,46,144]
GAP[24,2]群元阶的分布:[1,1,2,2,2,4,4,8],S2=[0,1,3,5,11,22,46,188]
GAP[24,3]群元阶的分布:[1,1,8,6,8,0,0,0],S2=[0,1,12,15,44,12,0,192]
GAP[24,4]群元阶的分布:[1,1,2,14,2,0,4,0],S2=[0,1,3,35,11,36,118,72]
GAP[24,5]群元阶的分布:[1,7,2,8,2,0,4,0],S2=[0,7,3,29,29,36,100,72]
GAP[24,6]群元阶的分布:[1,13,2,2,2,0,4,0],S2=[0,13,3,23,47,36,82,72]
GAP[24,7]群元阶的分布:[1,3,2,12,6,0,0,0],S2=[0,3,3,33,33,36,96,72]
GAP[24,8]群元阶的分布:[1,9,2,6,6,0,0,0],S2=[0,9,3,27,51,36,78,72]
GAP[24,9]群元阶的分布:[1,3,2,4,6,0,8,0],S2=[0,3,3,13,33,12,116,96]
GAP[24,10]群元阶的分布:[1,5,2,2,10,0,4,0],S2=[0,5,3,11,55,12,94,96]
GAP[24,11]群元阶的分布:[1,1,2,6,2,0,12,0],S2=[0,1,3,15,11,12,138,96]
GAP[24,12]群元阶的分布:[1,9,8,6,0,0,0,0],S2=[0,9,12,27,36,36,48,108]
GAP[24,13]群元阶的分布:[1,7,8,0,8,0,0,0],S2=[0,7,12,21,44,0,48,144]
GAP[24,14]群元阶的分布:[1,15,2,0,6,0,0,0],S2=[0,15,3,57,69,0,132,0]
GAP[24,15]群元阶的分布:[1,7,2,0,14,0,0,0],S2=[0,7,3,21,77,0,168,0]
GAP[30,1]群元阶的分布:[1,3,2,4,0,12,8,0],S2=[0,3,3,10,9,102,92,216]
GAP[30,2]群元阶的分布:[1,5,2,4,10,0,8,0],S2=[0,5,3,10,55,30,92,240]
GAP[30,3]群元阶的分布:[1,15,2,4,0,0,8,0],S2=[0,15,3,10,45,90,92,180]
GAP[30,4]群元阶的分布:[1,1,2,4,2,4,8,8],S2=[0,1,3,10,11,34,92,284]
GAP[32,1]群元阶的分布:[1,1,2,4,8,16],S2=[0,1,5,22,92,376]
GAP[32,3]群元阶的分布:[1,3,12,16,0,0],S2=[0,3,33,124,144,192]
GAP[32,4]群元阶的分布:[1,3,12,16,0,0],S2=[0,3,33,124,144,192]
GAP[32,6]群元阶的分布:[1,11,20,0,0,0],S2=[0,11,89,108,96,192]
GAP[32,7]群元阶的分布:[1,11,4,16,0,0],S2=[0,11,49,148,96,192]
GAP[32,9]群元阶的分布:[1,11,12,8,0,0],S2=[0,11,69,128,96,192]
GAP[32,11]群元阶的分布:[1,7,16,8,0,0],S2=[0,7,49,152,96,192]
GAP[32,12]群元阶的分布:[1,3,12,16,0,0],S2=[0,3,33,124,144,192]
GAP[32,14]群元阶的分布:[1,3,20,8,0,0],S2=[0,3,53,104,144,192]
GAP[32,15]群元阶的分布:[1,3,4,24,0,0],S2=[0,3,13,144,144,192]
GAP[32,16]群元阶的分布:[1,3,4,8,16,0],S2=[0,3,13,56,232,192]
GAP[32,17]群元阶的分布:[1,3,4,8,16,0],S2=[0,3,13,56,232,192]
GAP[32,18]群元阶的分布:[1,17,2,4,8,0],S2=[0,17,29,70,188,192]
GAP[32,19]群元阶的分布:[1,9,10,4,8,0],S2=[0,9,37,70,188,192]
GAP[32,20]群元阶的分布:[1,1,18,4,8,0],S2=[0,1,45,70,188,192]
GAP[32,21]群元阶的分布:[1,7,24,0,0,0],S2=[0,7,81,216,192,0]
GAP[32,22]群元阶的分布:[1,15,16,0,0,0],S2=[0,15,145,144,192,0]
GAP[32,23]群元阶的分布:[1,7,24,0,0,0],S2=[0,7,81,216,192,0]
GAP[32,24]群元阶的分布:[1,7,24,0,0,0],S2=[0,7,81,120,288,0]
GAP[32,25]群元阶的分布:[1,11,20,0,0,0],S2=[0,11,89,204,192,0]
GAP[32,26]群元阶的分布:[1,3,28,0,0,0],S2=[0,3,73,132,288,0]
GAP[32,27]群元阶的分布:[1,19,12,0,0,0],S2=[0,19,153,180,144,0]
GAP[32,28]群元阶的分布:[1,15,16,0,0,0],S2=[0,15,97,240,144,0]
GAP[32,34]群元阶的分布:[1,19,12,0,0,0],S2=[0,19,105,324,48,0]
GAP[32,36]群元阶的分布:[1,7,8,16,0,0],S2=[0,7,41,160,288,0]
GAP[32,37]群元阶的分布:[1,7,8,16,0,0],S2=[0,7,41,160,288,0]
GAP[32,39]群元阶的分布:[1,19,4,8,0,0],S2=[0,19,85,152,240,0]
GAP[32,40]群元阶的分布:[1,11,12,8,0,0],S2=[0,11,69,176,240,0]
GAP[32,41]群元阶的分布:[1,3,20,8,0,0],S2=[0,3,53,200,240,0]
GAP[32,43]群元阶的分布:[1,15,8,8,0,0],S2=[0,15,65,176,240,0]
GAP[32,45]群元阶的分布:[1,15,16,0,0,0],S2=[0,15,145,336,0,0]
GAP[32,46]群元阶的分布:[1,23,8,0,0,0],S2=[0,23,209,264,0,0]
GAP[32,47]群元阶的分布:[1,7,24,0,0,0],S2=[0,7,81,408,0,0]
GAP[32,48]群元阶的分布:[1,15,16,0,0,0],S2=[0,15,97,384,0,0]
GAP[32,49]群元阶的分布:[1,19,12,0,0,0],S2=[0,19,129,348,0,0]
GAP[32,51]群元阶的分布:[1,31,0,0,0,0],S2=[0,31,465,0,0,0]
GAP[36,1]群元阶的分布:[1,1,2,18,2,6,0,6,0],S2=[0,1,3,45,11,33,108,105,324]
GAP[36,2]群元阶的分布:[1,1,2,2,2,6,4,6,12],S2=[0,1,3,5,11,33,46,105,426]
GAP[36,4]群元阶的分布:[1,19,2,0,2,6,0,6,0],S2=[0,19,3,27,65,33,54,267,162]
GAP[36,5]群元阶的分布:[1,3,2,0,6,6,0,18,0],S2=[0,3,3,3,33,33,24,315,216]
GAP[36,6]群元阶的分布:[1,1,8,6,8,0,12,0,0],S2=[0,1,12,15,44,24,174,72,288]
GAP[36,8]群元阶的分布:[1,1,8,2,8,0,16,0,0],S2=[0,1,12,5,44,24,184,72,288]
GAP[36,9]群元阶的分布:[1,9,8,18,0,0,0,0,0],S2=[0,9,12,45,108,24,0,0,432]
GAP[36,10]群元阶的分布:[1,15,8,0,12,0,0,0,0],S2=[0,15,12,27,192,24,108,144,108]
GAP[36,11]群元阶的分布:[1,3,26,0,6,0,0,0,0],S2=[0,3,39,3,33,96,168,0,288]
GAP[36,12]群元阶的分布:[1,7,8,0,20,0,0,0,0],S2=[0,7,12,9,128,24,90,216,144]
GAP[36,13]群元阶的分布:[1,19,8,0,8,0,0,0,0],S2=[0,19,12,27,260,24,216,72,0]
GAP[36,14]群元阶的分布:[1,3,8,0,24,0,0,0,0],S2=[0,3,12,3,132,24,96,216,144]
GAP[48,1]群元阶的分布:[1,1,2,2,2,4,4,24,8,0],S2=[0,1,3,5,11,22,46,276,188,576]
GAP[48,2]群元阶的分布:[1,1,2,2,2,4,4,8,8,16],S2=[0,1,3,5,11,22,46,92,188,760]
GAP[48,3]群元阶的分布:[1,3,32,12,0,0,0,0,0,0],S2=[0,3,48,33,0,36,192,48,0,768]
GAP[48,4]群元阶的分布:[1,7,2,8,2,16,4,0,8,0],S2=[0,7,3,29,29,124,100,144,404,288]
GAP[48,6]群元阶的分布:[1,13,2,14,2,4,4,0,8,0],S2=[0,13,3,53,47,94,154,144,332,288]
GAP[48,7]群元阶的分布:[1,25,2,2,2,4,4,0,8,0],S2=[0,25,3,41,83,94,118,144,332,288]
GAP[48,8]群元阶的分布:[1,1,2,26,2,4,4,0,8,0],S2=[0,1,3,65,11,94,190,144,332,288]
GAP[48,9]群元阶的分布:[1,3,2,4,6,24,8,0,0,0],S2=[0,3,3,13,33,144,116,144,384,288]
GAP[48,10]群元阶的分布:[1,3,2,4,6,24,8,0,0,0],S2=[0,3,3,13,33,144,116,144,384,288]
GAP[48,13]群元阶的分布:[1,3,2,28,6,0,8,0,0,0],S2=[0,3,3,73,33,84,260,144,240,288]
GAP[48,14]群元阶的分布:[1,15,2,16,6,0,8,0,0,0],S2=[0,15,3,97,69,48,296,144,168,288]
GAP[48,15]群元阶的分布:[1,17,2,2,10,12,4,0,0,0],S2=[0,17,3,29,91,114,130,144,312,288]
GAP[48,20]群元阶的分布:[1,3,2,12,6,0,24,0,0,0],S2=[0,3,3,33,33,36,300,48,288,384]
GAP[48,21]群元阶的分布:[1,7,2,8,14,0,16,0,0,0],S2=[0,7,3,41,77,24,352,48,192,384]
GAP[48,22]群元阶的分布:[1,3,2,12,6,0,24,0,0,0],S2=[0,3,3,33,33,36,300,48,288,384]
GAP[48,23]群元阶的分布:[1,3,2,4,6,8,8,0,16,0],S2=[0,3,3,13,33,56,116,48,472,384]
GAP[48,24]群元阶的分布:[1,3,2,4,6,8,8,0,16,0],S2=[0,3,3,13,33,56,116,48,472,384]
GAP[48,25]群元阶的分布:[1,9,2,2,18,4,4,0,8,0],S2=[0,9,3,17,99,46,142,48,380,384]
GAP[48,26]群元阶的分布:[1,5,2,6,10,4,12,0,8,0],S2=[0,5,3,21,55,46,186,48,380,384]
GAP[48,27]群元阶的分布:[1,1,2,10,2,4,20,0,8,0],S2=[0,1,3,25,11,46,230,48,380,384]
GAP[48,29]群元阶的分布:[1,13,8,6,8,12,0,0,0,0],S2=[0,13,12,33,116,114,72,144,192,432]
GAP[48,30]群元阶的分布:[1,7,8,24,8,0,0,0,0,0],S2=[0,7,12,81,44,72,192,144,144,432]
GAP[48,31]群元阶的分布:[1,7,8,8,8,0,16,0,0,0],S2=[0,7,12,41,44,72,232,0,144,576]
GAP[48,32]群元阶的分布:[1,3,8,12,24,0,0,0,0,0],S2=[0,3,12,33,132,84,96,0,192,576]
GAP[48,33]群元阶的分布:[1,7,8,8,8,0,16,0,0,0],S2=[0,7,12,29,44,84,184,0,192,576]
GAP[48,34]群元阶的分布:[1,3,2,28,6,0,8,0,0,0],S2=[0,3,3,73,33,228,260,0,528,0]
GAP[48,35]群元阶的分布:[1,15,2,16,6,0,8,0,0,0],S2=[0,15,3,97,69,192,296,0,456,0]
GAP[48,36]群元阶的分布:[1,27,2,4,6,0,8,0,0,0],S2=[0,27,3,121,105,156,332,0,384,0]
GAP[48,38]群元阶的分布:[1,23,2,8,10,0,4,0,0,0],S2=[0,23,3,125,109,156,328,0,384,0]
GAP[48,40]群元阶的分布:[1,7,2,24,2,0,12,0,0,0],S2=[0,7,3,69,29,228,264,0,528,0]
GAP[48,42]群元阶的分布:[1,7,2,24,14,0,0,0,0,0],S2=[0,7,3,81,77,216,312,0,432,0]
GAP[48,43]群元阶的分布:[1,19,2,12,14,0,0,0,0,0],S2=[0,19,3,105,113,180,348,0,360,0]
GAP[48,44]群元阶的分布:[1,7,2,8,14,0,16,0,0,0],S2=[0,7,3,41,77,72,352,0,576,0]
GAP[48,45]群元阶的分布:[1,11,2,4,22,0,8,0,0,0],S2=[0,11,3,49,121,60,404,0,480,0]
GAP[48,46]群元阶的分布:[1,3,2,12,6,0,24,0,0,0],S2=[0,3,3,33,33,84,300,0,672,0]
GAP[48,47]群元阶的分布:[1,7,2,8,14,0,16,0,0,0],S2=[0,7,3,29,77,84,256,0,672,0]
GAP[48,48]群元阶的分布:[1,19,8,12,8,0,0,0,0,0],S2=[0,19,12,105,116,180,120,0,360,216]
GAP[48,49]群元阶的分布:[1,15,8,0,24,0,0,0,0,0],S2=[0,15,12,105,132,0,144,0,432,288]
GAP[48,50]群元阶的分布:[1,15,32,0,0,0,0,0,0,0],S2=[0,15,48,105,0,0,960,0,0,0]
GAP[48,51]群元阶的分布:[1,31,2,0,14,0,0,0,0,0],S2=[0,31,3,273,149,0,672,0,0,0]
GAP[48,52]群元阶的分布:[1,15,2,0,30,0,0,0,0,0],S2=[0,15,3,105,165,0,840,0,0,0]
GAP[60,1]群元阶的分布:[1,1,2,6,4,2,4,0,8,24,8,0],S2=[0,1,3,15,10,11,34,36,92,420,284,864]
GAP[60,2]群元阶的分布:[1,1,2,10,4,2,4,20,8,0,8,0],S2=[0,1,3,25,10,11,34,230,92,120,284,960]
GAP[60,4]群元阶的分布:[1,1,2,2,4,2,4,4,8,8,8,16],S2=[0,1,3,5,10,11,34,46,92,140,284,1144]
GAP[60,5]群元阶的分布:[1,15,20,0,24,0,0,0,0,0,0,0],S2=[0,15,30,15,60,90,180,240,0,0,0,1140]
GAP[60,6]群元阶的分布:[1,5,2,10,4,10,0,20,8,0,0,0],S2=[0,5,3,25,10,55,30,230,92,120,240,960]
GAP[60,8]群元阶的分布:[1,23,2,0,4,10,12,0,8,0,0,0],S2=[0,23,3,45,10,109,222,90,92,180,636,360]
GAP[60,9]群元阶的分布:[1,3,8,0,4,0,12,0,32,0,0,0],S2=[0,3,12,3,10,0,102,48,368,72,0,1152]
GAP[60,10]群元阶的分布:[1,11,2,0,4,22,4,0,8,0,8,0],S2=[0,11,3,15,10,121,94,120,92,60,764,480]
GAP[60,11]群元阶的分布:[1,7,2,0,4,2,28,0,8,0,8,0],S2=[0,7,3,9,10,29,238,18,92,216,716,432]
GAP[60,12]群元阶的分布:[1,31,2,0,4,2,4,0,8,0,8,0],S2=[0,31,3,45,10,101,214,90,92,180,644,360]
GAP[60,13]群元阶的分布:[1,3,2,0,4,6,12,0,8,0,24,0],S2=[0,3,3,3,10,33,102,24,92,72,852,576]
1->1 2 3 4 5 6 7 8
2->2 3 4 5 6 7 8 1
3->8 7 6 5 4 3 2 1
4->3 4 5 6 7 8 1 2
5->1 8 7 6 5 4 3 2
6->4 5 6 7 8 1 2 3
7->2 1 8 7 6 5 4 3
8->5 6 7 8 1 2 3 4
9->3 2 1 8 7 6 5 4
10->6 7 8 1 2 3 4 5
11->4 3 2 1 8 7 6 5
12->7 8 1 2 3 4 5 6
13->5 4 3 2 1 8 7 6
14->8 1 2 3 4 5 6 7
15->6 5 4 3 2 1 8 7
16->7 6 5 4 3 2 1 8
1->[(1,0) (0,1) ][(0,0) (0,0) ]
2->[(0,0.70710678118655) (0.70710678118655,0) ][(0,0.70710678118655) (-0.70710678118655,0) ]
3->[(0,-1) (1,0) ][(0,0) (0,0) ]
4->[(0.70710678118655,0) (0,-0.70710678118655) ][(0.70710678118655,0) (0,0.70710678118655) ]
5->[(-0.70710678118655,0) (0,0.70710678118655) ][(0.70710678118655,0) (0,0.70710678118655) ]
6->[(-1,0) (0,-1) ][(0,0) (0,0) ]
7->[(0,0.70710678118655) (0.70710678118655,0) ][(0,-0.70710678118655) (0.70710678118655,0) ]
8->[(0,-0.70710678118655) (-0.70710678118655,0) ][(0,-0.70710678118655) (0.70710678118655,0) ]
9->[(0,1) (-1,0) ][(0,0) (0,0) ]
10->[(-0.70710678118655,0) (0,0.70710678118655) ][(-0.70710678118655,0) (0,-0.70710678118655) ]
11->[(0.70710678118655,0) (0,-0.70710678118655) ][(-0.70710678118655,0) (0,-0.70710678118655) ]
12->[(0,-0.70710678118655) (-0.70710678118655,0) ][(0,0.70710678118655) (-0.70710678118655,0) ]
13->[(0,2.7755575615629e-016) (-2.2204460492503e-016,0) ][(0,1) (1,0) ]
14->[(3.3306690738755e-016,0) (0,2.2204460492503e-016) ][(1,0) (0,-1) ]
15->[(0,-3.3306690738755e-016) (2.2204460492503e-016,0) ][(0,-1) (-1,0) ]
16->[(-3.3306690738755e-016,0) (0,-2.2204460492503e-016) ][(-1,0) (0,1) ]

local g_C8Mul={
    {0, 1, 2, 3, 4, 5, 6, 7},
    {1, 0, 3, 2, 5, 4, 7, 6},
    {2, 3, 1, 0, 6, 7, 5, 4},
    {3, 2, 0, 1, 7, 6, 4, 5},
    {4, 5, 6, 7, 2, 3, 1, 0},
    {5, 4, 7, 6, 3, 2, 0, 1},
    {6, 7, 5, 4, 1, 0, 3, 2},
    {7, 6, 4, 5, 0, 1, 2, 3}
}

local g_C2C4Mul={
    {0, 1, 2, 3, 4, 5, 6, 7},
    {1, 0, 3, 2, 5, 4, 7, 6},
    {2, 3, 0, 1, 6, 7, 4, 5},
    {3, 2, 1, 0, 7, 6, 5, 4},
    {4, 5, 6, 7, 1, 0, 3, 2},
    {5, 4, 7, 6, 0, 1, 2, 3},
    {6, 7, 4, 5, 3, 2, 1, 0},
    {7, 6, 5, 4, 2, 3, 0, 1}
}

local g_D4Mul={
    {0, 1, 2, 3, 4, 5, 6, 7},
    {1, 0, 3, 2, 5, 4, 7, 6},
    {2, 3, 0, 1, 7, 6, 5, 4},
    {3, 2, 1, 0, 6, 7, 4, 5},
    {4, 5, 6, 7, 0, 1, 2, 3},
    {5, 4, 7, 6, 1, 0, 3, 2},
    {6, 7, 4, 5, 3, 2, 1, 0},
    {7, 6, 5, 4, 2, 3, 0, 1}
}

local g_Q8Mul={
    {0, 1, 2, 3, 4, 5, 6, 7},
    {1, 0, 3, 2, 5, 4, 7, 6},
    {2, 3, 1, 0, 7, 6, 4, 5},
    {3, 2, 0, 1, 6, 7, 5, 4},
    {4, 5, 6, 7, 1, 0, 3, 2},
    {5, 4, 7, 6, 0, 1, 2, 3},
    {6, 7, 5, 4, 2, 3, 1, 0},
    {7, 6, 4, 5, 3, 2, 0, 1}
}

local g_C2C2C2Mul={
    {0, 1, 2, 3, 4, 5, 6, 7},
    {1, 0, 3, 2, 5, 4, 7, 6},
    {2, 3, 0, 1, 6, 7, 4, 5},
    {3, 2, 1, 0, 7, 6, 5, 4},
    {4, 5, 6, 7, 0, 1, 2, 3},
    {5, 4, 7, 6, 1, 0, 3, 2},
    {6, 7, 4, 5, 2, 3, 0, 1},
    {7, 6, 5, 4, 3, 2, 1, 0}
}

local g_Q12=
{
    {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, 4, 5, 6, 1, 2, 3 },
    { 8, 9, 7, 11, 12, 10, 6, 4, 5, 3, 1, 2 },
    { 9, 7, 8, 12, 10, 11, 5, 6, 4, 2, 3, 1 },
    { 10, 11, 12, 7, 8, 9, 1, 2, 3, 4, 5, 6 },
    { 11, 12, 10, 8, 9, 7, 3, 1, 2, 6, 4, 5 },
    { 12, 10, 11, 9, 7, 8, 2, 3, 1, 5, 6, 4 }
};

function get_len(tb)
    local len=0
    for k,v in pairs(tb) do
        len=len+1
    end
    return len
end

function PrintArr2(vv) 
 local m=get_len(vv)
 for i=1,m,1 do
  io.write("[")
  local mi=get_len(vv[i])
  for j=1,mi,1 do
   io.write("(",vv[i][j][1],",",vv[i][j][2],") ")
  end
  io.write("]")
 end 
 io.write("\n")
end

function PrintArr(v) 
 local m=get_len(v)
  for i=1,m,1 do
   io.write(v[i]," ")
  end
  io.write("\n")
end

function doArr2(vv,delt)
 local m=get_len(vv)
 for i=1,m,1 do
  for j=1,m,1 do
   vv[i][j]=vv[i][j]+delt
  end
 end
end

doArr2(g_C8Mul,1)
doArr2(g_C2C4Mul,1)
doArr2(g_D4Mul,1)
doArr2(g_Q8Mul,1)
doArr2(g_C2C2C2Mul,1)
--PrintArr2(g_C8Mul)

function get_key(v1,tb)
    for k,v in pairs(tb) do
        if v==v1 then
           return k
        end
    end
    return -1
end

function is_equal(a,b)
    local na=get_len(a)
    local nb=get_len(b)
    if na~=nb then
       return false
    end
    for i=1,na,1 do
        if a[i]~=b[i] then
           return false
        end
    end        
    return true
end

function get_key2(v1,tb)
    for k,v in pairs(tb) do
        if is_equal(v,v1) then
           return k
        end
    end
    return -1
end

function mul(a,b)
    local ret={}
    local na=get_len(a)
    local nb=get_len(b)
    if(na~=nb)then
        return nil
    end
    for i=1,na,1 do
      ret[i]=a[b[i]]
    end
    return ret
end

function FG(...)
    local args={...}
    local S={}
    local I={}
    local n=get_len(args[1])
    for i=1,n,1 do
        I[i]=i
    end
    table.insert(S,I)
     for i,v in pairs(args) do
        table.insert(S,v)
    end
    local cnt=0
    local cnt1=get_len(S)
    while(cnt1>cnt)do
        cnt=get_len(S)
        for ki,vi in pairs(S) do
            for kj,vj in pairs(S) do
                local ij=mul(vi,vj)
                local IJ=get_key2(ij,S)
                if(IJ==-1)then
                    table.insert(S,ij)
                end
            end
        end
        cnt1=get_len(S)
    end
    return S
end

function TableByPermuteSet(G)
    local ret={}
    for ki,vi in pairs(G) do
        local v={}
        for kj,vj in pairs(G) do
            local ij=mul(vi,vj)
            local IJ=get_key2(ij,G)
            table.insert(v,IJ)
        end
        table.insert(ret,v)
    end
    return ret
end

function DirectProduct(A,B)
    local C={}
    local nA=get_len(A)
    local nB=get_len(B)    
    local n=nA*nB
    for a=0,n-1,1 do
        local iRow={}
        for b=0,n-1,1 do
            local aj=a%nB
            local ai=(a-aj)/nB
            local bj=b%nB
            local bi=(b-bj)/nB
            local i=A[ai+1][bi+1]-1
            local j=B[aj+1][bj+1]-1
            local c=nB*i+j+1
            table.insert(iRow,c)
        end
        table.insert(C,iRow)
    end
    return C
end

-- 半直积群G:C2
function GC2(A)
    local C={}
    local B={{1,2},{2,1}}
    local nA=get_len(A)
    local nB=get_len(B)    
    local n=nA*nB    
    for a=0,n-1,1 do
        local iRow={}
        for b=0,n-1,1 do
            local aj=a%nB
            local ai=(a-aj)/nB
            local bj=b%nB
            local bi=(b-bj)/nB
            local bii=bi
            -- aj不是C_2={0,1}的单位元0
            if(aj==1)then
                for ii=0,nA-1,1 do
                    if(A[bi+1][ii+1]==1)then
                        bii=ii
                        break
                    end
                end
            end
            local i=A[ai+1][bii+1]-1
            local j=B[aj+1][bj+1]-1
            local c=nB*i+j+1
            table.insert(iRow,c)
        end
        table.insert(C,iRow)
    end
    return C
end

function CyclicGroup(n)
  local ret={}
  for i=1,n,1 do
      local I={}
      for j=1,n,1 do
       local ij=(i+j-2)%n+1
       table.insert(I,ij)
      end
      table.insert(ret,I)
  end
  return ret
end

function AbelianGroup(tb)
  local n=get_len(tb)
  if n<1 then
     return nil
  end
  local ret=CyclicGroup(tb[1]) 
  for i=2,n,1 do
      ret=DirectProduct(ret,CyclicGroup(tb[i]))
  end
  return ret
end

--二面体群D_n1
--二面体群(Dihedral group):D_(2n)=<a,b|a^n=b^2=1,b^(-1)ab=a^(-1)>
function Dn(n)
    local ret={}
    local n1=n/2
    local a={}
    for i=2,n1,1 do
       table.insert(a,i)
    end
    table.insert(a,1)  
    local b={}
    --if n1%2==0 then 
        for i=n1,1,-1 do
           table.insert(b,i)
        end    
--[[
    else
        table.insert(b,1)
        for i=n1,2,-1 do
           table.insert(b,i)
        end        
    end
    ]]
    ret=FG(a,b)
    return ret
end

function DihedralGroup(n)
    local ret=Dn(n)
    return TableByPermuteSet(ret)
end

--9阶初等Abel群对应的18阶广义二面体群 (1,3,2)(4,6,5)(7,9,8), (1,7,4)(2,8,5)(3,9,6), (2,3)(4,7)(5,9)(6,8)
function GeneralizedDihedralGroup(tb)
    return GC2(AbelianGroup(tb))
    --[[
    local ret={}
    if get_len(tb)==2 and tb[1]==3 and tb[2]==3 then
        ret=FG({3,1,2,6,4,5,9,7,8},{7,8,9,1,2,3,4,5,6},{1,3,2,7,9,8,4,6,5})
    end
    if get_len(tb)==2 and tb[1]==4 and tb[2]==4 then
        ret=FG({1,4,3,6,5,8,7,2},{3,8,5,2,7,4,1,6},{7,6,5,4,3,2,1,8})
    end    
    return TableByPermuteSet(ret)
    ]]
end

function F20Group()
    local ret=FG({1,3,2,5,4},{2,3,4,1,5})
    return TableByPermuteSet(ret)
end

function VGroup(m,n)
    local ret={} 
    if m==4 and n==2 then
        ret=FG({5,6,4,8,1,2,10,9,3,7},{6,2,3,4,5,1,7,8,9,10})--IdGroup(Group((1,5)(2,6)(3,4,8,9)(7,10),(1,6)));
    end        
    if m==4 and n==3 then
        ret=FG({1,4,3,2,5,7,6,8,10,9,11,12},{2,1,4,3,5,7,8,6,9,10,12,11})
    end    
    if m==4 and n==4 then
        ret=FG({17,23,2,19,27,28,5,25,11,31,8,9,10,29,7,32,14,1,16,13,12,24,20,21,22,18,4,26,6,3,30,15},{22,6,32,20,10,9,24,4,16,1,29,28,27,8,30,2,13,31,11,14,15,5,19,18,17,21,25,3,23,26,7,12})
    end
    if m==4 and n==6 then
        ret=FG({2,1,19,8,9,24,12,4,5,17,32,7,45,21,37,38,10,25,3,41,14,30,31,6,18,48,35,34,46,22,23,11,47,28,27,42,15,16,44,43,20,36,40,39,13,29,33,26},{28,35,30,40,41,3,37,44,45,7,17,42,4,47,11,12,13,24,46,8,48,18,19,20,31,1,14,15,25,26,27,38,2,21,22,32,33,34,5,6,29,39,9,10,36,43,16,23})
    end    
    if m==6 and n==4 then
        ret=FG({2,1,18,21,9,24,11,14,5,17,7,32,44,8,46,38,10,3,25,40,4,42,31,6,19,35,48,33,37,36,23,12,28,47,26,30,29,16,45,20,43,22,41,13,39,15,34,27},{28,35,17,47,41,3,24,48,45,7,42,31,1,40,25,12,13,46,38,2,44,32,19,20,30,14,5,6,11,39,27,37,21,9,10,18,43,34,4,29,16,26,8,36,23,33,15,22})
    end        
    return TableByPermuteSet(ret)
end

function HGroup(m,n)
    local ret={} 
    if m==4 and n==4 then
        ret=FG({2,3,4,1,5,6,7,8},{3,2,1,4,6,7,8,5})
    end    
    if m==4 and n==8 then
        ret=FG({3,7,15,11,12,13,21,17,18,19,1,26,4,23,24,25,2,30,8,27,28,29,5,6,14,31,9,10,20,32,16,22},{2,5,17,21,9,10,23,26,1,16,7,27,28,30,8,22,12,11,31,15,14,6,18,19,32,20,3,25,24,4,29,13})
    end
    if m==8 and n==4 then
        ret=FG({2,5,17,8,9,10,23,14,6,16,7,27,28,20,21,22,12,24,31,15,26,1,18,19,32,30,13,25,11,4,29,3},{3,7,4,11,12,13,8,17,18,19,1,14,15,23,24,25,2,20,21,27,28,29,5,6,26,31,9,10,30,32,16,22})
    end    
    if m==4 and n==12 then
        ret=FG({2,4,19,8,9,24,25,1,14,30,32,7,45,21,37,38,10,12,11,47,5,17,42,15,18,48,35,34,46,22,23,3,41,40,39,31,6,29,44,43,20,36,28,27,26,16,33,13},{3,7,5,11,12,13,9,18,19,20,14,1,16,25,26,27,28,21,2,23,32,33,34,35,4,29,6,31,39,40,41,8,36,10,38,43,44,45,15,42,17,47,22,46,24,48,30,37},{6,10,13,15,16,17,20,22,23,24,26,27,28,29,30,31,1,33,34,35,36,37,38,2,39,40,41,3,42,4,5,43,44,45,7,46,8,9,47,11,12,14,48,18,19,21,25,32})
    end    
    return TableByPermuteSet(ret)
end

function M32Group()
    local ret=FG({2,4,19,8,9,10,24,5,14,15,28,29,7,20,21,22,25,31,11,6,16,26,32,17,18,30,3,12,23,1,27,13},{3,7,1,11,12,13,2,17,18,19,4,5,6,23,24,25,8,9,10,27,28,29,14,15,16,31,20,21,22,32,26,30})
    return TableByPermuteSet(ret)
end

--对称群S_n,rank(S_n)=2
function Sn(n)
    local ret={}
    local a={}
    table.insert(a,2) 
    table.insert(a,1) 
    for i=3,n,1 do
       table.insert(a,i)
    end
    local b={}
    table.insert(b,1)
    for i=3,n,1 do
       table.insert(b,i)
    end
    table.insert(b,2)    
    ret=FG(a,b)
    return ret    
end

function SymmetricGroup(n)
    local ret=Sn(n)
    return TableByPermuteSet(ret)    
end

--置换的逆序数
function Tau(a)
    local ret=0
    local n=get_len(a)
    for i=1,n,1 do
        for j=i+1,n,1 do
           if a[i]>a[j] then
                ret=ret+1
           end
        end
    end
    return ret
end

--交错群A_n,n>=3是由3循环生成的,并且事实上A_n=<(123),(124),…,(12n)>
function An(n)
    local ret={}
    local SnSet=Sn(n)    
    for k,v in pairs(SnSet) do
        if Tau(v)%2==0 then
            table.insert(ret,v)
        end
    end
    return ret
end

function AlternatingGroup(n)
    local ret=An(n)
    return TableByPermuteSet(ret)
end

--u×v=(u_yv_z-u_zv_y,u_zv_x-u_xv_z,u_xv_y-u_yv_x)
--反交换律:v×u=(v_yu_z-v_zu_y,v_zu_x-v_xu_z,v_xu_y-v_yu_x)=-(u×v)
--特殊情形1:两个非零向量a和b平行,当且仅当a×b=0(垂直时点积为0)(u×u=0
--直角坐标系 (i, j, k)与 (a,b,a×b)、(i, j, -k)与 (a,b,-a×b)同时满足左手定则或同时满足右手定则
--三维叉积的引入:向量u×v(取u,v确定平面上的垂线上的某一向量)垂直于向量u和v
function Vec3CrossP(u,v)
    return {(u[2]*v[3]-u[3]*v[2]),u[3]*v[1]-u[1]*v[3],u[1]*v[2]-u[2]*v[1]}
end

function Vec3DotP(u,v)
    return (u[1]*v[1]+u[2]*v[2]+u[3]*v[3])
end

--三矢量的混合积(a×b)·c=(a,b,c)=(a×b)c=|a×b||c|cos<a×b,c>,
--|(a×b)·c|的几何意义表示以a,b,c为棱的平行六面体的体积(标量三重积,有符号的)。
function Vec3TriplexP(a,b,c)
    return Vec3DotP(Vec3CrossP(a,b),c)
end

--[[
(a_1+a_2i+a_3j+a_4k)*(b_1+b_2i+b_3j+b_4k)=
(a_1b_1-a_2b_2-a_3b_3-a_4b_4)+
(a_1b_2+a_2b_1+a_3b_4-a_4b_3)i+
(a_1b_3+a_3b_1+a_4b_2-a_2b_4)j+
(a_1b_4+a_4b_1+a_2b_3-a_3b_2)k 
]]
function qmul(q1,q2)
   local ret={}
   ret[1]=q1[1]*q2[1]-Vec3DotP({q1[2],q1[3],q1[4]},{q2[2],q2[3],q2[4]})
   local temp=Vec3CrossP({q1[2],q1[3],q1[4]},{q2[2],q2[3],q2[4]})
   ret[2]=q1[1]*q2[2]+q1[2]*q2[1]+temp[1]
   ret[3]=q1[1]*q2[3]+q1[3]*q2[1]+temp[2]
   ret[4]=q1[1]*q2[4]+q1[4]*q2[1]+temp[3]
   return ret
end

function Q8()
    local G={{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,-1,0},{0,0,0,-1}}
    local ret={}
    for ki,vi in pairs(G) do
        local v={}
        for kj,vj in pairs(G) do
            local ij=qmul(vi,vj)
            local IJ=get_key2(ij,G)
            table.insert(v,IJ)
        end
        table.insert(ret,v)
    end
    return ret    
end

function ZeroMat(m,n)
    local ret={}
    for i=1,m,1 do
        local I={}
        for j=1,n,1 do
           table.insert(I,0)
        end
        table.insert(ret,I)
    end
    return ret
end

function OneMat(n)
    local ret={}
    for i=1,n,1 do
        local I={}
        for j=1,n,1 do
           if i==j then
            table.insert(I,1)
           else
            table.insert(I,0)
           end
        end
        table.insert(ret,I)
    end
    return ret
end

function bcmul(ar,ai,br,bi)
    local m=get_len(ar)
    local n=get_len(br)    
    local k=get_len(br[1])    
    local cr=ZeroMat(m,k)
    local ci=ZeroMat(m,k)        
    for i=1,m,1 do
        for j=1,k,1 do
            cr[i][j]=0
            ci[i][j]=0
            for l=1,n,1 do
              local p=ar[i][l]*br[l][j]
              local q=ai[i][l]*bi[l][j]
              local s=(ar[i][l]+ai[i][l])*(br[l][j]+bi[l][j])
              cr[i][j]=cr[i][j]+p-q
              ci[i][j]=ci[i][j]+s-p-q
             end
         end
    end
  return cr,ci
end

--复矩阵相乘
function CMatMul(a,b)
    local cr,ci=bcmul(a[1],a[2],b[1],b[2])
    return {cr,ci}
end

function is_equalM(a,b)
    local na=get_len(a)
    local nb=get_len(b)
    if na~=nb then
       return false
    end
    for i=1,na,1 do
        local nai=get_len(a[i])
        local nbi=get_len(b[i])    
        if nai~=nbi then
            return false
        end    
        for j=1,nai,1 do    
            if math.abs(a[i][j]-b[i][j])>0.01 then
                return false
            end
        end
    end        
    return true
end

function is_equalCM(a,b)
    local ret=(is_equalM(a[1],b[1]) and is_equalM(a[2],b[2]))
    return ret
end

function get_keyM(v1,tb)
    for k,v in pairs(tb) do
        if is_equalM(v,v1) then
           return k
        end
    end
    return -1
end

function get_keyCM(v1,tb)
    for k,v in pairs(tb) do
        if is_equalCM(v,v1) then
           return k
        end
    end
    return -1
end

function CMatFG(...)
    local args={...}
    local S={}
     for i,v in pairs(args) do
        table.insert(S,v)
    end
    local cnt=0
    local cnt1=get_len(S)
    while(cnt1>cnt)do
        cnt=get_len(S)
        for ki,vi in pairs(S) do
            for kj,vj in pairs(S) do
                local ij=CMatMul(vi,vj)
                local IJ=get_keyCM(ij,S)
                if(IJ==-1)then
                    table.insert(S,ij)
                end
            end
        end
        cnt1=get_len(S)
    end
    return S
end

function TableByCMSet(G)
    local ret={}
    for ki,vi in pairs(G) do
        local v={}
        for kj,vj in pairs(G) do
            local ij=CMatMul(vi,vj)
            local IJ=get_keyCM(ij,G)
            table.insert(v,IJ)
        end
        table.insert(ret,v)
    end
    return ret
end

--四元数群或双循环群(Dicyclic group):Q_(4n)=<a,b|a^(2n)=1,a^n=b^2,b^(-1)ab=a^(-1)>,rank(Q_(4n))=2
--抽象的哈密尔顿群的定义:任何非阿贝尔群如其所有子群都是正规子群就称为哈密尔顿群。四元数群Q_8是阶数最小(8阶)的哈密尔顿群。
function Q4n(n)
    local E2n={math.cos(math.pi/n),math.sin(math.pi/n)}--2n次本原单位根
    local a1={{{E2n[1],0},{0,E2n[1]}},{{E2n[2],0},{0,-E2n[2]}}}--2n次本原单位根对应的复矩阵
    local a2={{{0,-1},{1,0}},{{0,0},{0,0}}}
    local CI2={{{1,0},{0,1}},{{0,0},{0,0}}}
    local ret=CMatFG(CI2,a1,a2)
    return ret
end

function QuaternionGroup(n)
    local ret=Q4n(n/4)
    return TableByCMSet(ret)
end

function QD8n(n)
    local En2={math.cos(4*math.pi/n),math.sin(4*math.pi/n)}--n/2次本原单位根
    local a1={{{0,En2[1]},{En2[1],0}},{{0,En2[2]},{-En2[2],0}}}--n/2次本原单位根对应的复矩阵
    local a2={{{0,-1},{1,0}},{{0,0},{0,0}}}
    local CI2={{{1,0},{0,1}},{{0,0},{0,0}}}
    local ret=CMatFG(CI2,a1,a2)
    return ret
end

--[[
n=8m阶拟二面体群
GAP[8,2]群元阶的分布:[1,3,4,0]
GAP[16,8]群元阶的分布:[1,5,6,4,0]
GAP[24,5]群元阶的分布:[1,7,2,8,2,0,4,0]
GAP[32,19]群元阶的分布:[1,9,10,4,8,0]
GAP[40,5]群元阶的分布:[1,11,12,4,0,4,8,0]
GAP[48,6]群元阶的分布:[1,13,2,14,2,4,4,0,8,0]
]]
function QDGroup(n)
    local ret=QD8n(n)
    return TableByCMSet(ret)
end

--rank(QD_16)=2
function QD16Group()
    --[[
    local ret=FG(
    {5,6,8,7,2,1,3,4},
    {3,4,2,1,7,8,6,5},
    {8,7,5,6,2,1,4,3},
    {2,1,4,3,6,5,8,7},
    {8,7,6,5,3,4,1,2},
    {4,3,2,1,6,5,7,8},
    {6,5,7,8,1,2,4,3},
    {4,3,1,2,8,7,5,6},
    {7,8,6,5,1,2,3,4},
    {7,8,5,6,4,3,2,1},    
    {3,4,1,2,5,6,8,7},
    {5,6,7,8,4,3,1,2},
    {1,2,4,3,8,7,6,5},    
    {6,5,8,7,3,4,2,1},
    {2,1,3,4,7,8,5,6},    
    )
    ]]
    return QDGroup(16)
    --local ret=FG({8,7,6,5,3,4,1,2},{1,2,4,3,8,7,6,5})
    --return TableByPermuteSet(ret)
end

function M16()
    local a1={{{0,1},{0,0}},{{0,0},{1,0}}}
    local a2={{{1,0},{0,-1}},{{0,0},{0,0}}}
    local CI2={{{1,0},{0,1}},{{0,0},{0,0}}}
    local ret=CMatFG(CI2,a1,a2)
    return ret
end

function M16Group()
    local ret=M16()
    return TableByCMSet(ret)
end

function P16()
    local a1={{{0,1},{1,0}},{{0,0},{0,0}}}
    local a2={{{0,0},{0,0}},{{0,-1},{1,0}}}
    local a3={{{1,0},{0,-1}},{{0,0},{0,0}}}    
    local CI2={{{1,0},{0,1}},{{0,0},{0,0}}}
    local ret=CMatFG(CI2,a1,a2,a3)
    return ret
end

function P16Group()
    local ret=P16()
    return TableByCMSet(ret)
end

function SL2F3Group()
    return TableByPermuteSet(FG({2,3,1,6,4,5,7,8},{1,5,8,4,7,3,2,6}))
end

function UGroup(m,n)
    local ret={}
    if m==3 and n==4 then
        ret=FG({1,2,3,4,5,6,7,8,10,11,9},{2,3,4,5,6,7,8,1,9,11,10})
    end    
    if m==3 and n==8 then
        ret=FG({2,3,7,8,9,24,4,11,12,28,18,19,35,21,37,38,10,5,14,30,25,40,41,13,32,44,45,20,46,22,23,1,31,42,15,47,26,27,48,33,34,36,17,16,29,39,43,6},{6,10,13,15,16,17,20,22,23,24,26,27,28,29,30,31,1,33,34,35,36,37,38,2,39,40,41,3,42,4,5,43,44,45,7,46,8,9,47,11,12,14,48,18,19,21,25,32})
    end
    return TableByPermuteSet(ret)
end

function X48Group()
    return TableByPermuteSet(FG({7,14,18,20,35,21,27,30,42,3,2,33,43,34,19,37,46,6,41,47,11,29,13,28,9,22,10,32,45,48,36,17,31,1,40,26,39,12,8,24,38,44,16,5,15,25,23,4},{17,24,30,31,1,5,37,38,2,9,41,42,3,13,4,15,6,45,46,7,20,8,22,10,47,11,26,12,28,14,16,48,18,33,19,35,21,23,25,39,27,29,32,43,34,36,40,44}))
end

function QGroup(m,n)
    local ret={}
    if m==4 and n==4 then
        ret=FG({2,5,17,21,9,10,23,26,6,16,7,27,28,30,8,22,12,24,31,4,14,1,18,19,32,20,13,25,11,15,29,3},{3,7,4,11,12,13,8,17,18,19,6,14,15,23,24,25,10,20,21,27,28,29,16,1,26,31,22,2,30,32,5,9})
    end        
    if m==4 and n==6 then
        ret=FG({2,4,19,8,9,24,25,5,14,30,32,7,45,21,37,38,10,3,11,47,1,31,42,15,18,48,35,34,46,22,23,12,28,40,39,17,16,29,44,43,20,36,41,13,26,6,33,27},{35,40,38,44,45,20,42,41,47,26,46,24,23,48,33,34,7,17,30,29,28,27,39,11,37,36,10,9,43,18,19,31,6,15,14,13,12,25,22,21,2,32,16,1,4,3,8,5})
    end    
    return TableByPermuteSet(ret)
end

local g_Gn={
    {4,2},
    {6,2},    
    {8,5},    
    {10,2},    
    {12,5},
    {14,2},    
    {16,14},    
    {18,5},    
    {20,5},    
    {24,15},
    {30,4},    
    {32,51},        
    {36,14},
    {48,52},
    {60,13},    
}

local g_G={
    {4,1,CyclicGroup(4)},    
    {4,2,AbelianGroup({2,2})},        
    {6,1,SymmetricGroup(3)},
    {6,2,CyclicGroup(6)},    
    {8,1,CyclicGroup(8)},
    {8,2,AbelianGroup({2,4})},
    {8,3,DihedralGroup(8)},
    {8,4,QuaternionGroup(8)},
    {8,5,AbelianGroup({2,2,2})},
    {10,1,DihedralGroup(10)},    
    {10,2,CyclicGroup(10)},    
    {12,1,QuaternionGroup(12)},    
    {12,2,CyclicGroup(12)},
    {12,3,AlternatingGroup(4)},        
    {12,4,DihedralGroup(12)},    
    {12,5,AbelianGroup({2,2,3})},--DirectProduct(CyclicGroup(6),CyclicGroup(2))
    {14,1,DihedralGroup(14)},    
    {14,2,CyclicGroup(14)},
    {16,1,CyclicGroup(16)},
    {16,2,AbelianGroup({4,4})},    
    {16,3,VGroup(4,2)},
    {16,4,HGroup(4,4)},    
    {16,5,AbelianGroup({2,8})},    
    {16,6,M16Group()},        
    {16,7,DihedralGroup(16)},    
    {16,8,QDGroup(16)},    
    {16,9,QuaternionGroup(16)},    
    {16,10,AbelianGroup({2,2,4})},
    {16,11,DirectProduct(DihedralGroup(8),CyclicGroup(2))},    
    {16,12,DirectProduct(QuaternionGroup(8),CyclicGroup(2))},
    {16,13,P16Group()},    
    {16,14,AbelianGroup({2,2,2,2})},
    {18,1,DihedralGroup(18)},    
    {18,2,CyclicGroup(18)},
    {18,3,DirectProduct(SymmetricGroup(3),CyclicGroup(3))},    
    {18,4,GeneralizedDihedralGroup({3,3})},
    {18,5,AbelianGroup({2,3,3})},
    {20,1,QuaternionGroup(20)},    
    {20,2,CyclicGroup(20)},
    {20,3,F20Group()},
    {20,4,DihedralGroup(20)},    
    {20,5,AbelianGroup({2,2,5})},    
    {24,1,UGroup(3,4)},--U_24    
    {24,2,CyclicGroup(24)},    
    {24,3,SL2F3Group()},--SL_2(F_3)=2T=Q_8:C_3    
    {24,4,QuaternionGroup(24)},    
    {24,5,DirectProduct(DihedralGroup(6),CyclicGroup(4))},--QDGroup(24)        
    {24,6,DihedralGroup(24)},    
    {24,7,DirectProduct(QuaternionGroup(12),CyclicGroup(2))},
    {24,8,VGroup(4,3)},--V_24        
    {24,9,AbelianGroup({2,12})},
    {24,10,DirectProduct(DihedralGroup(8),CyclicGroup(3))},    
    {24,11,DirectProduct(QuaternionGroup(8),CyclicGroup(3))},
    {24,12,SymmetricGroup(4)},    
    {24,13,DirectProduct(AlternatingGroup(4),CyclicGroup(2))},    
    {24,14,DirectProduct(DihedralGroup(12),CyclicGroup(2))},    
    {24,15,AbelianGroup({2,2,2,3})},
    {30,1,DirectProduct(DihedralGroup(6),CyclicGroup(5))},
    {30,2,DirectProduct(DihedralGroup(10),CyclicGroup(3))},
    {30,3,DihedralGroup(30)},
    {30,4,CyclicGroup(30)},    
    {32,1,CyclicGroup(32)},
    {32,3,AbelianGroup({4,8})},
    {32,4,TableByPermuteSet(FG({4,11,3,1,8,6,10,2,9,7,5,12},{9,2,1,12,5,4,6,8,7,3,11,10}))},--IdGroup(Group(( 1, 4)( 2,11, 5, 8)( 7,10),( 1, 9, 7, 6, 4,12,10, 3)));    
    {32,6,TableByPermuteSet(FG({2,1,4,7,6,5,8,3},{3,4,1,2,7,8,5,6}))},--IdGroup(Group([(1,2)(3,4,7,8)(5,6),(1,3)(2,4)(5,7)(6,8)]));
    {32,7,TableByPermuteSet(FG({2,7,8,5,6,3,4,1},{1,2,7,8,5,6,3,4}))},--IdGroup(Group([(1,2,7,4,5,6,3,8),(3,7)(4,8)]));    
    {32,9,VGroup(4,4)},
    {32,11,TableByPermuteSet(FG({2,3,4,1,5,6,7,8},{8,7,6,5,4,3,2,1}))},    
    {32,12,HGroup(8,4)},    
    {32,14,HGroup(4,8)},        
    {32,15,QGroup(4,4)},    
    {32,16,AbelianGroup({2,16})},
    {32,17,M32Group()},    
    {32,18,DihedralGroup(32)},
    {32,19,QDGroup(32)},
    {32,20,QuaternionGroup(32)},    
    {32,21,AbelianGroup({2,4,4})},
    {32,22,DirectProduct(VGroup(4,2),CyclicGroup(2))},    
    {32,23,DirectProduct(HGroup(4,4),CyclicGroup(2))},    
    {32,24,TableByPermuteSet(FG({1,2,6,4,5,3,7,8,12,10,11,9},{1,8,9,4,11,12,7,5,6,10,2,3},{7,3,2,10,6,5,4,9,8,1,12,11}))},--rank=3,IdGroup(Group(( 3, 6)( 9,12),( 2, 8, 5,11)( 3, 9, 6,12),( 1, 7, 4,10)( 2, 3)( 5, 6)( 8, 9)(11,12)));
    {32,25,DirectProduct(DihedralGroup(8),CyclicGroup(4))},        
    {32,26,DirectProduct(QuaternionGroup(8),CyclicGroup(4))},
    {32,27,TableByPermuteSet(FG({5,6,4,8,1,2,10,9,3,7},{6,2,3,4,5,1,7,8,9,10},{1,2,3,9,5,6,7,8,4,10}))},--IdGroup(Group((1,5)(2,6)(3,4,8,9)(7,10),(1,6),(4,9)));还可进一步表示为S_8的子群    
    {32,28,TableByPermuteSet(FG({2,3,4,1,5,6,7,8},{3,2,1,4,6,7,8,5},{1,2,3,4,7,6,5,8}))},--IdGroup(Group([(1,2,3,4),(1,3)(5,6,7,8),(5,7)]));
    {32,34,GeneralizedDihedralGroup({4,4})},--TableByPermuteSet(FG({1,4,3,6,5,8,7,2},{3,8,5,2,7,4,1,6},{7,6,5,4,3,2,1,8}))--IdGroup(Group([(2,4,6,8),(1,3,5,7)(2,8,6,4),(1,7)(2,6)(3,5)]));
    {32,36,AbelianGroup({2,2,8})},
    {32,37,DirectProduct(M16Group(),CyclicGroup(2))},        
    {32,39,DirectProduct(DihedralGroup(16),CyclicGroup(2))},
    {32,40,DirectProduct(QDGroup(16),CyclicGroup(2))},    
    {32,41,DirectProduct(QuaternionGroup(16),CyclicGroup(2))},    
    {32,43,TableByPermuteSet(FG({1,6,3,8,5,2,7,4},{8,7,6,5,4,3,2,1},{8,5,2,7,4,1,6,3}))},--IdGroup(Group([(2,6)(4,8),(1,8)(2,7)(3,6)(4,5),(1,8,3,2,5,4,7,6)]));    
    {32,45,AbelianGroup({2,2,2,4})},    
    {32,46,DirectProduct(DihedralGroup(8),AbelianGroup({2,2}))},    
    {32,47,DirectProduct(QuaternionGroup(8),AbelianGroup({2,2}))},    
    {32,48,DirectProduct(P16Group(),CyclicGroup(2))},    
    {32,49,TableByPermuteSet(FG({1,2,7,8,5,6,3,4},{1,6,3,8,5,2,7,4},{2,1,4,3,6,5,8,7},{3,4,1,2,7,8,5,6}))},--IdGroup(Group([(3,7)(4,8),(2,6)(4,8),(1,2)(3,4)(5,6)(7,8),(1,3)(2,4)(5,7)(6,8)]));    
    {32,51,AbelianGroup({2,2,2,2,2})},    
    {36,1,QuaternionGroup(36)},
    {36,2,CyclicGroup(36)},    
    {36,4,DihedralGroup(36)},    
    {36,5,AbelianGroup({18,2})},
    {36,6,DirectProduct(QuaternionGroup(12),CyclicGroup(3))},    
    {36,8,AbelianGroup({12,3})},
    {36,9,TableByPermuteSet(FG({1,3,8,7,9,2,5,6,4},{2,1,5,7,3,9,4,8,6}))},--IdGroup(Group([(2,3,8,6)(4,7,5,9),(1,2)(3,5)(4,7)(6,9)]));    
    {36,10,DirectProduct(SymmetricGroup(3),SymmetricGroup(3))},
    {36,11,DirectProduct(AlternatingGroup(4),CyclicGroup(3))},    
    {36,12,DirectProduct(CyclicGroup(6),SymmetricGroup(3))},
    {36,13,TableByPermuteSet(FG({1,2,8,4,6,7,5,3,9},{1,4,3,2,5,7,6,8,9},{1,2,3,9,5,7,6,8,4}))},--rank=3,IdGroup(Group((3,8)(5,6,7),(2,4)(6,7),(4,9)(6,7)));    
    {36,14,AbelianGroup({6,6})},
    {48,1,UGroup(3,8)},
    {48,2,CyclicGroup(48)},    
    {48,3,TableByPermuteSet(FG({7,2,12,10,5,9,4,8,3,1,11,6},{9,1,11,12,4,8,6,7,2,3,10,5}))},--IdGroup(Group(( 1, 7, 4,10)( 3,12, 6, 9),( 1, 9, 2)( 3,11,10)( 4,12, 5)( 6, 8, 7)));    
    {48,4,DirectProduct(CyclicGroup(8),SymmetricGroup(3))},    
    {48,6,QDGroup(48)},    
    {48,7,DihedralGroup(48)},--O(2,23)=GO(-1,2,23)
    {48,8,QuaternionGroup(48)},    
    {48,9,DirectProduct(UGroup(3,4),CyclicGroup(2))},
    {48,10,QGroup(4,6)},    
    {48,13,HGroup(4,12)},        
    {48,14,VGroup(4,6)},
    {48,15,VGroup(6,4)},    
    {48,20,AbelianGroup({3,4,4})},
    {48,21,DirectProduct(VGroup(4,2),CyclicGroup(3))},
    {48,22,DirectProduct(HGroup(4,4),CyclicGroup(3))},
    {48,23,AbelianGroup({2,3,8})},
    {48,24,DirectProduct(M16Group(),CyclicGroup(3))},
    {48,25,DirectProduct(DihedralGroup(16),CyclicGroup(3))},
    {48,26,DirectProduct(QD16Group(),CyclicGroup(3))},
    {48,27,DirectProduct(QuaternionGroup(16),CyclicGroup(3))},    
    {48,29,TableByPermuteSet(FG({1,2,3,7,8,9,4,5,6},{1,7,4,8,5,2,6,3,9}))},--GL(2,3),IdGroup(Group((4,7)(5,8)(6,9), (2,7,6)(3,4,8)));
    {48,30,TableByPermuteSet(FG({4,2,3,1,6,7,8,5},{1,3,4,2,5,6,7,8}))},--IdGroup(Group((1,4)(5,6,7,8),(2,3,4)));
    {48,31,TableByPermuteSet(FG({4,3,2,1,6,7,8,5},{1,3,4,2,5,6,7,8}))},--IdGroup(Group((1,4)(2,3)(5,6,7,8),(2,3,4)));    
    {48,32,DirectProduct(SL2F3Group(),CyclicGroup(2))},    
    {48,33,X48Group()},    
    {48,34,DirectProduct(QuaternionGroup(24),CyclicGroup(2))},
    {48,35,DirectProduct(DihedralGroup(6),AbelianGroup({2,4}))},
    {48,36,DirectProduct(DihedralGroup(24),CyclicGroup(2))},
    {48,38,DirectProduct(DihedralGroup(8),SymmetricGroup(3))},
    {48,40,DirectProduct(QuaternionGroup(8),SymmetricGroup(3))},        
    {48,42,DirectProduct(QuaternionGroup(12),AbelianGroup({2,2}))},    
    {48,43,DirectProduct(VGroup(4,3),CyclicGroup(2))},    
    {48,44,AbelianGroup({2,2,3,4})},    
    {48,45,DirectProduct(DihedralGroup(8),CyclicGroup(6))},
    {48,46,DirectProduct(QuaternionGroup(8),CyclicGroup(6))},    
    {48,47,DirectProduct(P16Group(),CyclicGroup(3))},    
    {48,48,DirectProduct(SymmetricGroup(4),CyclicGroup(2))},    
    {48,49,DirectProduct(AlternatingGroup(4),AbelianGroup({2,2}))},    
    {48,50,TableByPermuteSet(FG({1,2,3,4,6,5,8,7},{1,3,4,2,5,7,8,6},{2,1,4,3,5,6,7,8}))},--rank=3,IdGroup(Group(( 5, 6)( 7, 8),( 2, 3, 4)( 6, 7, 8),( 1, 2)( 3, 4)));    
    {48,51,DirectProduct(DihedralGroup(12),AbelianGroup({2,2}))},        
    {48,52,AbelianGroup({2,2,2,2,3})},    
    {60,1,DirectProduct(QuaternionGroup(12),CyclicGroup(5))},
    {60,2,DirectProduct(QuaternionGroup(20),CyclicGroup(3))},    
    {60,4,CyclicGroup(60)},        
    {60,5,AlternatingGroup(5)},    
    {60,6,DirectProduct(F20Group(),CyclicGroup(3))},    
    {60,8,DirectProduct(SymmetricGroup(3),DihedralGroup(10))},    
    {60,9,DirectProduct(AlternatingGroup(4),CyclicGroup(5))},    
    {60,10,DirectProduct(CyclicGroup(6),DihedralGroup(10))},        
    {60,11,DirectProduct(CyclicGroup(10),SymmetricGroup(3))},
    {60,12,DihedralGroup(60)},
    {60,13,AbelianGroup({2,30})},    
}

function NumberSmallGroups(n)
     for k,v in pairs(g_Gn) do
        if v[1]==n then
           return v[2]
        end
    end
    return 0
end

function SmallGroup(n,id)
     for k,v in pairs(g_G) do
        if v[1]==n and v[2]==id then
           return v[3]
        end
    end
    return nil
end

--未知群的群元的阶
function getGnEOrder(tb,a)
  local n=get_len(tb)
  if(a<1 or a>n) then
      return -1
  end
  local t=1
  for i=1,n,1 do
   t=tb[t][a]
   if(t==1)then
    return i
   end
  end
  return -1
end

--冒泡升序排序
function BubbleAsc(tb,Asc)
    local n=get_len(tb)
    for i=2,n,1 do
        for j=1,n-i,1 do
            if(tb[j]>tb[j+1]==Asc) then
                local temp=tb[j]
                tb[j]=tb[j+1]
                tb[j+1]=temp
            end
        end
    end
end

function nFG(G,...)
    local args={...}
    local S={}
     for i,v in pairs(args) do
        table.insert(S,v)
    end
    local cnt=0
    local cnt1=get_len(S)
    while(cnt1>cnt)do
        cnt=get_len(S)
        for ki,vi in pairs(S) do
            for kj,vj in pairs(S) do
                local ij=G[vi][vj]
                local IJ=get_key(ij,S)
                if(IJ==-1)then
                    table.insert(S,ij)
                end
            end
        end
        cnt1=get_len(S)
    end
    BubbleAsc(S,true)
    return S
end

--秩为1的子群的阶的分布(经过排序)
function calS1(tb)
  local n=get_len(tb)
  local S1={}
  for i=1,n,1 do
   local oi=getGnEOrder(tb,i)
   table.insert(S1,oi)
  end
  BubbleAsc(S1,true)
  return S1
end

--两个元素生成的子群的阶的分布
function calS2Undo(tb)
  local n=get_len(tb)
  local S2={}
  for i=1,n,1 do
      for j=i+1,n,1 do
       if j<=n then
           local ij=nFG(tb,i,j)
           table.insert(S2,get_len(ij))
       end
      end
  end
  return S2
end

function Factors(n)
    local ret={}
    if(n<1)then
        return ret
    end
    for i=1,n,1 do
        if(n%i==0)then
            table.insert(ret,i)
        end
    end
    return ret
end

function getCnt(n,tb)
  local ret={}    
  local v=Factors(n) 
  local m=get_len(v) 
  local ret={} 
  for i=1,m,1 do
    ret[i]=0
  end  
  local t=0
  local n1=get_len(tb) 
  for i=1,n1,1 do
   local idx=get_key(tb[i],v)
   if(idx~=-1)then
       ret[idx]=ret[idx]+1
   end
  end
  return ret
end

function calS(tb,SUndo)
  local n=get_len(tb)
  local S=getCnt(n,SUndo) 
  local m=get_len(S)  
  local s="["
  for i=1,m,1 do
   s=s..S[i]
   if(i<m)then
    s=s..","
   end
  end
  s=s.."]"
  return s
end

function calG(tb)
  local s=calS(tb,calS1(tb))
  return s
end

local g_N={4,6,8,10,12,14,16,18,20,24,30,32,36,48,60}
for k,v in pairs(g_N) do
    local nv=NumberSmallGroups(v)
    for i=1,nv,1 do
        local G8_i=SmallGroup(v,i)
        if G8_i~=nil then
            --io.write("GAP[",v,",",i,"]凯莱表:\n")
            --PrintArr2(G8_i)
            local G8_icalG=calG(G8_i)
            --io.write("GAP[",v,",",i,"]群元阶的分布:",G8_icalG,"\n\n")
            --io.write("GAP[",v,",",i,"]群元阶的分布:",G8_icalG,"\n")
            local G8_icalS2=calS(G8_i,calS2Undo(G8_i))
            io.write("GAP[",v,",",i,"]群元阶的分布:",G8_icalG,",S2=",G8_icalS2,"\n")
        end
    end
end

local d16=Dn(16)
for k,v in pairs(d16) do
    io.write(k,"->")
    PrintArr(v)
end

local qd16=QD8n(16)
for k,v in pairs(qd16) do
    io.write(k,"->")
    PrintArr2(v)
end
--[[
local G12_2=SmallGroup(12,2)
--local G12_2=CyclicGroup(12)
io.write("GAP[12,",2,"]凯莱表:\n")
PrintArr2(G12_2)
local G12_2calG=calG(G12_2)
io.write("GAP[12,",2,"]群元阶的分布:",G12_2calG,"\n")
]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值