有限環判定算法

問題:
尋找新的環的結構不變量,區分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);
    }

發佈了132 篇原創文章 · 獲贊 10 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章