第1关:群的判断:可结合性
题目描述
判断一个代数系统的运算是否具有可结合性。
#include <stdio.h>
//判断代数系统a的运算表op是否可结合
//返回值为1,可结合;
//返回值为0,不可结合;
int f1(int* a, int** op, int n)
{
//*****************begin*********************
int p,q,x=1;
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
for(int k=0;k<n;k++){
for(int l=0;l<n;l++){
if(op[i][j]==a[l])p=l;
if(op[j][k]==a[l])q=l;
}
if(op[i][q]!=op[p][k]){
return 0;
}
}
}
}
return 1;
//***************end************************
}
int main()
{
int n,i,j,k,l;
scanf("%d",&n);//输入集合中元素的个数
int *a = new int[n];
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);//输入集合中的元素
}
int** op = new int*[n];
for(i = 0; i < n; i++){
op[i] = new int[n];
for(j = 0; j < n; j++){
scanf("%d",&op[i][j]);//输入运算表矩阵,应保证输入值属于a中的元素
}
}
int e = f1(a,op,n);
if(e==1)printf("A is associativity\n");
else printf("A is not associativity\n");
}
第2关:群的判断:是否存在幺元
题目描述
判断一个代数系统的运算是否存在幺元
#include <stdio.h>
//判断代数系统a的运算表中是否有幺元
//如果有,则返回幺元的值
//如果没有,则返回-1
int f2(int* a, int** op, int n)
{
//**************************begin***************************
int e,j;
for(int i=0;i<n;i++){
for(j=0;j<n;j++){
if(op[i][j]!=a[j]||op[j][i]!=a[j]){
break;
}
} e=a[j];
if(j==(n)){
return e+1;
}
}
return -1;
//*************************end*****************************
}
int main()
{
int n,i,j,k,l;
scanf("%d",&n);//输入集合中元素的个数
int *a = new int[n];
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);//输入集合中的元素
}
int** op = new int*[n];
for(i = 0; i < n; i++){
op[i] = new int[n];
for(j = 0; j < n; j++){
scanf("%d",&op[i][j]);//输入运算表矩阵,应保证输入值属于a中的元素
}
}
int e = f2(a,op,n);
if(e!=-1)
printf("e=%d\n",e);
else
printf("e is not exist\n");
}
第3关:群的判断:是否存在逆元
题目描述
判断一个代数系统的运算是否存在逆元。
#include <stdio.h>
//判断代数系统a的运算表中是否有幺元
//如果有,则返回幺元的值
//如果没有,则返回-1
int f2(int* a, int** op, int n)
{
//******************************begin*************************
int e,j;
for(int i=0;i<n;i++){
for(j=0;j<n;j++){
if(op[i][j]!=a[j]||op[j][i]!=a[j]){
break;
}
} e=a[j];
if(j==(n)){
return e+1;
}
}
return -1;
//********************************end**************************
}
//判断代数系统a的运算表中是否每个元素都有逆元
//如果有,则返回1
//如果有元素没有逆元,则返回0
int f3(int e, int* a, int** op, int n)
{
//***************************begin******************************
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(op[i][j]==e&&op[j][i]==e)
break;
}
if(j==n)
{
return 0;
}
}
return 1;
//***************************end********************************
}
int main()
{
int n,i,j,k,l;
scanf("%d",&n);//输入集合中元素的个数
int *a = new int[n];
for (i = 0; i < n; i++) {
scanf("%d",&a[i]);//输入集合中的元素
}
int** op = new int*[n];
for(i = 0; i < n; i++){
op[i] = new int[n];
for(j = 0; j < n; j++){
scanf("%d",&op[i][j]);//输入运算表矩阵,应保证输入值属于a中的元素
}
}
int e = f2(a,op,n);
int r = f3(e,a,op,n);
if(r==1)
printf("A is reversible\n");
else
printf("A is not reversible\n");
}