問題:
尋找新的環的結構不變量,區分R8_8、R8_9、R8_10這3個8階環。
{8,8,"4,0,0,8,1,5,7,48,7","R8_8"}, \
{8,9,"4,0,0,8,1,5,7,48,7","R8_9"}, \
{8,10,"4,0,0,8,1,5,7,48,7","R8_10"}, \
{8,24,"4,1,0,8,1,3,3,32,7","R8_24"}, \
已有的環的結構不變量:I,n0,bA,bO,n1,n2,n4,n5,n6,n7,n8
理想階的分佈I
特徵n0
是否交換bA
是否有幺元bO
不可逆元個數n1
冪等元個數n2
2次冪零元個數n4
2~3次冪零元個數n5
零乘個數n6
零因子個數n7
中心大小n8
其中除I、n0外,其他不變量僅與乘法結構有關。
// 二維數組(A,M)是環的凱萊表的充要條件
bool IsRing(int *A,int *M,int N,int delt=1)
{
//Ⅰ加法的規律:<R,+>是交換羣。
if(IsAbelianGroup(A,N,delt)!=0)
return false;
vector<vector<int> > vvA=Arr2ToVec2(A,N,delt);
vector<vector<int> > vvM=Arr2ToVec2(M,N,delt);
//零元
for(int i=0;i<N;i++)
{
if(vvM[0][i]!=1||(vvM[i][0]!=1))
return false;
}
//Ⅱ乘法滿足結合律:<R ,·>是半羣。
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
for(int k=0;k<N;k++)
{
int ij=vvM[i][j]-1;
int ij_k=vvM[ij][k]-1;
int jk=vvM[j][k]-1;
int i_jk=vvM[i][jk]-1;
if(ij_k!=i_jk)
return false;
}
}
}
//Ⅲ分配律:乘運算對加運算可分配,即a·(b+c)=ab+ac,(a+b)·c=ac+bc。
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
for(int k=0;k<N;k++)
{
int JK=vvA[j][k]-1;
int I_JK=vvM[i][JK]-1;
int IJ=vvM[i][j]-1;
int IK=vvM[i][k]-1;
int IJ_IK=vvA[IJ][IK]-1;
if(I_JK!=IJ_IK)
return false;
int ij=vvA[i][j]-1;
int ij_k=vvM[ij][k]-1;
int ik=vvM[i][k]-1;
int jk=vvM[j][k]-1;
int ik_jk=vvA[ik][jk]-1;
if(ij_k!=ik_jk)
return false;
}
}
}
return true;
}
R8_1:2有零因子交換無幺環,1,0,8,1,7,7,64,7,8
R8_2:2有零因子交換無幺環,1,0,8,1,3,3,32,7,8
R8_3:1有零因子交換幺環,1,1,4,2,1,3,20,3,8
R8_4:2有零因子交換無幺環,1,0,8,1,3,7,48,7,8
// 環的結構不變量bA,bO,n1,n2,n4,n5,n6,n7,n8
std::string calRInfo(const vector<vector<int> > &vvA1)
{
// 分析乘法結構
bool bA=IsAbelian(vvA1);
int bO=One(vvA1)>-1;
int n1=NoInvNum(vvA1);
int n2=IdempotentNum(vvA1);
int n4=Nil2Num(vvA1);
int n5=Nil3Num(vvA1);
int n6=ZeroNum(vvA1);
int n7=ZeroFactorNum(vvA1);
vector<int> ZA=CenterOfG(vvA1);
int n8=ZA.size();
char szInfo[100]={0};
sprintf(szInfo,"%d,%d,%d,%d,%d,%d,%d,%d,%d",bA,bO,n1,n2,n4,n5,n6,n7,n8);
return szInfo;
}
int *Arr[]={&g_Z8Add[0][0],&g_Z8Add[0][0],&g_Z8Add[0][0],&g_Z8Add[0][0]};
int *Mrr[]={&g_M8Mul[0][0],&g_R8_2Mul[0][0],&g_Z8Mul[0][0],&g_R8_4Mul[0][0]};
int n=sizeof(Arr)/sizeof(Arr[0]);
for(int i=0;i<n;i++)
{
int *A=Arr[i];
int N=8;
int *M=Mrr[i];
int iRet=IsField(A,M,N,1);
const char *szInfo=IsFieldRetInfo(iRet);
char sz1[20]={0};
int iRet1=IsBooleanRing(A,M,N,1);
if(iRet1==0)
strcpy(sz1,",布爾環");
string str;
if(iRet>-1)
{
vector<vector<int> > vvM=Arr2ToVec2(M,N,1);
str=calRInfo(vvM).insert(0,",");
}
printf("R8_%d:%s%s%s\n",i+1,szInfo,sz1,str.c_str());
}
system("pause");
return 0;
R4_1:2有零因子交換無幺環
R4_2:2有零因子交換無幺環
R4_3:1有零因子交換幺環
R4_4:2有零因子交換無幺環
R4_5:2有零因子交換無幺環
R4_6:2有零因子交換無幺環
R4_7:4有零因子非交換無幺環
R4_8:4有零因子非交換無幺環
R4_9:1有零因子交換幺環
R4_10:1有零因子交換幺環,布爾環
R4_11:0域
int *Arr[11]={&g_Z4Add[0][0],&g_Z4Add[0][0],&g_Z4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0],&g_F4Add[0][0]};
int *Mrr[11]={&g_M4Mul[0][0],&g_R4_2Mul[0][0],&g_Z4Mul[0][0],&g_R4_4Mul[0][0],&g_R4_5Mul[0][0],&g_R4_6Mul[0][0],&g_R4_7Mul[0][0],&g_R4_8Mul[0][0],&g_R4_9Mul[0][0],&g_F2F2Mul[0][0],&g_F4Mul[0][0]};
for(int i=0;i<11;i++)
{
int *A=Arr[i];
int N=4;
int *M=Mrr[i];
int iRet=IsField(A,M,N,1);
const char *szInfo=IsFieldRetInfo(iRet);
char sz1[20]={0};
int iRet1=IsBooleanRing(A,M,N,1);
if(iRet1==0)
strcpy(sz1,",布爾環");
printf("R4_%d:%s%s\n",i+1,szInfo,sz1);
}
// 是否交換
bool IsAbelian(const vector<vector<int> > &A)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return false;
int n=AFlag[1];
for (int i=0; i<n; i++)for (int j=0; j<n; j++){if(A[i][j]!=A[j][i])return false;}
return true;
}
//0是交換環
//1是非交換環
//2不是環
int IsAbelianRing(int *A,int *M,int N,int delt=1)
{
if(!IsRing(A,M,N,delt))
return 2;
vector<vector<int> > vvM=Arr2ToVec2(M,N,delt);
//乘法交換性
bool bRet=IsAbelian(vvM);
return bRet?0:1;
}
// 是否爲幺元
bool IsOne(const vector<vector<int> > &A,int i3)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return false;
int n=AFlag[1];
if(i3<0||i3>=n)
return false;
for (int i=0; i<n; i++)
{
if(A[i3][i]!=i+1 || A[i][i3]!=i+1)
return false;
}
return true;
}
// 是否有幺元,-1表示沒有
int One(const vector<vector<int> > &A)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return false;
int n=AFlag[1];
for (int i3=0; i3<n; i3++){if(IsOne(A,i3))return i3+1;}
return -1;
}
//0是幺環
//1是無幺環
//2不是環
int IsUnitaryRing(int *A,int *M,int N,int delt=1)
{
if(!IsRing(A,M,N,delt))
return 2;
vector<vector<int> > vvM=Arr2ToVec2(M,N,delt);
int bO=One(vvM);
return bO>-1?0:1;
}
// 是否有可逆元,-1表示沒有
int Inv(const vector<vector<int> > &A,int i1,int iOne)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return false;
int n=AFlag[1];
for (int i=0; i<n; i++){if(A[i1][i]==iOne && A[i][i1]==iOne)return i+1;}
return -1;
}
// 不可逆元個數n1
int NoInvNum(const vector<vector<int> > &A)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return -1;
int n=AFlag[1];
int iRet=0;
int iOne=One(A);
if(iOne==-1)
return n;
for(int i1=0;i1<n;i1++){if(Inv(A,i1,iOne)==-1)iRet++;}
return iRet;
}
/*
注意:在現有的代數公理化定義和定理體系中,不存在一個完美的有利無弊的整環定義標準,採用任何定義標準都會使某些重要定理的表述乾淨利索,但會使另外一些重要定理的表述不夠乾淨利索。
例如:本人約定1階環{0}是整環(交換無零因子幺環)但不是除環不是域(空集不可以強抽象爲0階羣),這樣約定可與1不是素數的約定相一致(Z_1不是域),但定理“有限整環必是域”的表述就要改爲“階大於1的有限整環必是域”。
有限環若有非零元素不是零因子,則必有單位元,且每個非零又非零因子的元素都是可逆元。即有限無零因子環<=>有限無零因子幺環。
但對一般環,無零因子環<=>無零因子幺環不成立,存在無零因子無幺環,例如2Z,它是一個無限循環的無零因子無幺環。
所以整環的4個定義互不等價,2Z在定義1和定義2下是整環,而在定義3和定義4下不是整環。
注意:素理想是在交換環內定義的[還是在交換幺環內定義的?
按:
1.多數的書都是在交換環中定義素理想,但1949年數學家尼爾·麥科伊(Neal H. McCoy)推廣爲在任意環(不一定可換)中定義素理想。
2.整環的定義在不同的書中也常有差異,大致有以下4種定義方法:
定義1 :無零因子的交換環稱爲整環。
定義2:階大於1且無零因子的交換環,稱爲整環。
定義3(本人採用):有單位元且無零因子的交換環,稱爲整環。
定義4:階大於1、有單位元且無零因子的交換環,稱爲整環。
以上4種定義中,要求整環無零因子、交換是共同的,區別就在於是否要求有單位元和階大於1。
本人採用定義3。
3.在無幺環中,極大理想不一定是素理想。
如偶數環2Z中的<4>是極大理想且不是素理想。],但極大理想並無這種限制。
*/
//0是域(無零因子交換幺環)
//1是有零因子交換幺環
//2是有零因子交換無幺環
//3是有零因子非交換幺環
//4是有零因子非交換無幺環,(不存在有限無零因子無幺環)
//-1不是環
int IsField(int *A,int *M,int N,int delt=1)
{
int iA=IsAbelianRing(A,M,N,delt);
if(iA==2)
return -1;
int iO=IsUnitaryRing(A,M,N,delt);
vector<vector<int> > vvM=Arr2ToVec2(M,N,delt);
int n1=NoInvNum(vvM);
if(iA==0 && iO==0)
{
if(n1==1)
return 0;
return 1;
}
if(iA==0 && iO==1)
{
return 2;
}
if(iA==1 && iO==0)
{
return 3;
}
return 4;
}
const char *IsFieldRetInfo(int iRet)
{
const char *szInfo[]={"0域","1有零因子交換幺環","2有零因子交換無幺環","3有零因子非交換幺環","4有零因子非交換無幺環"};
if(iRet==-1)
return "-1不是環";
return szInfo[iRet];
}
// 是否爲冪等元
bool IsIdempotent(const vector<vector<int> > &A,int i2){
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return false;
int n=AFlag[1];
if(i2<0||i2>=n)
return false;
if(A[i2][i2]==i2+1)
return true;
return false;
}
// 冪等元個數n2
int IdempotentNum(const vector<vector<int> > &A)
{
vector<int> AFlag=IsLegalMtx(A);
if(AFlag[0]==-1)
return -1;
int n=AFlag[1];
int iRet=0;
for(int i2=0;i2<n;i2++){if(IsIdempotent(A,i2))iRet++;}
return iRet;
}
/*布爾環是交換幺環,其中每個元都是冪等的。*/
//0是布爾環
//1是環但不是布爾環
//2不是環
int IsBooleanRing(int *A,int *M,int N,int delt=1)
{
if(!IsRing(A,M,N,delt))
return 2;
vector<vector<int> > vvM=Arr2ToVec2(M,N,delt);
//是否布爾環b2
int n2=IdempotentNum(vvM);
return n2==N?0:1;
}
int g_F4Add[4][4]={
{0,1,2,3},
{1,0,3,2},
{2,3,0,1},
{3,2,1,0}
};
int g_F4Mul[4][4]={
{0,0,0,0},
{0,1,2,3},
{0,2,3,1},
{0,3,1,2}
};
int g_F4Mul2[4][4]={//GAP4中F4的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,3,1,2},
{0,1,2,3},
{0,2,3,1}
};
int g_F2F2Mul[4][4]={//F_2×F_2的乘法表,0,1,v,1+v對應0,1,2,3
{0,0,0,0},
{0,1,2,3},
{0,2,2,0},
{0,3,0,3}
};
int g_R4_9Mul[4][4]={//GAP4中R4_9=F_2[x]/(x^2)的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,2,1,3},
{0,1,2,3},
{0,3,3,0}
};
int g_R4_8Mul[4][4]={//GAP4中R4_8的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,0,1,1},
{0,0,2,2},
{0,0,3,3}
};
int g_R4_7Mul[4][4]={//GAP4中R4_7的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,0,0,0},
{0,1,2,3},
{0,1,2,3}
};
int g_R4_6Mul[4][4]={//GAP4中M_2×F_2的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,0,0,0},
{0,0,2,2},
{0,0,2,2}
};
int g_R4_5Mul[4][4]={//GAP4中R4_5的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,0,0,0},
{0,0,1,1},
{0,0,1,1}
};
int g_R4_4Mul[4][4]={//GAP4中M_2×M_2的乘法表,0*a b a a+b對應0 1 2 3
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
};
int g_Z4Add[4][4]={//GAP4中Z/4Z的加法表,0*a a 2*a -a對應0 1 2 3
{0,1,2,3},
{1,2,3,0},
{2,3,0,1},
{3,0,1,2}
};
int g_Z4Mul[4][4]={//GAP4中Z/4Z的乘法表,0*a a 2*a -a對應0 1 2 3
{0,0,0,0},
{0,1,2,3},
{0,2,0,2},
{0,3,2,1}
};
int g_R4_2Mul[4][4]={//GAP4中R4_2的乘法表,0*a a 2*a -a對應0 1 2 3
{0,0,0,0},
{0,2,0,2},
{0,0,0,0},
{0,2,0,2}
};
int g_M4Mul[4][4]={//GAP4中M_4的乘法表,0*a a 2*a -a對應0 1 2 3
{0,0,0,0},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
};
int g_Z8Add[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_M8Mul[8][8]={
{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,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}
};
// Z_16的一個8階子環R8_2={[0],[2],[4],[6],[8],[10],[12],[14]},運算爲模16加與模16乘
int g_R8_2Mul[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}
};
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}
};
// Z_32的一個8階子環R8_4={[0],[4],[8],[12],[16],[20],[24],[28]},運算爲模32加與模32乘
int g_R8_4Mul[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}
};
int g_Z16Add[]={
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,
3,4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,
4,5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,
5,6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,
6,7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,
7,8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,
8,9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,
9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,
10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,
11,12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,
12,13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,
13,14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,
14,15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,
15,16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
16,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
};
int g_Z16Mul[]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15,
1,4,7,10,13,16,3,6,9,12,15,2,5,8,11,14,
1,5,9,13,1,5,9,13,1,5,9,13,1,5,9,13,
1,6,11,16,5,10,15,4,9,14,3,8,13,2,7,12,
1,7,13,3,9,15,5,11,1,7,13,3,9,15,5,11,
1,8,15,6,13,4,11,2,9,16,7,14,5,12,3,10,
1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,
1,10,3,12,5,14,7,16,9,2,11,4,13,6,15,8,
1,11,5,15,9,3,13,7,1,11,5,15,9,3,13,7,
1,12,7,2,13,8,3,14,9,4,15,10,5,16,11,6,
1,13,9,5,1,13,9,5,1,13,9,5,1,13,9,5,
1,14,11,8,5,2,15,12,9,6,3,16,13,10,7,4,
1,15,13,11,9,7,5,3,1,15,13,11,9,7,5,3,
1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2
};
int g_F2F2F2F2Add[]={
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
2,1,4,3,6,5,8,7,10,9,12,11,14,13,16,15,
3,4,1,2,7,8,5,6,11,12,9,10,15,16,13,14,
4,3,2,1,8,7,6,5,12,11,10,9,16,15,14,13,
5,6,7,8,1,2,3,4,13,14,15,16,9,10,11,12,
6,5,8,7,2,1,4,3,14,13,16,15,10,9,12,11,
7,8,5,6,3,4,1,2,15,16,13,14,11,12,9,10,
8,7,6,5,4,3,2,1,16,15,14,13,12,11,10,9,
9,10,11,12,13,14,15,16,1,2,3,4,5,6,7,8,
10,9,12,11,14,13,16,15,2,1,4,3,6,5,8,7,
11,12,9,10,15,16,13,14,3,4,1,2,7,8,5,6,
12,11,10,9,16,15,14,13,4,3,2,1,8,7,6,5,
13,14,15,16,9,10,11,12,5,6,7,8,1,2,3,4,
14,13,16,15,10,9,12,11,6,5,8,7,2,1,4,3,
15,16,13,14,11,12,9,10,7,8,5,6,3,4,1,2,
16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1
};
int g_F2F2F2F2Mul[]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,
1,1,3,3,1,1,3,3,1,1,3,3,1,1,3,3,
1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
1,1,1,1,5,5,5,5,1,1,1,1,5,5,5,5,
1,2,1,2,5,6,5,6,1,2,1,2,5,6,5,6,
1,1,3,3,5,5,7,7,1,1,3,3,5,5,7,7,
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,
1,2,1,2,1,2,1,2,9,10,9,10,9,10,9,10,
1,1,3,3,1,1,3,3,9,9,11,11,9,9,11,11,
1,2,3,4,1,2,3,4,9,10,11,12,9,10,11,12,
1,1,1,1,5,5,5,5,9,9,9,9,13,13,13,13,
1,2,1,2,5,6,5,6,9,10,9,10,13,14,13,14,
1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
};
int g_F2F2F4Mul[]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,
1,4,2,3,1,4,2,3,1,4,2,3,1,4,2,3,
1,1,1,1,5,5,5,5,1,1,1,1,5,5,5,5,
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
1,3,4,2,5,7,8,6,1,3,4,2,5,7,8,6,
1,4,2,3,5,8,6,7,1,4,2,3,5,8,6,7,
1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,
1,2,3,4,1,2,3,4,9,10,11,12,9,10,11,12,
1,3,4,2,1,3,4,2,9,11,12,10,9,11,12,10,
1,4,2,3,1,4,2,3,9,12,10,11,9,12,10,11,
1,1,1,1,5,5,5,5,9,9,9,9,13,13,13,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,3,4,2,5,7,8,6,9,11,12,10,13,15,16,14,
1,4,2,3,5,8,6,7,9,12,10,11,13,16,14,15
};
int g_F2F8Mul[]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,
1,3,5,7,6,8,2,4,1,3,5,7,6,8,2,4,
1,4,7,6,2,3,8,5,1,4,7,6,2,3,8,5,
1,5,6,2,8,4,3,7,1,5,6,2,8,4,3,7,
1,6,8,3,4,7,5,2,1,6,8,3,4,7,5,2,
1,7,2,8,3,5,4,6,1,7,2,8,3,5,4,6,
1,8,4,5,7,2,6,3,1,8,4,5,7,2,6,3,
1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,3,5,7,6,8,2,4,9,11,13,15,14,16,10,12,
1,4,7,6,2,3,8,5,9,12,15,14,10,11,16,13,
1,5,6,2,8,4,3,7,9,13,14,10,16,12,11,15,
1,6,8,3,4,7,5,2,9,14,16,11,12,15,13,10,
1,7,2,8,3,5,4,6,9,15,10,16,11,13,12,14,
1,8,4,5,7,2,6,3,9,16,12,13,15,10,14,11
};
int g_F4F4Mul[]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,
1,3,4,2,1,3,4,2,1,3,4,2,1,3,4,2,
1,4,2,3,1,4,2,3,1,4,2,3,1,4,2,3,
1,1,1,1,5,5,5,5,9,9,9,9,13,13,13,13,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,3,4,2,5,7,8,6,9,11,12,10,13,15,16,14,
1,4,2,3,5,8,6,7,9,12,10,11,13,16,14,15,
1,1,1,1,9,9,9,9,13,13,13,13,5,5,5,5,
1,2,3,4,9,10,11,12,13,14,15,16,5,6,7,8,
1,3,4,2,9,11,12,10,13,15,16,14,5,7,8,6,
1,4,2,3,9,12,10,11,13,16,14,15,5,8,6,7,
1,1,1,1,13,13,13,13,5,5,5,5,9,9,9,9,
1,2,3,4,13,14,15,16,5,6,7,8,9,10,11,12,
1,3,4,2,13,15,16,14,5,7,8,6,9,11,12,10,
1,4,2,3,13,16,14,15,5,8,6,7,9,12,10,11
};
int,g_F16Mul[]={
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
1,3,5,7,9,11,13,15,16,14,12,10,8,6,4,2,
1,4,7,6,13,16,11,10,8,5,2,3,12,9,14,15,
1,5,9,13,16,12,8,4,2,6,10,14,15,11,7,3,
1,6,11,16,12,15,2,5,10,13,4,7,3,8,9,14,
1,7,13,11,8,2,12,14,15,9,3,5,10,16,6,4,
1,8,15,10,4,5,14,11,7,2,9,16,6,3,12,13,
1,9,16,8,2,10,15,7,3,11,14,6,4,12,13,5,
1,10,14,5,6,13,9,2,11,4,8,15,16,7,3,12,
1,11,12,2,10,4,3,9,14,8,7,13,5,15,16,6,
1,12,10,3,14,7,5,16,6,15,13,8,9,4,2,11,
1,13,8,12,15,3,10,6,4,16,5,9,14,2,11,7,
1,14,6,9,11,8,16,3,12,7,15,4,2,13,5,10,
1,15,4,14,7,9,6,12,13,3,16,2,11,5,10,8,
1,16,2,15,3,14,4,13,5,12,6,11,7,10,8,9
};
{
int *A=g_Z16Add;
int N=sqrt(sizeof(g_Z16Add)/sizeof(g_Z16Add[0]));
int *M=g_Z16Mul;
bool bRet=IsRing(A,M,N,0);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=g_F2F2F2F2Add;
int N=sqrt(sizeof(g_F2F2F2F2Add)/sizeof(g_F2F2F2F2Add[0]));
int *M=g_F2F2F2F2Mul;
bool bRet=IsRing(A,M,N,0);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=g_F2F2F2F2Add;
int N=sqrt(sizeof(g_F2F2F2F2Add)/sizeof(g_F2F2F2F2Add[0]));
int *M=g_F2F2F4Mul;
bool bRet=IsRing(A,M,N,0);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=g_F2F2F2F2Add;
int N=sqrt(sizeof(g_F2F2F2F2Add)/sizeof(g_F2F2F2F2Add[0]));
int *M=g_F2F8Mul;
bool bRet=IsRing(A,M,N,0);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=g_F2F2F2F2Add;
int N=sqrt(sizeof(g_F2F2F2F2Add)/sizeof(g_F2F2F2F2Add[0]));
int *M=g_F4F4Mul;
bool bRet=IsRing(A,M,N,0);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=g_F2F2F2F2Add;
int N=sqrt(sizeof(g_F2F2F2F2Add)/sizeof(g_F2F2F2F2Add[0]));
int *M=g_F16Mul;
bool bRet=IsRing(A,M,N,0);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=&g_F4Add[0][0];
int N=sizeof(g_F4Add)/sizeof(g_F4Add[0]);
int *M=&g_F4Mul[0][0];
bool bRet=IsRing(A,M,N);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=&g_F4Add[0][0];
int N=sizeof(g_F4Add)/sizeof(g_F4Add[0]);
int *M=&g_R4_4Mul[0][0];
bool bRet=IsRing(A,M,N);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}
{
int *A=&g_Z4Add[0][0];
int N=sizeof(g_Z4Add)/sizeof(g_Z4Add[0]);
int *M=&g_Z4Mul[0][0];
bool bRet=IsRing(A,M,N);
MessageBoxA(NULL,bRet?"(A,M)是環!":"(A,M)不是環!","提示",MB_OK);
}