A~K系列有限環序列的n階矩陣表示(3個1階表示,2個4階表示,6個2階表示)

D:\MathTool\gaptool>IRing
A4=R4_1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2],4,1,0,4,1,3,3,16,3,4,[1,1,2],[]
B4=R4_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2],4,1,0,4,1,1,3,12,3,4,[1,1,2],[[4,4,4]]
C4=R4_3:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2],4,1,1,2,2,1,1,8,1,4,[1,1,2],[[2,4,2],[4,2,2],[4,4,4]]
D4=R4_4:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,0,4,1,3,3,16,3,4,[1,3,0],[]
E4=R4_5:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,0,4,1,1,3,12,3,4,[1,1,2],[[2,2,4]]
F4=R4_6:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,0,4,2,1,1,12,3,4,[1,2,1],[[2,2,4]]
F4=R4_6:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,0,4,2,1,1,12,3,4,[1,2,1],[[2,2,4]]
G4=R4_7:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,0,0,4,3,1,1,10,1,1,[1,3,0],[[2,2,6]]
H4=R4_8:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,0,0,4,3,1,1,10,3,1,[1,3,0],[[2,2,6]]
I4=R4_9:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,1,2,2,1,1,8,1,4,[1,2,1],[[2,2,8]]
J4=R4_10:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,1,3,4,0,0,9,2,4,[1,3,0],[[2,2,7]]
K4=R4_11:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,1,1,1,2,0,0,7,0,4,[1,1,2],[[2,2,9]]
A9=R9_1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2,6],9,1,0,9,1,8,8,81,8,9,[1,2,6],[]
B9=R9_3:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2,6],9,1,0,9,1,2,8,45,8,9,[1,2,6],[[9,9,36]]
C9=R9_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2,6],9,1,1,3,2,2,2,21,2,9,[1,2,6],[[3,9,12],[9,3,12],[9,9,36]]
D9=R9_4:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,0,9,1,8,8,81,8,9,[1,8,0],[]
E9=R9_5:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,0,9,1,2,8,45,8,9,[1,2,6],[[3,3,36]]
F9=R9_6:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,0,9,2,2,2,45,8,9,[1,4,4],[[3,3,36]]
F9=R9_6:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,0,9,2,2,2,45,8,9,[1,4,4],[[3,3,36]]
G9=R9_7:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,0,0,9,4,2,2,33,2,1,[1,8,0],[[3,3,48]]
H9=R9_8:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,0,0,9,4,2,2,33,8,1,[1,8,0],[[3,3,48]]
I9=R9_9:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,1,3,2,2,2,21,2,9,[1,4,4],[[3,3,60]]
J9=R9_10:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,1,5,4,0,0,25,4,9,[1,6,2],[[3,3,56]]
K9=R9_11:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,0],3,1,1,1,2,0,0,17,0,9,[1,2,6],[[3,3,64]]
A16=R16_1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4,8],16,1,0,16,1,15,15,256,15,16,[1,1,2,4,8],[]
B16=R16_4:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4,8],16,1,0,16,1,7,15,128,15,16,[1,1,2,4,8],[[8,16,32],[16,8,32],[16,16,64]]
C16=R16_3:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4,8],16,1,1,8,2,3,3,48,7,16,[1,1,2,4,8],[[2,16,8],[4,8,8],[4,16,16],[8,4,8],[8,8,16],[8,16,32],[
16,2,8],[16,4,16],[16,8,32],[16,16,64]]
D16=R16_107:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,0,16,1,15,15,256,15,16,[1,3,12,0,0],[]
E16=R16_111:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,0,16,1,7,15,128,15,16,[1,3,4,0,8],[[2,4,16],[4,2,16],[4,4,96]]
F16=R16_112:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,0,16,2,7,7,128,15,16,[1,3,6,2,4],[[2,4,16],[4,2,16],[4,4,96]]
F16=R16_112:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,0,16,2,7,7,128,15,16,[1,3,6,2,4],[[2,4,16],[4,2,16],[4,4,96]]
G16=R16_101:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,0,0,16,5,5,7,88,7,1,[1,3,12,0,0],[[2,4,24],[4,2,24],[4,4,120]]
H16=R16_102:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,0,0,16,5,5,7,88,15,1,[1,3,12,0,0],[[2,4,24],[4,2,24],[4,4,120]]
I16=R16_110:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,1,8,2,7,7,56,7,16,[1,3,6,2,4],[[2,4,32],[4,2,32],[4,4,136]]
J16=R16_104:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,1,12,4,3,3,64,11,16,[1,3,6,6,0],[[2,4,28],[4,2,28],[4,4,136]]
K16=R16_106:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,1,4,2,3,3,40,3,16,[1,3,2,2,8],[[2,4,36],[4,2,36],[4,4,144]]
A25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,4,20],25,1,0,25,1,24,24,625,24,25,[1,4,20],[]
B25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,4,20],25,1,0,25,1,4,24,225,24,25,[1,4,20],[[25,25,400]]
C25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,4,20],25,1,1,5,2,4,4,65,4,25,[1,4,20],[[5,25,80],[25,5,80],[25,25,400]]
D25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,0,25,1,24,24,625,24,25,[1,24,0],[]
E25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,0,25,1,4,24,225,24,25,[1,4,20],[[5,5,400]]
F25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,0,25,2,4,4,225,24,25,[1,8,16],[[5,5,400]]
F25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,0,25,2,4,4,225,24,25,[1,8,16],[[5,5,400]]
G25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,0,0,25,6,4,4,145,4,1,[1,24,0],[[5,5,480]]
H25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,0,0,25,6,4,4,145,24,1,[1,24,0],[[5,5,480]]
I25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,1,5,2,4,4,65,4,25,[1,8,16],[[5,5,560]]
J25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,1,9,4,0,0,81,8,25,[1,12,12],[[5,5,544]]
K25=R25_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,24,0],5,1,1,5,2,4,4,65,4,25,[1,8,16],[[5,5,560]]
A36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2,2,6,4,6,12],36,1,0,36,1,35,35,1296,35,36,[1,1,2,2,2,6,4,6,12],[]
B36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2,2,6,4,6,12],36,1,0,36,1,5,35,540,35,36,[1,1,2,2,2,6,4,6,12],[[4,4,4],[4,12,8],[4,36,24],[9,9,
36],[9,18,36],[9,36,72],[12,4,8],[12,12,16],[12,36,48],[18,9,36],[18,18,36],[18,36,72],[36,4,24],[36,9,72],[36,12,48],[36,18,72],[36,36,144]
]
C36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2,2,6,4,6,12],36,1,1,24,4,5,5,168,23,36,[1,1,2,2,2,6,4,6,12],[[2,4,2],[2,12,4],[2,36,12],[3,9,1
2],[3,18,12],[3,36,24],[4,2,2],[4,4,4],[4,6,4],[4,12,8],[4,18,12],[4,36,24],[6,4,4],[6,9,12],[6,12,8],[6,18,12],[6,36,24],[9,3,12],[9,6,12],
[9,9,36],[9,12,24],[9,18,36],[9,36,72],[12,2,4],[12,4,8],[12,6,8],[12,9,24],[12,12,16],[12,18,24],[12,36,48],[18,3,12],[18,4,12],[18,6,12],[
18,9,36],[18,12,24],[18,18,36],[18,36,72],[36,2,12],[36,3,24],[36,4,24],[36,6,24],[36,9,72],[36,12,48],[36,18,72],[36,36,144]]
D36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,0,36,1,35,35,1296,35,36,[1,3,8,0,24,0,0,0,0],[]
E36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,0,36,1,5,35,540,35,36,[1,1,2,2,2,6,4,6,12],[[2,2,4],[2,6,32],[3,3,36],[3,6,10
8],[6,2,32],[6,3,108],[6,6,436]]
F36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,0,36,4,5,5,540,35,36,[1,2,4,1,8,4,4,8,4],[[2,2,4],[2,6,32],[3,3,36],[3,6,108]
,[6,2,32],[6,3,108],[6,6,436]]
F36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,0,36,4,5,5,540,35,36,[1,2,4,1,8,4,4,8,4],[[2,2,4],[2,6,32],[3,3,36],[3,6,108]
,[6,2,32],[6,3,108],[6,6,436]]
G36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,0,0,36,12,5,5,330,23,1,[1,3,8,0,24,0,0,0,0],[[2,2,6],[2,6,48],[3,3,48],[3,6,144
],[6,2,48],[6,3,144],[6,6,528]]
H36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,0,0,36,12,5,5,330,35,1,[1,3,8,0,24,0,0,0,0],[[2,2,6],[2,6,48],[3,3,48],[3,6,144
],[6,2,48],[6,3,144],[6,6,528]]
I36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,1,24,4,5,5,168,23,36,[1,2,4,1,8,4,4,8,4],[[2,2,8],[2,6,64],[3,3,60],[3,6,180]
,[6,2,64],[6,3,180],[6,6,572]]
J36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,1,32,16,0,0,225,31,36,[1,3,6,0,18,2,0,6,0],[[2,2,7],[2,6,56],[3,3,56],[3,6,16
8],[6,2,56],[6,3,168],[6,6,560]]
K36=R36_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,8,0,24,0,0,0,0],6,1,1,12,4,0,0,119,11,36,[1,1,2,2,2,6,4,6,12],[[2,2,9],[2,6,72],[3,3,64],[3,6,192
],[6,2,72],[6,3,192],[6,6,576]]
A49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,6,42],49,1,0,49,1,48,48,2401,48,49,[1,6,42],[]
B49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,6,42],49,1,0,49,1,6,48,637,48,49,[1,6,42],[[49,49,1764]]
C49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,6,42],49,1,1,7,2,6,6,133,6,49,[1,6,42],[[7,49,252],[49,7,252],[49,49,1764]]
D49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,0,49,1,48,48,2401,48,49,[1,48,0],[]
E49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,0,49,1,6,48,637,48,49,[1,6,42],[[7,7,1764]]
F49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,0,49,2,6,6,637,48,49,[1,12,36],[[7,7,1764]]
F49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,0,49,2,6,6,637,48,49,[1,12,36],[[7,7,1764]]
G49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,0,0,49,8,6,6,385,6,1,[1,48,0],[[7,7,2016]]
H49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,0,0,49,8,6,6,385,48,1,[1,48,0],[[7,7,2016]]
I49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,1,7,2,6,6,133,6,49,[1,12,36],[[7,7,2268]]
J49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,1,13,4,0,0,169,12,49,[1,18,30],[[7,7,2232]]
K49=R49_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,48,0],7,1,1,1,2,0,0,97,0,49,[1,6,42],[[7,7,2304]]
A64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4,8,16,32],64,1,0,64,1,63,63,4096,63,64,[1,1,2,4,8,16,32],[]
B64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4,8,16,32],64,1,0,64,1,15,63,1280,63,64,[1,1,2,4,8,16,32],[[16,64,256],[32,32,256],[32,64,512],
[64,16,256],[64,32,512],[64,64,1024]]
C64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4,8,16,32],64,1,1,32,2,7,15,256,31,64,[1,1,2,4,8,16,32],[[2,64,32],[4,32,32],[4,64,64],[8,16,32
],[8,32,64],[8,64,128],[16,8,32],[16,16,64],[16,32,128],[16,64,256],[32,4,32],[32,8,64],[32,16,128],[32,32,256],[32,64,512],[64,2,32],[64,4,
64],[64,8,128],[64,16,256],[64,32,512],[64,64,1024]]
D64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,0,64,1,63,63,4096,63,64,[1,3,12,48,0,0,0],[]
E64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,0,64,1,15,63,1280,63,64,[1,3,4,24,0,0,32],[[2,8,64],[4,4,64],[4,8,384],[8,2,64],
[8,4,384],[8,8,1856]]
F64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,0,64,2,15,31,1280,63,64,[1,3,8,16,12,8,16],[[2,8,64],[4,4,64],[4,8,384],[8,2,64]
,[8,4,384],[8,8,1856]]
F64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,0,64,2,15,31,1280,63,64,[1,3,8,16,12,8,16],[[2,8,64],[4,4,64],[4,8,384],[8,2,64]
,[8,4,384],[8,8,1856]]
G64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,0,0,64,9,11,23,736,31,1,[1,3,12,48,0,0,0],[[2,8,96],[4,4,96],[4,8,480],[8,2,96],[8
,4,480],[8,8,2112]]
H64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,0,0,64,9,11,23,736,63,1,[1,3,12,48,0,0,0],[[2,8,96],[4,4,96],[4,8,480],[8,2,96],[8
,4,480],[8,8,2112]]
I64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,1,32,2,15,23,352,31,64,[1,3,8,16,12,8,16],[[2,8,128],[4,4,128],[4,8,544],[8,2,12
8],[8,4,544],[8,8,2272]]
J64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,1,48,4,3,15,400,47,64,[1,3,12,12,12,24,0],[[2,8,112],[4,4,112],[4,8,544],[8,2,11
2],[8,4,544],[8,8,2272]]
K64=R64_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,48,0,0,0],8,1,1,16,2,3,15,208,15,64,[1,3,4,12,4,8,32],[[2,8,144],[4,4,144],[4,8,576],[8,2,144]
,[8,4,576],[8,8,2304]]
A81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2,6,18,54],81,1,0,81,1,80,80,6561,80,81,[1,2,6,18,54],[]
B81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2,6,18,54],81,1,0,81,1,26,80,1701,80,81,[1,2,6,18,54],[[27,81,972],[81,27,972],[81,81,2916]]
C81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2,6,18,54],81,1,1,27,2,8,8,297,26,81,[1,2,6,18,54],[[3,81,108],[9,27,108],[9,81,324],[27,9,108],[27
,27,324],[27,81,972],[81,3,108],[81,9,324],[81,27,972],[81,81,2916]]
D81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,0,81,1,80,80,6561,80,81,[1,8,72,0,0],[]
E81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,0,81,1,26,80,1701,80,81,[1,8,18,0,54],[[3,9,324],[9,3,324],[9,9,4212]]
F81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,0,81,2,26,26,1701,80,81,[1,8,24,12,36],[[3,9,324],[9,3,324],[9,9,4212]]
F81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,0,81,2,26,26,1701,80,81,[1,8,24,12,36],[[3,9,324],[9,3,324],[9,9,4212]]
G81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,0,0,81,10,14,26,945,26,1,[1,8,72,0,0],[[3,9,432],[9,3,432],[9,9,4752]]
H81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,0,0,81,10,14,26,945,80,1,[1,8,72,0,0],[[3,9,432],[9,3,432],[9,9,4752]]
I81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,1,27,2,14,26,405,26,81,[1,8,24,12,36],[[3,9,540],[9,3,540],[9,9,5076]]
J81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,1,45,4,8,8,441,44,81,[1,8,18,36,18],[[3,9,504],[9,3,504],[9,9,5112]]
K81=R81_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,8,72,0,0],9,1,1,9,2,8,8,225,8,81,[1,8,6,12,54],[[3,9,576],[9,3,576],[9,9,5184]]

#include"IRing.h"

// 有限循環環mZ/nZ,這裏限制m|n
struct ZmodnZ:public IRing
{
public:
    // 靜態函數
public:
    // 實現抽象基類的方法
    virtual void printTable();
    virtual int add(int a,int b);
    virtual int mul(int a,int b);
    virtual int size(); 
    // 構造函數
    ZmodnZ(int m,int n);
    // 成員函數    
    // 成員變量
    int m_m;
    int m_n;// 運算爲模n加法和模n乘法    
};

void ZmodnZ::printTable()
{
    int ID=IdRing(this);
    string str=calcRingInvariant(this);
    printf("R%d_%d:N0n0bAbOn1n2n4n5n6n7n8S1N2=%s\n",size(),ID,str.c_str());    
    //string S1=calS1(this,true);
    //string undoS1=calS1(this,false);    
    //printf("R%d_%d:S1=%s,S1(未經處理)=%s\n",size(),ID,S1.c_str(),undoS1.c_str());
    //printRing(this);    
}

int ZmodnZ::add(int a,int b)
{
    return ((m_m*a+m_m*b)%m_n)/m_m;
}

int ZmodnZ::mul(int a,int b)
{
    return ((m_m*a*m_m*b)%m_n)/m_m;    
}

int ZmodnZ::size()
{
    return m_n/m_m;
}

ZmodnZ::ZmodnZ(int m,int n)
{
    m_m=m;
    m_n=n;
}

// 有限可分解環
struct DecompositionRing:public IRing
{
public:
    //  靜態函數  
    template<class T> vector<vector<int> > getTable(T *obp,int n,int(T::*p)(int,int));
    static vector<vector<int> > DirectProduct(const vector<vector<int>> &A,const vector<vector<int>> &B);   
public:
    // 實現抽象基類的方法
    virtual void printTable();
    virtual int add(int a,int b);
    virtual int mul(int a,int b);
    virtual int size(); 
    // 構造函數
    DecompositionRing();
    DecompositionRing(IRing *r1,IRing *r2);
    // 析構函數
    ~DecompositionRing();
    // 成員函數 
    void initF(int n);// R4_6、R9_6所在的有限環序列,
    // 成員變量  
    IRing *m_r1;
    IRing *m_r2;
    vector<vector<int> > m_Add;
    vector<vector<int> > m_Mul;
    int m_flag;// DecompositionRing對象析構時是否釋放m_r1、m_r2指向的內存
};

DecompositionRing::DecompositionRing(){
    m_r1=NULL;
    m_r2=NULL;
    m_flag=0;    
}

DecompositionRing::~DecompositionRing(){
    if(m_flag==1 && m_r1!=NULL){
        delete m_r1;
        m_r1=NULL;
    }    
    if(m_flag==1 && m_r2!=NULL){
        delete m_r2;
        m_r2=NULL;
    }
}

void DecompositionRing::initF(int n){
    m_r1=new ZmodnZ(n,n*n);
    m_r2=new ZmodnZ(1,n); 
    vector<vector<int> > Add1=getTable(m_r1,m_r1->size(),&IRing::add);
    vector<vector<int> > Add2=getTable(m_r2,m_r2->size(),&IRing::add);
    m_Add=DirectProduct(Add1,Add2);
    vector<vector<int> > Mul1=getTable(m_r1,m_r1->size(),&IRing::mul);
    vector<vector<int> > Mul2=getTable(m_r2,m_r2->size(),&IRing::mul);
    m_Mul=DirectProduct(Mul1,Mul2);
}

template<class T>
vector<vector<int> > DecompositionRing::getTable(T *obp,int n,int(T::*p)(int,int))
{
    vector<vector<int> > vv(n,vector<int>(n));
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            vv[i][j]=(obp->*p)(i,j);    
        }
    return vv;
}

vector<vector<int> > DecompositionRing::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;
}

DecompositionRing::DecompositionRing(IRing *r1,IRing *r2)
{
    m_r1=r1;
    m_r2=r2;
    vector<vector<int> > Add1=getTable(r1,r1->size(),&IRing::add);
    vector<vector<int> > Add2=getTable(r2,r2->size(),&IRing::add);
    m_Add=DirectProduct(Add1,Add2);
    vector<vector<int> > Mul1=getTable(r1,r1->size(),&IRing::mul);
    vector<vector<int> > Mul2=getTable(r2,r2->size(),&IRing::mul);
    m_Mul=DirectProduct(Mul1,Mul2);
}

void DecompositionRing::printTable()
{
    int ID=IdRing(this);
    string str=calcRingInvariant(this);
    printf("R%d_%d:N0n0bAbOn1n2n4n5n6n7n8S1N2=%s\n",size(),ID,str.c_str());
    //printRing(this);    
}

int DecompositionRing::add(int a,int b)
{
    return m_Add[a][b];
}

int DecompositionRing::mul(int a,int b)
{
    return m_Mul[a][b];    
}

int DecompositionRing::size()
{
    return m_Add.size();
}

typedef vector<vector<int> > MATRIXi;

// 2階全矩陣環M2(r)
struct M2r:public IRing
{
public:
    // 靜態函數
   static int getidx(vector<MATRIXi> &Arr2,MATRIXi &Arr1);
   static bool IsEqual(const MATRIXi &t,const MATRIXi &m);
   static vector<MATRIXi> FR(IRing* r,vector<MATRIXi>& gen); 
   static MATRIXi add(IRing* r,const MATRIXi &t,const MATRIXi &m);  
   static MATRIXi mul(IRing* r,const MATRIXi &t,const MATRIXi &m);
   static string MStr(const MATRIXi &t);   
public:
    // 實現抽象基類的方法
    virtual void printTable();
    virtual int add(int a,int b);
    virtual int mul(int a,int b);
    virtual int size(); 
    // 構造函數
    M2r();// 默認構造函數
    M2r(IRing* r);
    M2r(IRing* r,vector<MATRIXi>& gen);    
    // 析構函數
    ~M2r();
    // 成員函數    
    // 有限環序列A、B、C、D、E、F、G、H、I、J、K(拉丁字母符號以4階環的GAP編號爲準)<->C、B、A、J、?、?、Y、P、X、D、K(對應的某些文獻的拉丁字母符號)
    void initD(int n);// 256階全矩陣環M2(Z/4Z)的4階子環R4_4所在的有限環序列,J=<a,b;pa=pb=0,a^2=b^2=0>=C_p×C_p(0)    
    void initE(int n);// R4_5所在的有限環序列,
    void initF(int n);// R4_6所在的有限環序列,        
    void initG(int n);// 16階全矩陣環M2(Z/2Z)的4階子環R4_7所在的有限環序列,Y    
    void initH(int n);// 16階全矩陣環M2(Z/2Z)的4階子環R4_8所在的有限環序列,P    
    void initI(int n);// 16階全矩陣環M2(Z/2Z)的4階子環R4_9所在的有限環序列,X    
    void initJ(int n);// 16階全矩陣環M2(Z/2Z)的4階子環R4_10所在的有限環序列,D=<a,b;pa=pb=0,a^2=a,b^2=b,ab=ba=0>=Z_p+Z_p    
    void initK(int n);// 16階全矩陣環M2(Z/2Z)的4階子環R4_11所在的有限環序列,K=GF(p^2)=p^2階有限域
    // 成員變量
    vector<MATRIXi> m_Set;
    IRing* m_r;
    int m_flag;// M2r對象析構時是否釋放m_r指向的內存
};

M2r::M2r(){
    m_r=NULL;
    m_flag=0;    
}

M2r::~M2r(){
    if(m_flag==1 && m_r!=NULL){
        delete m_r;
        m_r=NULL;
    }    
}

// A:=[ [ ZmodnZObj(2,m), ZmodnZObj( 0, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 0, m) ] ];;B:=[ [ ZmodnZObj(0,m), ZmodnZObj( 0, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 2, m) ] ];;R:=RingByGenerators([A,B]);;
void M2r::initD(int n){
   MATRIXi A(2,vector<int>(2,0));
   MATRIXi B(2,vector<int>(2,0));
   A[0][0]=n;
   A[0][1]=0;
   A[1][0]=0;
   A[1][1]=0;  
   B[0][0]=0;
   B[0][1]=0;
   B[1][0]=0;
   B[1][1]=n;
   vector<MATRIXi> gen;
   gen.push_back(A);
   gen.push_back(B);
   m_r=new ZmodnZ(1,n*n);
   m_flag=1;
   m_Set=FR(m_r,gen);   
}

void M2r::initE(int n){
}

void M2r::initF(int n){
}

// A:=[ [ ZmodnZObj( 1, m), ZmodnZObj( 0, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 0, m) ] ];;B:=[ [ ZmodnZObj( 1, m), ZmodnZObj( 1, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 0, m) ] ];;YRing:=RingByGenerators([A,B]);;
void M2r::initG(int n){
   MATRIXi A(2,vector<int>(2,0));
   MATRIXi B(2,vector<int>(2,0));
   A[0][0]=1;
   A[0][1]=0;
   A[1][0]=0;
   A[1][1]=0;  
   B[0][0]=1;
   B[0][1]=1;
   B[1][0]=0;
   B[1][1]=0;  
   vector<MATRIXi> gen;
   gen.push_back(A);
   gen.push_back(B);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_Set=FR(m_r,gen);   
}

// A:=[ [ ZmodnZObj( 1, m), ZmodnZObj( 0, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 0, m) ] ];;B:=[ [ ZmodnZObj( 1, m), ZmodnZObj( 0, m) ], [ ZmodnZObj( 1, m), ZmodnZObj( 0, m) ] ];;R:=RingByGenerators([A,B]);;
void M2r::initH(int n){
   MATRIXi A(2,vector<int>(2,0));
   MATRIXi B(2,vector<int>(2,0));
   A[0][0]=1;
   A[0][1]=0;
   A[1][0]=0;
   A[1][1]=0;  
   B[0][0]=1;
   B[0][1]=0;
   B[1][0]=1;
   B[1][1]=0;  
   vector<MATRIXi> gen;
   gen.push_back(A);
   gen.push_back(B);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_Set=FR(m_r,gen);   
}

// A:=[ [ ZmodnZObj( 1, m), ZmodnZObj( 0, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 1, m) ] ];;B:=[ [ ZmodnZObj( 1, m), ZmodnZObj( 1, m) ], [ ZmodnZObj( 0, m), ZmodnZObj( 1, m) ] ];;R:=RingByGenerators([A,B]);;
void M2r::initI(int n){
   MATRIXi A(2,vector<int>(2,0));
   MATRIXi B(2,vector<int>(2,0));
   A[0][0]=1;
   A[0][1]=0;
   A[1][0]=0;
   A[1][1]=1;  
   B[0][0]=1;
   B[0][1]=1;
   B[1][0]=0;
   B[1][1]=1;  
   vector<MATRIXi> gen;
   gen.push_back(A);
   gen.push_back(B);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_Set=FR(m_r,gen);   
}

// A:=[ [ ZmodnZObj( 1, 2 ), ZmodnZObj( 0, 2 ) ], [ ZmodnZObj( 0, 2 ), ZmodnZObj( 1, 2 ) ] ];;B:=[ [ ZmodnZObj( 1, 2 ), ZmodnZObj( 0, 2 ) ], [ ZmodnZObj( 0, 2 ), ZmodnZObj( 0, 2 ) ] ];;R:=RingByGenerators([A,B]);;
void M2r::initJ(int n){
   MATRIXi A(2,vector<int>(2,0));
   MATRIXi B(2,vector<int>(2,0));
   A[0][0]=1;
   A[0][1]=0;
   A[1][0]=0;
   A[1][1]=1;  
   B[0][0]=1;
   B[0][1]=0;
   B[1][0]=0;
   B[1][1]=0; 
   vector<MATRIXi> gen;
   gen.push_back(A);
   gen.push_back(B);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_Set=FR(m_r,gen);   
}

void M2r::initK(int n){
   MATRIXi A(2,vector<int>(2,0));
   A[0][0]=1;
   A[0][1]=1;
   A[1][0]=1;
   A[1][1]=0;   
   vector<MATRIXi> gen;
   gen.push_back(A);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_Set=FR(m_r,gen);   
}

M2r::M2r(IRing* r,vector<MATRIXi>& gen){
    m_r=r;
    m_Set=FR(r,gen);
}

vector<MATRIXi> M2r::FR(IRing* r,vector<MATRIXi>& gen){
    vector<MATRIXi> Set;
    int n=gen[0].size();
    MATRIXi E(n,vector<int>(n,0));
    Set.push_back(E);
    for(int i=0;i<gen.size();i++)
    {
        if(!IsEqual(gen[i],E))
            Set.push_back(gen[i]);
    }
    int R=Set.size();
    int cnt=R;
    int cnt1=R;
    do{
        cnt=Set.size();
        for(int i=0;i<cnt;i++)
        {
            for(int j=0;j<cnt;j++)
            {
                MATRIXi IJ=mul(r,Set[i],Set[j]);
                vector<MATRIXi>::iterator p=std::find(Set.begin(),Set.end(),IJ);
                if(p==Set.end()){
                    Set.push_back(IJ);
                }
                MATRIXi IJ1=add(r,Set[i],Set[j]);
                p=std::find(Set.begin(),Set.end(),IJ1);
                if(p==Set.end()){
                    Set.push_back(IJ1);
                }
            }
        }
        cnt1=Set.size();
    }while(cnt1>cnt);
    return Set;    
}

string M2r::MStr(const MATRIXi &t){
    string str="[";
    int n=t.size();
    for(int i=0;i<n;i++)
    {
        str+="[";
        for(int j=0;j<n;j++)
        {
            char sz[20]={0};
            sprintf(sz,"%d",t[i][j]);
            str+=sz;
            if(j<n-1)
                str+=",";
        }
        str+="]";
        if(i<n-1)
            str+=",";
    }
    str+="]";
    return str;
}

MATRIXi M2r::add(IRing* r,const MATRIXi &t,const MATRIXi &m)
{
    int n=t.size();
    MATRIXi C(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            C[i][j]=r->add(t[i][j],m[i][j]);
        }
    }
    return C;
}

MATRIXi M2r::mul(IRing* r,const MATRIXi &t,const MATRIXi &m)
{
    int n=t.size();
    MATRIXi C(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int sum=0;
            for(int k=0;k<n;k++){
                sum=r->add(sum,r->mul(t[i][k],m[k][j]));
            }
            C[i][j]=sum;
        }
    }
    return C;
}

int M2r::getidx(vector<MATRIXi> &Arr2,MATRIXi &Arr1){
    int N=Arr2.size();
    for(int i=0;i<N;i++){
        if(IsEqual(Arr2[i],Arr1))
            return i;
    }
    return -1;
}

bool M2r::IsEqual(const MATRIXi &t,const MATRIXi &m){
    int nt=t.size();
    int nm=m.size();
    if(nt!=nm)
        return false;
    for(int i=0;i<nt;i++){
        for(int j=0;j<nt;j++){
            if(t[i][j]!=m[i][j])
                return false;
        }
    }
    return true;
}

void M2r::printTable()
{
    int ID=IdRing(this);
    string str=calcRingInvariant(this);
    printf("R%d_%d:N0n0bAbOn1n2n4n5n6n7n8S1N2=%s\n",size(),ID,str.c_str());    
    //string S1=calS1(this,true);
    //string undoS1=calS1(this,false);    
    //printf("R%d_%d:S1=%s,S1(未經處理)=%s\n",size(),ID,S1.c_str(),undoS1.c_str());
    if(size()<100){
        //printRing(this);    
    }
    else{
       printf("環的階太大,不在控制檯打印\n");
    }
}

int M2r::add(int a,int b)
{
    MATRIXi A=m_Set[a];
    MATRIXi B=m_Set[b];    
    int n=2;
    MATRIXi C(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            C[i][j]=m_r->add(A[i][j],B[i][j]);
        }
    }
    int c=getidx(m_Set,C);
    return c;
}

int M2r::mul(int a,int b)
{
    MATRIXi A=m_Set[a];
    MATRIXi B=m_Set[b];    
    int n=2;
    MATRIXi C(n,vector<int>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int sum=0;
            for(int k=0;k<n;k++){
                sum=m_r->add(sum,m_r->mul(A[i][k],B[k][j]));
            }
            C[i][j]=sum;
        }
    }
    int c=getidx(m_Set,C);
    return c;
}

int M2r::size()
{
    return m_Set.size();
}

M2r::M2r(IRing* r)
{
    m_r=r;
    int N=r->size();
    int n=2;
    MATRIXi m(n,vector<int>(n,0));
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            for(int k=0;k<N;k++){
                for(int l=0;l<N;l++){
                    m[0][0]=i;
                    m[0][1]=j;
                    m[1][0]=k;
                    m[1][1]=l;
                    m_Set.push_back(m);                    
                }
            }
        }
    }
}

typedef vector<vector<unsigned char> > MATRIXi8;

// n階全矩陣環Mn(r)
struct Mnr:public IRing
{
public:
    // 靜態函數
   static int getidx(vector<MATRIXi8> &Arr2,MATRIXi8 &Arr1);
   static bool IsEqual(const MATRIXi8 &t,const MATRIXi8 &m);    
   static bool nextV1(int m,vector<unsigned char>& v);
   static vector<MATRIXi8> FR(IRing* r,vector<MATRIXi8>& gen); 
   static MATRIXi8 add(IRing* r,const MATRIXi8 &t,const MATRIXi8 &m);  
   static MATRIXi8 mul(IRing* r,const MATRIXi8 &t,const MATRIXi8 &m); 
   static string MStr(const MATRIXi8 &t);   
public:
    // 實現抽象基類的方法
    virtual void printTable();
    virtual int add(int a,int b);
    virtual int mul(int a,int b);
    virtual int size(); 
    // 構造函數
    Mnr();// 默認構造函數
    Mnr(IRing* r,int n);
    Mnr(IRing* r,int n,vector<MATRIXi8>& gen);    
    // 析構函數
    ~Mnr();    
    // 成員函數    
    int visitMnRm(int n,int m);    
    // 有限環序列
    void initE(int n);// R4_5、R9_5所在的n^2階有限環序列,
    void initF(int n);// R4_6、R9_6所在的n^2階有限環序列,        
    void initL(int n);// R8_38所在的n^3階有限環序列,
    // 成員變量
    vector<MATRIXi8> m_Set;
    IRing* m_r;
    int m_n;
    int m_flag;// Mnr對象析構時是否釋放m_r指向的內存
};

Mnr::Mnr(){
    m_r=NULL;
    m_flag=0;    
}

Mnr::~Mnr(){
    if(m_flag==1 && m_r!=NULL){
        delete m_r;
        m_r=NULL;
    }    
}

// A:=[[Z(m),Z(m),0*Z(m),0*Z(m)],[0*Z(m),Z(m),0*Z(m),Z(m)],[0*Z(m),Z(m),0*Z(m),Z(m)],[Z(m),Z(m),0*Z(m),0*Z(m)]];;R4_5:=RingByGenerators([A]);;
void Mnr::initE(int n){
   MATRIXi8 A(4,vector<unsigned char>(4,0));
   MATRIXi8 B(4,vector<unsigned char>(4,0));
   A[0][0]=0;
   A[0][1]=1;
   A[0][2]=0;
   A[0][3]=1; 
   A[1][0]=n-1;
   A[1][1]=n-1;
   A[1][2]=0;
   A[1][3]=0;
   A[2][0]=n-1;
   A[2][1]=n-1;
   A[2][2]=0;
   A[2][3]=0;
   A[3][0]=0;
   A[3][1]=1;
   A[3][2]=0;
   A[3][3]=1;
   vector<MATRIXi8> gen;
   gen.push_back(A);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_n=4;
   m_Set=FR(m_r,gen);   
}

// A:=[[Z(m),0*Z(m),0*Z(m),Z(m)],[Z(m),0*Z(m),0*Z(m),Z(m)],[0*Z(m),Z(m),Z(m),0*Z(m)],[Z(m),0*Z(m),0*Z(m),Z(m)]];;R4_6:=RingByGenerators([A]);;
void Mnr::initF(int n){
   MATRIXi8 A(4,vector<unsigned char>(4,0));
   A[0][0]=1;
   A[0][1]=0;
   A[0][2]=0;
   A[0][3]=1;
   A[1][0]=n-1;
   A[1][1]=0;
   A[1][2]=0;
   A[1][3]=n-1; 
   A[2][0]=0;
   A[2][1]=n-1;
   A[2][2]=n-1;
   A[2][3]=0;
   A[3][0]=n-1;
   A[3][1]=0;
   A[3][2]=0;
   A[3][3]=n-1;
   vector<MATRIXi8> gen;
   gen.push_back(A);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_n=4;
   m_Set=FR(m_r,gen);   
}

// A:=[[0*Z(m),Z(m),0*Z(m),Z(m)],[Z(m),Z(m),0*Z(m),0*Z(m)],[0*Z(m),0*Z(m),Z(m),Z(m)],[0*Z(m),Z(m),0*Z(m),Z(m)]];;R8_38:=RingByGenerators([A]);;
void Mnr::initL(int n){
   MATRIXi8 A(4,vector<unsigned char>(4,0));
   MATRIXi8 B(4,vector<unsigned char>(4,0));
   A[0][0]=0;
   A[0][1]=1;
   A[0][2]=0;
   A[0][3]=1;
   A[1][0]=1;
   A[1][1]=1;
   A[1][2]=0;
   A[1][3]=0; 
   A[2][0]=0;
   A[2][1]=0;
   A[2][2]=1;
   A[2][3]=1;
   A[3][0]=0;
   A[3][1]=1;
   A[3][2]=0;
   A[3][3]=1;
   vector<MATRIXi8> gen;
   gen.push_back(A);
   m_r=new ZmodnZ(1,n);
   m_flag=1;
   m_n=4;
   m_Set=FR(m_r,gen);   
}

Mnr::Mnr(IRing* r,int n,vector<MATRIXi8>& gen){
    m_r=r;
    m_n=n;
    m_flag=0;
    m_Set=FR(r,gen);
}

string Mnr::MStr(const MATRIXi8 &t){
    string str="[";
    int n=t.size();
    for(int i=0;i<n;i++)
    {
        str+="[";
        for(int j=0;j<n;j++)
        {
            char sz[20]={0};
            sprintf(sz,"%d",t[i][j]);
            str+=sz;
            if(j<n-1)
                str+=",";
        }
        str+="]";
        if(i<n-1)
            str+=",";
    }
    str+="]";
    return str;
}

vector<MATRIXi8> Mnr::FR(IRing* r,vector<MATRIXi8>& gen){
    vector<MATRIXi8> Set;
    int n=gen[0].size();
    MATRIXi8 E(n,vector<unsigned char>(n,0));
    Set.push_back(E);
    for(int i=0;i<gen.size();i++)
    {
        if(!IsEqual(gen[i],E))
            Set.push_back(gen[i]);
    }
    int R=Set.size();
    int cnt=R;
    int cnt1=R;
    do{
        cnt=Set.size();
        for(int i=0;i<cnt;i++)
        {
            for(int j=0;j<cnt;j++)
            {
                MATRIXi8 IJ=mul(r,Set[i],Set[j]);
                vector<MATRIXi8>::iterator p=std::find(Set.begin(),Set.end(),IJ);
                if(p==Set.end()){
                    Set.push_back(IJ);
                }
                MATRIXi8 IJ1=add(r,Set[i],Set[j]);
                p=std::find(Set.begin(),Set.end(),IJ1);
                if(p==Set.end()){
                    Set.push_back(IJ1);
                }
            }
        }
        cnt1=Set.size();
    }while(cnt1>cnt);
    return Set;    
}

MATRIXi8 Mnr::add(IRing* r,const MATRIXi8 &t,const MATRIXi8 &m)
{
    int n=t.size();
    MATRIXi8 C(n,vector<unsigned char>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            C[i][j]=r->add(t[i][j],m[i][j]);
        }
    }
    return C;
}

MATRIXi8 Mnr::mul(IRing* r,const MATRIXi8 &t,const MATRIXi8 &m)
{
    int n=t.size();
    MATRIXi8 C(n,vector<unsigned char>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int sum=0;
            for(int k=0;k<n;k++){
                sum=r->add(sum,r->mul(t[i][k],m[k][j]));
            }
            C[i][j]=sum;
        }
    }
    return C;
}

bool Mnr::nextV1(int m,vector<unsigned char>& v){
    int n=v.size();
    for(int i=n-1;i>=0;i--){
        if(v[i]<m-1){
            v[i]+=1;
            return true;
        }
        else if(v[i]==m-1 && i>0){
            if(v[i-1]<m-1){
                v[i-1]+=1;
                for(int j=i;j<n;j++)
                    v[j]=0;
                return true;
            }
        }
    }
    return false;
}

// 調用m^(n^2)次visit
int Mnr::visitMnRm(int n,int m){
    vector<unsigned char> v(n*n,0);
    int cnt=0;
    do {
        ++cnt;
        MATRIXi8 M(n,vector<unsigned char>(n,0));
        for(int k=0;k<n*n;k++){
            int i=k/n;
            int j=k%n;
            M[i][j]=v[k];
        }
        m_Set.push_back(M);
    }while(nextV1(m,v));
    return cnt;
}

int Mnr::getidx(vector<MATRIXi8> &Arr2,MATRIXi8 &Arr1){
    int N=Arr2.size();
    for(int i=0;i<N;i++){
        if(IsEqual(Arr2[i],Arr1))
            return i;
    }
    return -1;
}

bool Mnr::IsEqual(const MATRIXi8 &t,const MATRIXi8 &m){
    int nt=t.size();
    int nm=m.size();
    if(nt!=nm)
        return false;
    for(int i=0;i<nt;i++){
        for(int j=0;j<nt;j++){
            if(t[i][j]!=m[i][j])
                return false;
        }
    }
    return true;
}

void Mnr::printTable()
{
    int ID=IdRing(this);
    string str=calcRingInvariant(this);
    printf("R%d_%d:N0n0bAbOn1n2n4n5n6n7n8S1N2=%s\n",size(),ID,str.c_str());
    //string undoS1=calS1(this,false);    
    //printf("R%d_%d:S1=%s,S1(未經處理)=%s\n",size(),ID,S1.c_str(),undoS1.c_str());
    if(size()<100){
        //printRing(this);    
    }
    else{
       printf("環的階太大,不在控制檯打印\n");
    }
}

int Mnr::add(int a,int b)
{
    MATRIXi8 A=m_Set[a];
    MATRIXi8 B=m_Set[b];    
    int n=m_n;
    MATRIXi8 C(n,vector<unsigned char>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            C[i][j]=m_r->add(A[i][j],B[i][j]);
        }
    }
    int c=getidx(m_Set,C);
    return c;
}

int Mnr::mul(int a,int b)
{
    MATRIXi8 A=m_Set[a];
    MATRIXi8 B=m_Set[b];    
    int n=m_n;
    MATRIXi8 C(n,vector<unsigned char>(n,0));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int sum=0;
            for(int k=0;k<n;k++){
                sum=m_r->add(sum,m_r->mul(A[i][k],B[k][j]));
            }
            C[i][j]=sum;
        }
    }
    int c=getidx(m_Set,C);
    return c;
}

int Mnr::size()
{
    return m_Set.size();
}

Mnr::Mnr(IRing* r,int n)
{
    m_r=r;
    m_n=n;
    int N=r->size();
    int cnt=visitMnRm(m_n,N);
    printf("cnt=%d\n",cnt);
}

void test1()
{
   ZmodnZ r2_1(2,4);
   r2_1.printTable();  

   ZmodnZ r2_2(1,2);  
   r2_2.printTable();

   ZmodnZ r4_2(2,8);
   r4_2.printTable();  

   ZmodnZ r4_3(1,4);  
   r4_3.printTable();
   
   M2r m2r4_2(&r4_2);
   m2r4_2.printTable(); 

   M2r m2r4_3(&r4_3);
   m2r4_3.printTable(); 

   vector<int> v;
   v.push_back(2);
   Subring r2_1a(&r4_3,v);
   r2_1a.printTable();
   
   Mnr m2r2_1(&r2_1,2);
   m2r2_1.printTable(); 

   Mnr m3r2_1(&r2_1,3);
   m3r2_1.printTable();   
   
   Mnr m2r2_2(&r2_2,2);
   m2r2_2.printTable(); 

   Mnr m3r2_2(&r2_2,3);
   m3r2_2.printTable();     
}

int main()

   for(int i=2;i<10;i++)
   {
       // A、B、C系列的有限環是1階矩陣表示
       ZmodnZ A(i*i,i*i*i*i);
       printf("A%d=",i*i);
       A.printTable();    
       ZmodnZ B(i,i*i*i);
       printf("B%d=",i*i);
       B.printTable();    
       ZmodnZ C(1,i*i);
       printf("C%d=",i*i);
       C.printTable();

       // D、G、H、I、J、K系列的有限環是2階矩陣表示
       M2r D;
       D.initD(i);
       printf("D%d=",i*i);
       D.printTable();

       // E、F系列的有限環是4階矩陣表示
       Mnr E;
       E.initE(i);
       printf("E%d=",i*i);
       E.printTable();     
       Mnr F;
       F.initF(i);
       printf("F%d=",i*i);
       F.printTable();    
       DecompositionRing Fa;
       Fa.initF(i);
       printf("F%d=",i*i);
       Fa.printTable(); 

       M2r G;
       G.initG(i);
       printf("G%d=",i*i);
       G.printTable();       
       M2r H;
       printf("H%d=",i*i);       
       H.initH(i);
       H.printTable(); 
       M2r I;
       printf("I%d=",i*i);       
       I.initI(i);
       I.printTable(); 
       M2r J;
       printf("J%d=",i*i);       
       J.initJ(i);
       J.printTable();     
       M2r K;
       printf("K%d=",i*i);       
       K.initK(i);
       K.printTable();      
   }
   return 0;
}

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