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;
}