D:\MathTool\gaptool>Ideal
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]]
IdemN9=[0,1,3,4],[R1_1,R6_4]
冪等元集合不構成環,冪零元集合構成理想
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]]
IdemN9=[0,1],[R4_2,R2_2]
冪等元集合不構成環,冪零元集合構成理想
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]]
IdemN9=[0,1],[R3_1,R3_2]
冪等元集合不構成環,冪零元集合構成理想
R12_5:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2,2,4],12,1,1,8,4,1,1,40,7,12,[1,1,2,2,2,4],[[2,4,2],[2,12,4],[3,3,4],[3,6,4],[3,12,8],[4,2,2],[4,4,
4],[4,6,4],[4,12,8],[6,3,4],[6,4,4],[6,6,4],[6,12,8],[12,2,4],[12,3,8],[12,4,8],[12,6,8],[12,12,16]]
IdemN9=[0,1,4,9],[R2_1,R6_4]
冪等元集合不構成環,冪零元集合構成理想
R24_-1:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,1,2,2,2,4,4,8],24,1,1,16,4,1,3,100,15,24,[1,1,2,2,2,4,4,8],[[2,8,4],[2,24,8],[3,3,4],[3,6,4],[3,12,8],[
3,24,16],[4,4,4],[4,8,8],[4,12,8],[4,24,16],[6,3,4],[6,6,4],[6,8,8],[6,12,8],[6,24,16],[8,2,4],[8,4,8],[8,6,8],[8,8,16],[8,12,16],[8,24,32],
[12,3,8],[12,4,8],[12,6,8],[12,8,16],[12,12,16],[12,24,32],[24,2,8],[24,3,16],[24,4,16],[24,6,16],[24,8,32],[24,12,32],[24,24,64]]
IdemN9=[0,1,9,16],[R4_2,R6_4]
冪等元集合不構成環,冪零元集合構成理想
cnt=64
R8_3/([[4,6],[4,7]],[0,0,1])=R16_16:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,4,8,0],8,1,0,16,1,15,15,160,15,16,[1,3,4,8,0],[[2,8,16],[4,8,16],[8,2,16
],[8,4,16],[8,8,32]]
I1I2=[[1,1,1],[2,1,3],[4,1,4],[8,1,8]],[[2,1,3],[4,1,10],[4,4,3],[8,1,44],[8,5,12]]
IdemN9=[0],[R16_16,R1_1]
冪等元集合構成理想,冪零元集合構成理想
R8_3/([[6,1],[6,3]],[0,0,1])=R16_17:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,4,8,0],8,1,0,16,1,7,7,128,15,16,[1,3,4,0,8],[[2,8,16],[4,8,16],[8,2,16],
[8,4,16],[8,8,64]]
I1I2=[[1,1,1],[2,1,3],[4,1,4]],[[2,1,3],[4,1,10],[4,4,3],[8,5,12]]
IdemN9=[0],[R16_17,R1_1]
冪等元集合構成理想,冪零元集合構成理想
R8_3/([[0,2],[2]],[1,0,1])=R16_118:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,0,16,1,7,15,128,15,16,[1,3,8,4,0],[[4,4,128]]
I1I2=[[1,1,1],[2,1,3],[4,1,4],[4,2,4],[8,23,4]],[[2,1,3],[4,1,10],[4,2,10],[4,4,3],[8,5,12],[8,16,12],[8,23,22]]
IdemN9=[0],[R16_118,R1_1]
冪等元集合構成理想,冪零元集合構成理想
R8_3/([[0,2],[2]],[1,1,1])=R16_119:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,12,0,0],4,1,0,16,1,3,15,112,15,16,[1,3,4,8,0],[[4,4,144]]
I1I2=[[1,1,1],[2,1,3],[4,2,4],[8,23,8]],[[2,1,3],[4,2,10],[4,4,3],[8,16,12],[8,23,44]]
IdemN9=[0],[R16_119,R1_1]
冪等元集合構成理想,冪零元集合構成理想
R8_3/([1,1,1])=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]]
I1I2=[[1,1,1],[2,1,3],[4,2,4],[8,3,4],[8,23,8],[16,7,4],[32,-1,8]],[[2,1,3],[4,2,10],[4,4,3],[8,3,22],[8,16,12],[8,23,44],[16,7,70],[16,119,
48],[32,-1,284]]
IdemN9=[0,8],[R16_119,R4_11]
冪等元集合不構成環,冪零元集合構成理想
R4_7:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,0,0,4,3,1,1,10,1,1,[1,3,0],[[2,2,6]]
[R4Add]
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
[R4Mul]
1 1 1 1
1 2 3 4
1 2 3 4
1 1 1 1
IdemN9=[0,1,2],[R2_1,R2_2]
冪等元集合不構成環,冪零元集合構成理想
R4_8:N0n0bAbOn1n2n4n5n6n7n8S1N2=[1,3,0],2,0,0,4,3,1,1,10,3,1,[1,3,0],[[2,2,6]]
[R4Add]
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
[R4Mul]
1 1 1 1
1 2 2 1
1 3 3 1
1 4 4 1
IdemN9=[0,1,2],[R2_1,R2_2]
冪等元集合不構成環,冪零元集合構成理想
#include"DecompositionRing.h"
//#include"Rn.h"
#include"M2r.h"
#include"Mnr.h"
#include"PolynomialRing.h"
// n2代表冪等元個數
// Idem代表環r的冪等元集合(N2已代表另外一個環不變量)
vector<int> calIdem(IRing* r){
int n=r->size();
vector<int> Idem;
for(int i2=0;i2<n;i2++){
if(IsIdempotent(r,i2))
Idem.push_back(i2);
}
return Idem;
}
// n4,n5代表2次冪零元個數、2~3次冪零元個數
// n9=N9.size()代表冪零元個數
int IsNil(IRing* r,int i){
int n=r->size();
int iRet=i;
if(iRet==0)
return 1;// i=0是環r的1次冪零元
for(int k=0;k<n;k++){// 最多n+1次冪零元
iRet=r->mul(iRet,i);
if(iRet==0)
return k+2;// i是環r的k+2次冪零元
}
return 0;// i不是環r的冪零元
}
// N9代表環r的冪零元集合,處理過的N9代表[IdRing(N9),IdRing(r/N9)]或[IdRing(N9)]
vector<int> calN9(IRing* r){
int n=r->size();
vector<int> N9;
for(int i9=0;i9<n;i9++){
if(IsNil(r,i9)>0)
N9.push_back(i9);
}
return N9;
}
string V2S(vector<int>& v){
string str="[";
int n=v.size();
for(int i=0;i<n;i++)
{
str+=itos(v[i]);
if(i<n-1)
str+=",";
}
str+="]";
return str;
}
bool IsEqual(vector<int>& a,vector<int>& b){
int na=a.size();
int nb=b.size();
if(na!=nb)
return false;
for(int i=0;i<na;i++)
if(a[i]!=b[i])
return false;
return true;
}
// 判斷集合I是否是環r的理想
int IsIdeal(IRing* r,vector<int> &I){
//I是r的子環
Subring s(r,I);
bool bE=IsEqual(I,s.m_Set);
if(!bE){
return 0;// 子環也不是
}
//進一步判斷是否是理想
for(int i=0;i<r->size();i++){//任意純量環元素c
for(int j=0;j<I.size();j++){//任意向量模元素a
int ca=r->mul(i,I[j]);
int ac=r->mul(I[j],i);
vector<int>::iterator p=std::find(I.begin(),I.end(),ca);
if(p==I.end()){
return 2;// 是子環但不是理想
}
vector<int>::iterator p1=std::find(I.begin(),I.end(),ac);
if(p1==I.end()){
return 2;// 是子環但不是理想
}
}
}
return 1;//是理想
}
const char* IsIdealRetInfo(int iret){
const char* sz[]={"不構成環","構成理想","構成非理想子環"};
return sz[iret];
}
// 商環R/I
struct quotientRing:public IRing
{
public:
// 靜態函數
static vector<vector<int> > quotientGN(const vector<vector<int> > &vvG,const vector<int> &vN);
static vector<vector<int> > quotientTable(const vector<vector<int> > &vvG,const vector<vector<int> > &vvH,const vector<int> &vN);
public:
// 實現抽象基類的方法
virtual void printTable();
virtual int add(int a,int b);
virtual int mul(int a,int b);
virtual int size();
// 構造函數
quotientRing();
quotientRing(IRing *r1,vector<int> &I);
// 析構函數
~quotientRing();
// 成員函數
template<class T> vector<vector<int> > getTable(T *obp,int n,int(T::*p)(int,int));
// 成員變量
IRing *m_r1;
vector<int> m_I;
vector<vector<int> > m_Add;
vector<vector<int> > m_Mul;
int m_flag;// quotientRing對象析構時是否釋放m_r1指向的內存
};
quotientRing::quotientRing(){
m_r1=NULL;
m_flag=0;
}
quotientRing::quotientRing(IRing *r1,vector<int> &I)
{
m_r1=r1;
m_I=I;
vector<vector<int> > Add1=getTable(r1,r1->size(),&IRing::add);
vector<vector<int> > H=quotientGN(Add1,I);
m_Add=quotientTable(Add1,H,I);
vector<vector<int> > Mul1=getTable(r1,r1->size(),&IRing::mul);
m_Mul=quotientTable(Mul1,H,I);
}
quotientRing::~quotientRing(){
if(m_flag==1 && m_r1!=NULL){
delete m_r1;
m_r1=NULL;
}
}
template<class T>
vector<vector<int> > quotientRing::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> > quotientRing::quotientGN(const vector<vector<int> > &vvG,const vector<int> &vN)
{
vector<vector<int> > ret;
int G=vvG.size();
int N=vN.size();
for(int i=0;i<G;i++)
{
vector<int> I;
for(int j=0;j<N;j++)
{
int ij=vvG[i][vN[j]];
I.push_back(ij);
}
bool bNew=true;
for(int k=0;k<ret.size();k++)
{
//判斷I中的元素是否在ret中
vector<int>::iterator p;
p=std::find(ret[k].begin(),ret[k].end(),I[0]);
if(p!=ret[k].end())
{
bNew=false;
break;
}
}
if(bNew)
{
ret.push_back(I);
}
}
return ret;
}
vector<vector<int> > quotientRing::quotientTable(const vector<vector<int> > &vvG,const vector<vector<int> > &vvH,const vector<int> &vN)
{
int G=vvG.size();
int H=vvH.size();
vector<vector<int> > ret(H);
for(int i=0;i<H;i++)
{
vector<int> I(H);
for(int j=0;j<H;j++)
{
int ij=vvG[vvH[i][0]][vvH[j][0]];
int IJ=-1;
for(int k=0;k<H;k++)
{
vector<int>::const_iterator p;
p=std::find(vvH[k].begin(),vvH[k].end(),ij);
if(p!=vvH[k].end())
{
IJ=k;
break;
}
}
I[j]=IJ;
}
ret[i]=I;
}
return ret;
}
void quotientRing::printTable()
{
int ID=IdRing(this);
string str=calcRingInvariant(this);
string Idem=V2S(calIdem(this));
string N9=V2S(calN9(this));
printf("R%d_%d:N0n0bAbOn1n2n4n5n6n7n8S1N2IdemN9=%s,%s,%s\n",size(),ID,str.c_str(),Idem.c_str(),N9.c_str());
printRing(this);
}
int quotientRing::add(int a,int b)
{
return m_Add[a][b];
}
int quotientRing::mul(int a,int b)
{
return m_Mul[a][b];
}
int quotientRing::size()
{
return m_Add.size();
}
void print(IRing* zn[],int cnt)
{
for(int i=0;i<cnt;i++)
{
zn[i]->printTable();
vector<int> vIdem=calIdem(zn[i]);
string strIdem=V2S(vIdem);
vector<int> vN9=calN9(zn[i]);
//string strN9=V2S(vN9);
int iret1=IsIdeal(zn[i],vIdem);
int iret2=IsIdeal(zn[i],vN9);
Subring Idem(zn[i],vN9);
//Idem.printTable();
Subring N9(zn[i],vN9);
//N9.printTable();
quotientRing znmodN9(zn[i],vN9);
//znmodN9.printTable();
char szN9[1024]={0};
sprintf(szN9,"[R%d_%d,R%d_%d]",N9.size(),IdRing(&N9),znmodN9.size(),IdRing(&znmodN9));
printf("IdemN9=%s,%s\n",strIdem.c_str(),szN9);
printf("冪等元集合%s,冪零元集合%s\n",IsIdealRetInfo(iret1),IsIdealRetInfo(iret2));
}
}
// 在冪零元定義中,冪零元可以是零元。
// 冪零元一定是零因子(n9<=n7+1),存在不是冪零元的零因子,例如Z/6Z中~2,~3,~4。
// n7(Z/24Z)=24-φ(24)-1=24-8-1=15
// Z/nZ包含冪零元當且僅當n有平方因子。N9(Z/6Z)=[0],N7(Z/6Z)=[2,3,4],N9(Z/8Z)=[0,2,4,6],N9(Z/9Z)=[0,3,6]
// 弱布爾環:環R上的任意一個理想A都有A^2=A,即R上任意理想都爲冪等理想。
// Z/2Z是一個2階的弱布爾環、布爾環。
// 冪零理想環:環R上的任意一個理想A都有A^n=0,即R上任意理想都爲冪零理想。
// R4_2=2Z/8Z=N9(Z/8Z)=[0,2,4,6]是一個4階的冪零元環、冪零理想環。
void test1()
{
ZmodnZ zn[]={ZmodnZ(1,6),ZmodnZ(1,8),ZmodnZ(1,9),ZmodnZ(1,12),ZmodnZ(1,24)};
int cnt=sizeof(zn)/sizeof(zn[0]);
vector<IRing*> v(cnt);
for(int i=0;i<cnt;i++)
{
v[i]=&zn[i];
}
print(&v[0],cnt);
}
void test2()
{
ZmodnZ r4_3(1,4);
ZmodnZ r8_3(1,8);
int f1[] = {1,0,1};
Polynomial vf1(f1,f1+sizeof(f1)/sizeof(f1[0]));
int f2[] = {1,1,1};
Polynomial vf2(f2,f2+sizeof(f2)/sizeof(f2[0]));
int f3[] = {0,0,1};
Polynomial vf3(f3,f3+sizeof(f3)/sizeof(f3[0]));
int f4[] = {0,1,1};
Polynomial vf4(f4,f4+sizeof(f4)/sizeof(f4[0]));
int f5[] = {1,0,0,1};
Polynomial vf5(f5,f5+sizeof(f5)/sizeof(f5[0]));
int f6[] = {1,1,0,1};
Polynomial vf6(f6,f6+sizeof(f6)/sizeof(f6[0]));
int f7[] = {0,1,0,1};
Polynomial vf7(f7,f7+sizeof(f7)/sizeof(f7[0]));
int f8[] = {0,0,1,1};
Polynomial vf8(f8,f8+sizeof(f8)/sizeof(f8[0]));
int f9[] = {1,0,1,1};
Polynomial vf9(f9,f9+sizeof(f9)/sizeof(f9[0]));
int f10[] = {0,1,1,1};
Polynomial vf10(f10,f10+sizeof(f10)/sizeof(f10[0]));
int f11[] = {1,1,1,1};
Polynomial vf11(f11,f11+sizeof(f11)/sizeof(f11[0]));
int f12[] = {0,0,0,1};
Polynomial vf12(f12,f12+sizeof(f12)/sizeof(f12[0]));
int f13[] = {2,1,1};
Polynomial vf13(f13,f3+sizeof(f13)/sizeof(f13[0]));
int f14[] = {0,0,1};
Polynomial vf14(f14,f14+sizeof(f14)/sizeof(f14[0]));
int g1[] = {0,2};
int g2[] = {2};
int g3[] = {4,6};
int g4[] = {4,7};
int g5[] = {6,1};
int g6[] = {6,3};
Polynomial vg1(g1,g1+sizeof(g1)/sizeof(g1[0]));
Polynomial vg2(g2,g2+sizeof(g2)/sizeof(g2[0]));
Polynomial vg3(g3,g3+sizeof(g3)/sizeof(g3[0]));
Polynomial vg4(g4,g4+sizeof(g4)/sizeof(g4[0]));
Polynomial vg5(g5,g5+sizeof(g5)/sizeof(g5[0]));
Polynomial vg6(g6,g6+sizeof(g6)/sizeof(g6[0]));
PolynomialRing r16_118;
r16_118.initFR(&r8_3,vg1,vg2,vf1);
PolynomialRing r64(&r8_3,vf2);
PolynomialRing r16_119;
r16_119.initFR(&r8_3,vg1,vg2,vf2);
PolynomialRing r16_16;
r16_16.initFR(&r8_3,vg3,vg4,vf3);
PolynomialRing r16_17;
r16_17.initFR(&r8_3,vg5,vg6,vf3);
IRing* zn[]={&r16_16,&r16_17,&r16_118,&r16_119,&r64};
int cnt=sizeof(zn)/sizeof(zn[0]);
print(zn,cnt);
}
void test3()
{
M2r r4_7;
r4_7.initG(2);
M2r r4_8;
r4_8.initH(2);
IRing* zn[]={&r4_7,&r4_8};
int cnt=sizeof(zn)/sizeof(zn[0]);
print(zn,cnt);
}
int main()
{
test1();
test2();
test3();
return 0;
}