概念:

半群:

在数学中,半群是闭合于结合性二元运算之下的集合 $S$构成的代数结构。集合 $S$ 和其上的二元运算 $·$ : $S×S→S$ 。若 $·$ 满足结合律,即: $∀x,y,z∈S$,有$(x·y)·z=x·(y·z)$,则称有序对$(S,·)$为半群,运算 $·$ 称为该半群的乘法。实际使用中,在上下文明确的情况下,可以简略叙述为“半群S”。

独异点(幺半群):

若S上的乘法有幺元(单位元),即:$∃1∈S$,使得 $∀s∈S$ ,$1·s=s·1$。则S称为幺半群(独异点)。

群:

若独异点中每一个元素都有对应的逆元,则S称为群。

判定条件:

按照定义判断即可

算法实现

简单算法实现(C语言为例):

//判断系统为半群
int  banqun(int  n)
{
    int flag=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
            {
                int x=S[i][j];
                int y=S[j][k];
                if(S[x][k]!=S[i][y])
                    flag=0;
            }
    return flag;
}

//判断系统为含幺半群
int yaoqun(int n)
{

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(S[i][j]==j && S[j][i]==j)
            {
                Y=i;
                return 1;
            }
    return 0;
}
//判断为群
int qun(int n)
{
    int flag1=banqun(n);
    int flag2=yaoqun(n);
    if(flag1&&flag2)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(S[i][j]!=Y || S[j][i]!=Y)
                    return 0;
    }
    else return 1;
}

简单算法实现(Python为例):

#判断是否为群
def banqun(n):
    flag=1
    for i in range(1,n):
        for j in range(1,n):
            for k in range(1,n):
                x=S[i][j];
                y=S[j][k];
                if(S[x][k]!=S[i][y]):
                    flag=0;
    return flag;
#判断系统为含幺半群(独异点)
def yaoqun(n):
    for i in range(1, n):
        for j in range(1, n):
            if(S[i][j]==j and S[j][i]==j):
                Y=i
                return 1
    return 0
#判断为群
def qun(n):
    flag1=banqun(n)
    flag2=yaoqun(n)
    if(flag1 and flag2):
        for i in range(1,n):
            for j in range(1,n):
                if(S[i][j]!=Y or S[j][i]!=Y):
                    return 0;
    else:
        return 1

C语言具体实现(编译运行即可使用)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

using namespace std;

typedef char ElemType;
typedef int Status;

typedef struct AlgSysNode{
    ElemType *elem;         //元素数组首地址
    ElemType **table;       //运算表首地址
    int length;             //元素个数
}AlgSysNode,*AlgSystem;

//创建代数系统
void createAlgSystem(AlgSystem &G,int n){
    int i,j;
    G = (AlgSystem)malloc(n*sizeof(AlgSysNode));
    if(!G) return;
    G->elem = (ElemType *)malloc(n*sizeof(ElemType));
    if(!G->elem) return;
    for(i=0;i<n;i++){
        printf("第%d个元素是:",i+1);
        cin>>G->elem[i];
    }
    G->table = (ElemType **)malloc(n*sizeof(ElemType*));
    if(!G->table) return;
    for(i=0;i<n;i++){
        G->table[i] = (ElemType *)malloc(n*sizeof(ElemType));
        for(j=0;j<n;j++){
            printf("运算表中第%d行第%d个是:",i+1,j+1);
            cin>>G->table[i][j];
        }
    }
    G->length = n;
    return;
}

//定位元素
int LocateVex(AlgSystem G,ElemType e){
    int i;
    for(i=0;i<G->length;i++){
        if(G->elem[i] == e) return i;
    }
    return -1;
}

//封闭性
Status IsClosed(AlgSystem G){
    int i,j;
    for(i=0;i<G->length;i++){
        for(j=0;j<G->length;j++){
            if(LocateVex(G,G->table[i][j])==-1) return FALSE;
        }
    }
    return TRUE;
}

//结合性
Status IsCombined(AlgSystem G){
    int i,j,k,m,n;
    for(i=0;i<G->length;i++){
        for(j=0;j<G->length;j++){
            for(k=0;k<G->length;k++){
                m = LocateVex(G,G->table[i][j]);
                n = LocateVex(G,G->table[j][k]);
                if(G->table[m][k] != G->table[i][n]){
                    return FALSE;
                }
            }
        }
    }
    return TRUE;
}

//有幺元
Status IsExist_e(AlgSystem G,ElemType &e){
    int i,j,k;
    for(i=0;i<G->length;i++){
        for(j=0;j<G->length;j++){
            if(G->table[i][j] != G->elem[j]) break;
        }
        if(j == G->length){
            for(k=0;k<G->length;k++){
                if(G->table[k][i] != G->elem[k]) break;
            }
            if(k == G->length){
                e =  G->elem[i];
                return TRUE;
            }
        }
    }
    return FALSE;
}

//逆元
Status IsExistInverse_e(AlgSystem G,ElemType e){
    int i,j;
    for(i=0;i<G->length;i++){
        for(j=0;j<G->length;j++){
            if(G->table[i][j] == e) break;
        }
        if(j == G->length) return FALSE;
    }
    return TRUE;
}

Status IsGroup(AlgSystem G){
    ElemType e;
    return IsClosed(G) && IsCombined(G) && IsExist_e(G,e) && IsExistInverse_e(G,e);
}

int main(){
    int n = 0;
    AlgSystem G;
    printf("代数系统中元素的个数:");
    scanf("%d",&n);
    createAlgSystem(G,n);
    if( IsClosed(G)&&IsCombined(G)){
            printf("该代数系统是半群\n");
            ElemType e;
            if(IsCombined(G)){
                printf("该代数系统是独异点\n");
            }
        }else{
            printf("该代数系统不是半群") ;
        }
    if(IsGroup(G)){
        printf("该代数系统是群");
    }else{
        printf("该代数系统不是群") ;
    }
    return 0;
}

Python具体实现(运行即可使用)

#判断是否为半群
def banqun(n,S):
    flag=1
    for i in range(1,n):
        for j in range(1,n):
            for k in range(1,n):
                x=S[i][j];
                y=S[j][k];
                if(S[x][k]!=S[i][y]):
                    flag=0;
    return flag;
#判断系统为含幺半群(独异点)
def yaoqun(n,S):
    for i in range(1, n):
        for j in range(1, n):
            if(S[i][j]==j and S[j][i]==j):
                Y=i
                return 1,Y
    return 0,0
#判断为群
def qun(n,S):
    flag1=banqun(n,S)
    flag2,Y=yaoqun(n,S)
    if(flag1 and flag2):
        for i in range(1,n):
            for j in range(1,n):
                if(S[i][j]!=Y or S[j][i]!=Y):
                    return 0;
    else:
        return 1

if __name__ == '__main__':
    n = int(input('请输入矩阵的大小'))
    a = [[0 for i in range(n+1)] for j in range(n+1)]
    print('输入整个矩阵(一个一个输入,按照行次序)')
    for i in range(n):
        for j in range(n):
            a[i+1][j+1] = int(input())
    ans1 = banqun(n,a)
    ans2 = yaoqun(n,a)
    ans3 = qun(n,a)
    if ans1 == 1:
        print('是半群')
    if ans2 == 1:
        print('是含幺半群')
    if ans3 == 1:
        print('是群')