同态同构判定算法

Posted 华仔Ivan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同态同构判定算法相关的知识,希望对你有一定的参考价值。

[C4toC4]isomorphism0:1
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
[C4toC4]homomorphism1:2
[C4toC4]isomorphism2:1
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
[C4toC4a]isomorphism3:1
1 2 3 4
2 1 4 3
3 4 2 1
4 3 1 2
[C4toC4b]isomorphism4:1
1 2 3 4
2 4 1 3
3 1 4 2
4 3 2 1
[C4atoC4b]isomorphism5:1
1 2 3 4
2 4 1 3
3 1 4 2
4 3 2 1

#include "stdafx.h"
//#include "FiniteGroup.h"
#include <functional>
#include <iostream>
#include <vector>
#include <map>
using namespace std;

// Aut(C_3)=C_2
int g_C3[3][3]=
    1,2,3,
    2,3,1,
    3,1,2,
;

//Aut(K_4)=S_3
int g_K4[4][4]=
    1,2,3,4,
    2,1,4,3,
    3,4,1,2,
    4,3,2,1,
;

// Aut(C_4)=C_2
int g_C4[4][4]=
    1,2,3,4,
    2,3,4,1,
    3,4,1,2,
    4,1,2,3,
;

int g_C4a[4][4]=
    1,2,3,4,
    2,1,4,3,
    3,4,2,1,
    4,3,1,2,
;

int g_C4b[4][4]=
    1,2,3,4,
    2,4,1,3,
    3,1,4,2,
    4,3,2,1,
;

/*
同态homomorphism:粗略地说,同态是一个保持合成法则的映射。
同构isomorphism:就是说这两个代数结构的元素之间存在一个一一对应,并且这个对应保持代数运算。
全同构holohedral isomorphism
自同构automorphism
同胚homeomorphism
*/
#if 0
typedef int(*morphism)(int i);
#else
typedef function<int(int)> morphism;
#endif

function<int(int)> mul(function<int(int)> f1,function<int(int)> f2)
    function<int(int)> f=[=](int i)return f2(f1(i));;
    return f;

function<int(int)> inv(function<int(int)> f1,int n)
    function<int(int)> f=[=](int i)
        for(int j=0;j<n;j++)
            if(f1(j)==i)
                return j;
        
        return -1;
    ;
    return f;

bool isEqual(function<int(int)> f1,function<int(int)> f2,int n)
    for(int i=0;i<n;i++)
        if(f1(i)!=f2(i))
            return false;
    
    return true;

bool isBijective(function<int(int)> f1,int n)
    map<int,int> M;
    for(int i=0;i<n;i++)
        M[f1(i)]=i;
    
    return M.size()==n;

// 平凡同构
int isomorphism0(int i)
    return i;

int homomorphism1(int i)
    static map<int,int> M;
    if(M.size()==0)
        M[1]=1;
        M[2]=3;
        M[3]=1;
        M[4]=3;
    
    if(i<0||i>=M.size())
        return 0;
    return M[i+1]-1;

int isomorphism2(int i)
    static map<int,int> M;
    if(M.size()==0)
        M[1]=1;
        M[2]=4;
        M[3]=3;
        M[4]=2;
    
    if(i<0||i>=M.size())
        return 0;
    return M[i+1]-1;

int isomorphism3(int i)
    static map<int,int> M;
    if(M.size()==0)
        M[1]=1;
        M[2]=3;
        M[3]=2;
        M[4]=4;
    
    if(i<0||i>=M.size())
        return 0;
    return M[i+1]-1;

int isomorphism4(int i)
    static map<int,int> M;
    if(M.size()==0)
        M[1]=1;
        M[2]=2;
        M[3]=4;
        M[4]=3;
    
    if(i<0||i>=M.size())
        return 0;
    return M[i+1]-1;

// 是否是同态映射(0:不同态,1:同构,2:同态但不同构)
int isHomomorphism(int* arr2,int* arr2f,int n,morphism f)
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            // f(i*j)=f(i)*f(j)
            int ij=(*(arr2+i*n+j)-1);
            int fij=f(ij);
            int fifj=*(arr2f+f(i)*n+f(j))-1;
            if(fij!=fifj)
                return 0;
        
    
    // 进一步判断是否是同构映射
    bool bj=isBijective(f,n);
    return bj?1:2;

// 是否是自同态映射
int isHomomorphism(int* arr2,int n,morphism f)
    return isHomomorphism(arr2,arr2,n,f);

void printIm(int* arr2,int n,morphism f)
    vector<vector<int> > vv(n,vector<int>(n,0));
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            int ij=(*(arr2+i*n+j)-1);
            int fij=f(ij);
            vv[i][j]=fij;
        
    
    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
            // 交换行
            if(vv[j][0]<vv[i][0])
                vector<int> v(n);
                for(int k=0;k<n;k++)
                    v[k]=vv[j][k];
                    vv[j][k]=vv[i][k];
                    vv[i][k]=v[k];
                
            
            // 交换列
            if(vv[0][j]<vv[0][i])
                vector<int> v(n);
                for(int k=0;k<n;k++)
                    v[k]=vv[k][j];
                    vv[k][j]=vv[k][i];
                    vv[k][i]=v[k];
                
            
        
    
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            printf("%d ",vv[i][j]+1);
        
        printf("\\n");
    

int main()
    
        morphism fArr[]=isomorphism0,homomorphism1,isomorphism2;
        const char *szNameArr[]="isomorphism0","homomorphism1","isomorphism2";
        int cnt=sizeof(szNameArr)/sizeof(szNameArr[0]);
        for(int i=0;i<cnt;i++)
            int bH=isHomomorphism(&g_C4[0][0],4,fArr[i]);
            printf("[C4toC4]%s:%d\\n",szNameArr[i],bH);
            if(bH==1)
                printIm(&g_C4[0][0],4,fArr[i]);
            
        
    
    
        morphism fArr[]=isomorphism3;
        const char *szNameArr[]="isomorphism3";
        int cnt=sizeof(szNameArr)/sizeof(szNameArr[0]);
        for(int i=0;i<cnt;i++)
            int bHa=isHomomorphism(&g_C4[0][0],&g_C4a[0][0],4,fArr[i]);
            printf("[C4toC4a]%s:%d\\n",szNameArr[i],bHa);
            if(bHa==1)
                printIm(&g_C4[0][0],4,fArr[i]);
            
        
    
    
        morphism fArr[]=isomorphism4;
        const char *szNameArr[]="isomorphism4";
        int cnt=sizeof(szNameArr)/sizeof(szNameArr[0]);
        for(int i=0;i<cnt;i++)
            int bHa=isHomomorphism(&g_C4[0][0],&g_C4b[0][0],4,fArr[i]);
            printf("[C4toC4b]%s:%d\\n",szNameArr[i],bHa);
            if(bHa==1)
                printIm(&g_C4[0][0],4,fArr[i]);
            
        
    
    
        morphism f3=isomorphism3;
        morphism f4=isomorphism4;
        morphism f5=mul(inv(f3,4),f4);
        morphism fArr[]=f5;
        const char *szNameArr[]="isomorphism5";
        int cnt=sizeof(szNameArr)/sizeof(szNameArr[0]);
        for(int i=0;i<cnt;i++)
            int bHa=isHomomorphism(&g_C4a[0][0],&g_C4b[0][0],4,fArr[i]);
            printf("[C4atoC4b]%s:%d\\n",szNameArr[i],bHa);
            if(bHa==1)
                printIm(&g_C4a[0][0],4,fArr[i]);
            
        
    
    system("pause");
    return 0;

以上是关于同态同构判定算法的主要内容,如果未能解决你的问题,请参考以下文章

任意两个无限阶循环群之间的映上同态总是同构的

线性代数-单射,满射,双射,同构,同态,仿射

格与布尔代数

图同构的矩阵初等变换判定及算法设计

图同构的矩阵初等变换判定及算法设计

哈希算法在判定树同构方面的应用(下)