D:\MathTool\gaptool>IdRing R8_10.txt
R8_10:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,4,0],4,0,0,8,1,5,7,48,7,2,[1,3,4,0],[[4,2,8],[4,4,8]]
D:\MathTool\gaptool>IdRing R8_11.txt
R8_11:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,4,0],4,1,0,8,1,7,7,40,7,8,[1,3,4,0],[[2,4,8],[4,2,8],[4,4,8]]
D:\MathTool\gaptool>FiniteRing
R2_1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1],2,1,0,2,1,1,1,4,1,2,[1,1],[]
R2_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1],2,1,1,1,2,0,0,3,0,2,[1,1],[[2,2,1]]
R3_1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2],3,1,0,3,1,2,2,9,2,3,[1,2],[]
R3_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,2],3,1,1,1,2,0,0,5,0,3,[1,2],[[3,3,4]]
R6_1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2],6,1,0,6,1,5,5,36,5,6,[1,1,2,2],[]
R6_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2],6,1,0,6,2,1,1,20,5,6,[1,1,2,2],[[3,3,4],[3,6,4],[6,3,4],[6,6,4]]
R6_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2],6,1,0,6,2,1,1,20,5,6,[1,1,2,2],[[3,3,4],[3,6,4],[6,3,4],[6,6,4]]
R6_4:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2],6,1,1,4,4,0,0,15,3,6,[1,1,2,2],[[2,2,1],[2,6,2],[3,3,4],[3,6,4],[6,2,2],[6,3,4],[6,6,4]]
R8_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4],8,1,0,8,1,3,3,32,7,8,[1,1,2,4],[[4,8,8],[8,4,8],[8,8,16]]
R8_3:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4],8,1,1,4,2,1,3,20,3,8,[1,1,2,4],[[2,8,4],[4,4,4],[4,8,8],[8,2,4],[8,4,8],[8,8,16]]
R8_4:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4],8,1,0,8,1,3,7,48,7,8,[1,1,2,4],[[8,8,16]]
R8_14:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,4,0],4,1,1,6,4,1,1,24,5,8,[1,2,5,0],[[2,2,8],[2,4,10],[4,2,10],[4,4,12]]
R8_45:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,4,2,3,3,24,3,8,[1,4,3,0],[[2,2,40]]
R8_45:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,4,2,3,3,24,3,8,[1,4,3,0],[[2,2,40]]
R8_49:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,0,1,6,6,1,1,26,5,2,[1,6,1,0],[[2,2,38]]
R8_51:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,5,4,0,0,21,4,8,[1,3,2,2],[[2,2,43]]
R8_52:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,1,2,0,0,15,0,8,[1,1,0,6],[[2,2,49]]
#include"IRing.h"
int g_M2Add[2][2]={
{0,1},
{1,0}
};
int g_M2Mul[2][2]={
{0,0},
{0,0}
};
int g_F2Add[2][2]={
{0,1},
{1,0}
};
int g_F2Mul[2][2]={
{0,0},
{0,1}
};
int g_M3Add[3][3]={
{0,1,2},
{1,2,0},
{2,0,1}
};
int g_M3Mul[3][3]={
{0,0,0},
{0,0,0},
{0,0,0}
};
int g_F3Add[3][3]={
{0,1,2},
{1,2,0},
{2,0,1}
};
int g_F3Mul[3][3]={
{0,0,0},
{0,1,2},
{0,2,1}
};
int g_M3M2_M6Add[6][6]={
{0,1,2,3,4,5},
{1,2,3,4,5,0},
{2,3,4,5,0,1},
{3,4,5,0,1,2},
{4,5,0,1,2,3},
{5,0,1,2,3,4}
};
int g_M3M2_M6Mul[6][6]={
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,0,0,0,0}
};
//R6_2
int g_F3M2_R2Add[6][6]={
{0,1,2,3,4,5},
{1,2,3,4,5,0},
{2,3,4,5,0,1},
{3,4,5,0,1,2},
{4,5,0,1,2,3},
{5,0,1,2,3,4}
};
int g_F3M2_R2Mul[6][6]={
{0,0,0,0,0,0},
{0,2,4,0,2,4},
{0,4,2,0,4,2},
{0,0,0,0,0,0},
{0,2,4,0,2,4},
{0,4,2,0,4,2}
};
int g_F3M2Add[6][6]={
{0,1,2,3,4,5},
{1,0,3,2,5,4},
{2,3,4,5,0,1},
{3,2,5,4,1,0},
{4,5,0,1,2,3},
{5,4,1,0,3,2},
};
int g_F3M2Mul[6][6]={
{0,0,0,0,0,0},
{0,0,0,0,0,0},
{0,0,2,2,4,4},
{0,0,2,2,4,4},
{0,0,4,4,2,2},
{0,0,4,4,2,2},
};
//R6_4
int g_F3F2_Z6Add[6][6]={
{0,1,2,3,4,5},
{1,2,3,4,5,0},
{2,3,4,5,0,1},
{3,4,5,0,1,2},
{4,5,0,1,2,3},
{5,0,1,2,3,4}
};
int g_F3F2_Z6Mul[6][6]={
{0,0,0,0,0,0},
{0,1,2,3,4,5},
{0,2,4,0,2,4},
{0,3,0,3,0,3},
{0,4,2,0,4,2},
{0,5,4,3,2,1}
};
//R6_4
int g_F3F2Add[6][6]={
{0,1,2,3,4,5},
{1,0,3,2,5,4},
{2,3,4,5,0,1},
{3,2,5,4,1,0},
{4,5,0,1,2,3},
{5,4,1,0,3,2},
};
int g_F3F2Mul[6][6]={
{0,0,0,0,0,0},
{0,1,0,1,0,1},
{0,0,2,2,4,4},
{0,1,2,3,4,5},
{0,0,4,4,2,2},
{0,1,4,5,2,3},
};
int g_C8Mul[8][8]={
{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}
};
int g_C8Mul_2[8][8]={
{0,1,2,3,4,5,6,7},
{1,2,3,4,5,6,7,0},
{2,3,4,5,6,7,0,1},
{3,4,5,6,7,0,1,2},
{4,5,6,7,0,1,2,3},
{5,6,7,0,1,2,3,4},
{6,7,0,1,2,3,4,5},
{7,0,1,2,3,4,5,6}
};
//int* g_C8Add=&g_C8Mul[0][0];//Error,與乘法表g_Z8Mul不相容
int* g_C8Add=&g_C8Mul_2[0][0];
// 環R8_3的結構不變量n0,bA,bO,n1,n2,n4,n5,n6,n7,n8=8,1,1,4,2,1,3,20,3,8,[ 1, 2, 4, 8 ],[ 1, 2, 4, 4, 8, 8, 8, 8 ]
// R8_3:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4],8,1,1,4,2,1,3,20,3,8,[1,1,2,4],[[2,8,4],[4,4,4],[4,8,8],[8,2,4],[8,4,8],[8,8,16]]
int g_Z8Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,2,3,4,5,6,7},
{0,2,4,6,0,2,4,6},
{0,3,6,1,4,7,2,5},
{0,4,0,4,0,4,0,4},
{0,5,2,7,4,1,6,3},
{0,6,4,2,0,6,4,2},
{0,7,6,5,4,3,2,1}
};
// 環R8_2的結構不變量n0,bA,bO,n1,n2,n4,n5,n6,n7,n8=8,1,0,8,1,3,3,32,7,8,[ 1, 2, 4, 8 ],[ 1, 2, 4, 4, 8, 8, 8, 8 ]
// R8_2:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4],8,1,0,8,1,3,3,32,7,8,[1,1,2,4],[[4,8,8],[8,4,8],[8,8,16]]
int g_C8R2Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,2,4,6,0,2,4,6},
{0,4,0,4,0,4,0,4},
{0,6,4,2,0,6,4,2},
{0,0,0,0,0,0,0,0},
{0,2,4,6,0,2,4,6},
{0,4,0,4,0,4,0,4},
{0,6,4,2,0,6,4,2}
};
// 環R8_4的結構不變量n0,bA,bO,n1,n2,n4,n5,n6,n7,n8=8,1,0,8,1,3,7,48,7,8,[ 1, 2, 4, 8 ],[ 1, 2, 4, 4, 8, 8, 8, 8 ]
// R8_4:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,4],8,1,0,8,1,3,7,48,7,8,[1,1,2,4],[[8,8,16]]
int g_C8R4Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,4,0,4,0,4,0,4},
{0,0,0,0,0,0,0,0},
{0,4,0,4,0,4,0,4},
{0,0,0,0,0,0,0,0},
{0,4,0,4,0,4,0,4},
{0,0,0,0,0,0,0,0},
{0,4,0,4,0,4,0,4},
};
//C_4×C_2——>Z/4Z×F_2
//加法表數據有誤
int g_Z4F2Add[8][8]={
{0,1,2,3,4,5,6,7},
{1,0,3,2,5,4,7,6},
{2,3,4,5,6,7,0,1},
{3,2,5,4,7,6,1,0},
{4,5,6,7,2,3,0,1},
{5,4,7,6,3,2,1,0},
{6,7,0,1,2,3,4,5},
{7,6,1,0,3,2,5,4},
};
int g_C2C4Mul[8][8]={
{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}
};
int g_C2C4Mul_2[8][8]={
{0,1,2,3,4,5,6,7},
{1,4,7,2,5,0,3,6},
{2,7,4,1,6,3,0,5},
{3,2,1,0,7,6,5,4},
{4,5,6,7,0,1,2,3},
{5,0,3,6,1,4,7,2},
{6,3,0,5,2,7,4,1},
{7,6,5,4,3,2,1,0}
};
//int* g_C2C4Add=&g_C2C4Mul[0][0];//Error,與乘法表g_Z4F2Mul不相容
int* g_C2C4Add=&g_C2C4Mul_2[0][0];
// 環R8_14的結構不變量n0,bA,bO,n1,n2,n4,n5,n6,n7,n8=4,1,1,6,4,1,1,24,5,8,[ 1, 2, 2, 4, 4, 8 ],[ 1, 2, 2, 4, 4, 4, 4, 4 ]
// R8_14:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,4,0],4,1,1,6,4,1,1,24,5,8,[1,2,5,0],[[2,2,8],[2,4,10],[4,2,10],[4,4,12]]
int g_Z4F2Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,0,1,0,1,0,1},
{0,0,2,2,4,4,6,6},
{0,1,2,3,4,5,6,7},
{0,0,4,4,0,0,4,4},
{0,1,4,5,0,1,4,5},
{0,0,6,6,4,4,2,2},
{0,1,6,7,4,5,2,3},
};
// C_2×C_2×C_2——>邢丹丹論文中的8階環R_1
//加法表數據有誤
int g_R8_C2C2C2_28_R1_Add[8][8]={
{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,0,1,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}
};
// 乘法表數據有誤
int g_R8_C2C2C2_28_1Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,1},
{0,0,2,2,0,0,2,2},
{0,0,2,3,0,1,2,3},
{0,0,0,0,4,4,4,4},
{0,1,0,1,4,5,4,5},
{0,0,2,2,4,4,6,6},
{0,1,2,3,4,5,6,7}
};
//R={{{a,0,0},{b,a,0},{c,0,a}}|a,b,c∈Z/2Z}<=M_3(Z/2Z)是8階交換幺環
//環R8_45的結構不變量n0,bA,bO,n1,n2,n4,n5,n6,n7,n8=2,1,1,4,2,3,3,24,3,8,[ 1, 2, 2, 2, 4, 8 ],[ 1, 2, 2, 2, 2, 4, 4, 4 ]
//R8_45:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,4,2,3,3,24,3,8,[1,4,3,0],[[2,2,40]]
int g_R8_C2C2C2_28_R1_Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,2,3,4,5,6,7},
{0,2,0,2,0,2,0,2},
{0,3,2,1,4,7,6,5},
{0,4,0,4,0,4,0,4},
{0,5,2,7,4,1,6,3},
{0,6,0,6,0,6,0,6},
{0,7,2,5,4,3,6,1}
};
int g_R8_C2C2C2_28_2Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,2,3,4,5,6,7},
{0,2,0,2,0,2,0,2},
{0,3,2,1,4,7,6,5},
{0,4,0,4,0,4,0,4},
{0,5,2,7,4,1,6,5},
{0,6,0,6,0,6,0,6},
{0,7,2,5,4,5,6,1}
};
int g_C2C2C2Mul[8][8]={
{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}
};
int* g_C2C2C2Add=&g_C2C2C2Mul[0][0];
// C_2×C_2×C_2——>邢丹丹論文中的8階環R_3
// 乘法表數據有誤
int g_R8_C2C2C2_28_R3_Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,2,3,4,5,6,7},
{0,2,0,2,0,2,0,2},
{0,3,2,1,4,7,6,5},
{0,4,0,4,3,7,3,7},//這一行後4個元素變了
{0,5,2,7,7,2,5,0},//這一行後4個元素變了
{0,6,0,6,3,5,3,5},//這一行後4個元素變了
{0,7,2,5,7,0,5,2}//這一行後4個元素變了
};
// C_2×C_2×C_2——>邢丹丹論文中的8階環R_2
// 乘法表數據有誤
int g_R8_C2C2C2_28_R2_Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,2,3,4,5,6,7},
{0,2,0,2,0,2,0,2},
{0,3,2,1,4,7,6,5},
{0,4,0,4,2,6,2,6},//這一行後4個元素變了
{0,5,2,7,6,3,4,1},//這一行後4個元素變了
{0,6,0,6,2,4,2,4},//這一行後4個元素變了
{0,7,2,5,4,1,4,3}//這一行後3個元素變了
};
//環R8_49的結構不變量n0,bA,bO,n1,n2,n4,n5,n6,n7,n8=2,0,1,6,6,1,1,26,5,2,[ 1, 2, 4, 4, 8 ],[ 1, 2, 2, 2, 2, 2, 2, 4 ]
//R8_49:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,0,1,6,6,1,1,26,5,2,[1,6,1,0],[[2,2,38]]
int g_R8_C2C2C2_28_3Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,0,1,4,5,4,5},
{0,0,2,2,0,0,2,2},
{0,1,2,3,4,5,6,7},
{0,0,4,4,0,0,4,4},
{0,1,4,5,4,5,0,1},
{0,0,6,6,0,0,6,6},
{0,1,6,7,4,5,2,3},
};
//C_2×C_2×C_2——>F_4×F_2
//R8_51:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,5,4,0,0,21,4,8,[1,3,2,2],[[2,2,43]]
int g_F4F2Add[8][8]={
{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},
};
int g_F4F2Mul[8][8]={
{0,0,0,0,0,0,0,0},
{0,1,0,1,0,1,0,1},
{0,0,2,2,4,4,6,6},
{0,1,2,3,4,5,6,7},
{0,0,4,4,6,6,2,2},
{0,1,4,5,6,7,2,3},
{0,0,6,6,2,2,4,4},
{0,1,6,7,2,3,4,5},
};
//R8_52:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,7,0,0],2,1,1,1,2,0,0,15,0,8,[1,1,0,6],[[2,2,49]]
int g_F8Add[8][8]={
{0, 1, 2, 3, 4, 5, 6, 7},
{1, 0, 4, 7, 2, 6, 5, 3},
{2, 4, 0, 5, 1, 3, 7, 6},
{3, 7, 5, 0, 6, 2, 4, 1},
{4, 2, 1, 6, 0, 7, 3, 5},
{5, 6, 3, 2, 7, 0, 1, 4},
{6, 5, 7, 4, 3, 1, 0, 2},
{7, 3, 6, 1, 5, 4, 2, 0}
};
int g_F8Mul[8][8]={
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 2, 3, 4, 5, 6, 7},
{0, 2, 3, 4, 5, 6, 7, 1},
{0, 3, 4, 5, 6, 7, 1, 2},
{0, 4, 5, 6, 7, 1, 2, 3},
{0, 5, 6, 7, 1, 2, 3, 4},
{0, 6, 7, 1, 2, 3, 4, 5},
{0, 7, 1, 2, 3, 4, 5, 6}
};
// 直接從凱萊表構造一個有限環
struct FiniteRing:public IRing
{
public:
// 靜態函數
public:
// 實現抽象基類的方法
virtual void printTable();
virtual int add(int a,int b);
virtual int mul(int a,int b);
virtual int size();
// 構造函數
FiniteRing(int n,int* a,int* m,int delt);
// 成員變量
int m_n;
int* m_Add;
int* m_Mul;
int m_delt;
};
void FiniteRing::printTable()
{
int ID=IdRing(this);
string str=calcRingInvariant(this);
printf("R%d_%d:N0n0bAbOn1n2n4n5n6n7n8S1N2=%s\n",size(),ID,str.c_str());
//printRing(this);
}
int FiniteRing::add(int a,int b)
{
int c=*(m_Add+a*m_n+b);
return c-m_delt;
}
int FiniteRing::mul(int a,int b)
{
int c=*(m_Mul+a*m_n+b);
return c-m_delt;
}
int FiniteRing::size()
{
return m_n;
}
FiniteRing::FiniteRing(int n,int* a,int* m,int delt)
{
m_n=n;
m_Add=a;
m_Mul=m;
m_delt=delt;
}
int main()
{
int *R8Add[]={&g_M2Add[0][0],&g_F2Add[0][0],&g_M3Add[0][0],&g_F3Add[0][0],&g_M3M2_M6Add[0][0],&g_F3M2_R2Add[0][0],&g_F3M2Add[0][0],&g_F3F2Add[0][0],g_C8Add,g_C8Add,g_C8Add,g_C2C4Add,&g_F4F2Add[0][0],&g_F4F2Add[0][0],&g_F4F2Add[0][0],&g_F4F2Add[0][0],&g_F8Add[0][0]};
int *R8Mul[]={&g_M2Mul[0][0],&g_F2Mul[0][0],&g_M3Mul[0][0],&g_F3Mul[0][0],&g_M3M2_M6Mul[0][0],&g_F3M2_R2Mul[0][0],&g_F3M2Mul[0][0],&g_F3F2Mul[0][0],&g_C8R2Mul[0][0],&g_Z8Mul[0][0],&g_C8R4Mul[0][0],&g_Z4F2Mul[0][0],&g_R8_C2C2C2_28_R1_Mul[0][0],&g_R8_C2C2C2_28_2Mul[0][0],&g_R8_C2C2C2_28_3Mul[0][0],&g_F4F2Mul[0][0],&g_F8Mul[0][0]};
int nArr[]={2,2,3,3,6,6,6,6,8,8,8,8,8,8,8,8,8};
int nDelt[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int nNum=sizeof(nArr)/sizeof(nArr[0]);
for(int i=0;i<nNum;i++)
{
FiniteRing fr(nArr[i],R8Add[i],R8Mul[i],nDelt[i]);
fr.printTable();
}
//system("pause");
return 0;
}