中国矿业大学(北京)实验报告第1页,共4页课程名称:离散数学课程设计指导教师:班级:信软2014-2姓名:学号:实验项目名称:若干代数系统的计算机判断--群的判定实验目的及要求:【实验目的】掌握群的判定方法。【实验内容】输入代数系统(A,*)的集合A和*运算的运算表,判断(A,*)是否是群。实验原理:【实验原理和方法】(1)用一维数组a[n]存贮集合A。(2)用二维数组op[n][n]存贮运算表。(3)根据群的定义,代数系统(A,*)若为群,除运算表已表明运算*封闭外,还应该满足下列三个条件:*运算可结合、有幺元e、A中任何元素都有逆元。*运算可结合:for(i=0;iN;i++)for(j=0;jN;j++)for(k=0;kN;k++){for(l=0;lN;l++){if(op[i][j]==a[l])x=l;/*op[i][j]代表a*b*/if(op[j][k]==a[l])y=l;/*op[j][k]代表b*c*/}if(op[i][y]!=op[x][k])/*op[i][y]代表a*(b*c)*/{printf((%d*%d)*%d=%d,%d*(%d*%d)=%d,运算是不可结合!\n,a[i],a[j],a[k],op[x][k],a[i],a[j],a[k],op[i][y]);flag=0;/*不满足结合性*/}}if(flag)printf(运算是可结合!\n);有幺元e:中国矿业大学(北京)实验报告第2页,共4页flag=0;for(i=0;iN;i++){for(j=0;jN;j++)if(op[i][j]!=a[j]||op[j][i]!=a[j])break;if(j==N){printf(群有幺元%d!\n,a[i]);e=a[i];flag=1;break;}}if(!flag)printf(群没有幺元!\n);A中任何元素都有逆元:flag=1;for(i=0;iN;i++){for(j=0;jN;j++)if(op[i][j]==e&&op[j][i]==e)break;/*e是幺元*/if(j==N){flag=0;printf(A中元素%d没有逆元!\n,a[j]);}}if(flag)printf(A中任何元素都有逆元!\n);实验内容:完整代码:#includestdio.h#includestdlib.h#includemath.h#defineOK1#defineERROR0#defineN2typedefintStatus;typedefintElemType;中国矿业大学(北京)实验报告第3页,共4页ElemTypeVcomplete(ElemTypex,ElemTypey){//群对应的运算returnx*y;}Statusjuzhen(ElemType*a,ElemType***op){//构造op矩阵inti,j;for(i=0;iN;i++)for(j=0;jN;j++){op[i][j]=Vcomplete(a[i],a[j]);}printf(complete:*);returnOK;}Statusjiehe(ElemType**op,ElemType*a){///运算可结合inti,j,k,l,x,y;intflag=0;for(i=0;iN;i++)for(j=0;jN;j++)for(k=0;kN;k++){for(l=0;lN;l++){if(op[i][j]==a[l])x=l;///*op[i][j]代表a*b*////矩阵中的位置,在群中找到相应的元素,保存这个元素位置;if(op[j][k]==a[l])y=l;///*op[j][k]代表b*c*/}if(op[i][y]!=op[x][k])/*op[i][y]代表a*(b*c)*////通过找矩阵中元素的与剩下元素运算在矩阵中对应位置;{printf((%d*%d)*%d=%d,%d*(%d*%d)=%d,运算是不可结合!\n,a[i],a[j],a[k],op[x][k],a[i],a[j],a[k],op[i][y]);flag=0;/*不满足结合性*/}}if(flag)printf(运算是可结合!\n);}Statusyaoyuan(ElemType*a,ElemType**op,ElemType*e){//有幺元inti,j;intflag=0;for(i=0;iN;i++)中国矿业大学(北京)实验报告第4页,共4页{for(j=0;jN;j++)if(op[i][j]!=a[j]||op[j][i]!=a[j])break;//行和列对这个元素保持不变if(j==N){printf(群有幺元%d!\n,a[i]);e=a[i];flag=1;break;}}if(!flag)printf(群没有幺元!\n);returnOK;}Statusni(ElemType*a,ElemType**op,ElemTypee){//有逆inti,j;intflag=1;for(i=0;iN;i++){for(j=0;jN;j++)if(op[i][j]==e&&op[j][i]==e)break;/*e是幺元*/if(j==N-1){flag=0;printf(A中元素%d没有逆元!\n,a[j]);returnERROR;}}if(flag)printf(A中任何元素都有逆元!\n);returnOK;}intmain(){ElemTypea[N];inti,j;for(i=0;iN;i++){printf(Number%d:,i+1);scanf(%d,&a[i]);fflush(stdin);}printf(complete:*\n);ElemTypeop[N][N];ElemTypee;中国矿业大学(北京)实验报告第5页,共4页for(i=0;iN;i++)for(j=0;jN;j++){op[i][j]=Vcomplete(a[i],a[j]);printf(complete:*);}jiehe(op,a);yaoyuan(a,op,&e);ni(a,op,e);}实验结果与分析:实验结果:Number1:1Number2:2complete:*运算是可结合!群有幺元1!A中任何元素都有逆元!结果分析:1)效果挺好,也完美成功。2)通过这个程序可以方便的判断是否在规定运算下是群,我还特意编写了一个接受运算的函数,可以直接在那个里面修改成你要的运算。3)程序很巧妙的用群的封闭性,对群的一些运算的判别直接运用现成的群中的元素来替代。成绩:批阅教师签名:年月日