判定同态和其基本定义

判定同态

基本定义


简单的代码实现(代码写的真的很简单,离散数学更应该注重定义的理解)

输入样例

3//A={1,2,3}上的运算——运算表表示
1 2 3 
2 1 3
3 2 1

3//B={1,2,3}上的运算——运算表表示
1 2 3 
1 2 3 
1 2 3

4 //4个A到B的函数
1 2 3 //A:1,2,3 对应映射到 B:1,2,3
1 1 1 //A:1,2,3 对应映射到 B:1,1,1
2 3 1 //A:1,2,3 对应映射到 B:2,3,1
2 1 3 //A:1,2,3 对应映射到 B:2,1,3

输出样例

algebra A:
1 2 3
2 1 3
3 2 1
algebra B:
1 2 3
1 2 3
1 2 3
map:1 2 3
No
h(21) = 2
h(2)h(1) = 1
map:1 1 1
Yes
map:2 3 1
No
h(21) = 3
h(2)h(1) = 2
map:2 1 3
No
h(21) = 1
h(2)h(1) = 2

代码实现

#include <iostream>
using namespace std;
int main(){
    int size1;
    cout<<"The size of the matrix1:"<<endl;
    cin>>size1;
    int size2;
    cout<<"The size of the matrix2:"<<endl;
    cin>>size2;
    //初始化运算表
    int matrix1[10][10] = {0};
    int matrix2[10][10] = {0};
    printf("algebra A:
");
    for(int i = 1; i <= size1; i++){
        for(int j = 1; j <= size1; j++){
           cin>>matrix1[i][j];
        }
    }
     printf("algebra B:
");
    for(int i = 1; i <=size2; i++){
        for(int j = 1; j <= size2; j++){
            cin>>matrix2[i][j];
        }
    }
	
	cout<<"the num of maps:"<<endl;
    int num;
    cin>>num;//映射次数
    int arr[size1+1] ={0};//分别是代数A的1,2,3的映射
    for(int k= 0;k<num;k++){
    	printf("map: ");
      	for(int i = 1;i<=size1; i++){
      		cin>>arr[i];
		  }
		  int flag = 1;
        //进行判断是否符合同态
        for(int i = 1; i <= size1; i++){
        	for(int j = 1; j <= size1;j ++){
        		if(arr[matrix1[i][j] ] != matrix2[arr[i]][arr[j]] && flag ==1 ){
        			printf("No
");
        			printf("h(%d%d)=%d
",i,j,arr[matrix1[i][j] ]);
        			printf("h(%d)(%d)=%d
",i,j,matrix2[arr[i]][arr[j]]);
        			flag =0;
				}
			}
		}
		if(flag == 1)printf("Yes
");
        
    }
}

在这基础上进行修改,可得判断是否同构的代码

#include <iostream>
using namespace std;
int main(){
    int size1;
    cout<<"The size of the matrix1:"<<endl;
    cin>>size1;
    //初始化运算表
    int matrix1[10][10] = {0};
    printf("algebra A:
");
    for(int i = 1; i <= size1; i++){
        for(int j = 1; j <= size1; j++){
           cin>>matrix1[i][j];
        }
    }
	
	cout<<"the num of maps:"<<endl;
    int num;
    cin>>num;//映射次数
    int arr[size1+1] ={0};//分别是代数A的1,2,3的映射
    for(int k= 0;k<num;k++){
    	printf("map: ");
      	for(int i = 1;i<=size1; i++){
      		cin>>arr[i];
		  }
		  int flag = 1;
        //进行判断是否符合自同构
        for(int i = 1; i <= size1; i++){
        	for(int j = 1; j <= size1;j ++){
        		if(arr[matrix1[i][j] ] != matrix1[arr[i]][arr[j]] && flag ==1 ){
        			printf("No
");
        			printf("h(%d%d)=%d
",i,j,arr[matrix1[i][j] ]);
        			printf("h(%d)(%d)=%d
",i,j,matrix1[arr[i]][arr[j]]);
        			flag =0;
				}
			}
		}
		if(flag == 1)printf("Yes
");
        
    }
}
原文地址:https://www.cnblogs.com/miaomiaolan/p/13050030.html