摘 要:利用C语言编制程序检验有限集合及其上二元运算是否适合结合律,是否存在单位元,每一个元是否存在逆元,从而快速检查一个有限集合对所给二元运算是否成一个群。
关键词:有限群 结合律 左单位元 左逆元 程序
在半群论、群论的研究中,经常需要构造反例以支持研究,这就面临着检验对集合特别是有限集合规定的代数运算是否满足构成半群或群的条件,其中结合律的检验尤为繁琐,对含有N个元的集合,就结合律需检验个式子,每个式子又需进行四次二元运算;虽然对于阶数不高于20的群的个数和种类已完全得到[1]:
关键词:有限群 结合律 左单位元 左逆元 程序
在半群论、群论的研究中,经常需要构造反例以支持研究,这就面临着检验对集合特别是有限集合规定的代数运算是否满足构成半群或群的条件,其中结合律的检验尤为繁琐,对含有N个元的集合,就结合律需检验个式子,每个式子又需进行四次二元运算;虽然对于阶数不高于20的群的个数和种类已完全得到[1]:
阶数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
群数 | 1 | 1 | 1 | 2 | 1 | 2 | 1 | 5 | 2 | 2 | 1 | 5 | 1 | 2 | 1 | 14 | 1 | 5 | 1 | 5 |
但在实际构建阶数不大于20的群时,仍需与已知的群建立同构映射;因而可借助编制程序利用计算机进行快速检验;本文通过用数字字符代替字母字符,将文[2]最多可检验含有65536个元的有限集合扩展为任意有限集合。
1 预备知识
定义2.1[3] 群的第二定义
一个不空集合G对于一个叫做乘法的代数运算来说作成一个群,假如
I,G对于乘法来说是封闭的;
II,结合律成立:a(bc)=(ab)c
对于G的任意三个元a,b,c都对;
III,G里至少存在一个左单位元e,能让
ea=a
对于G中的任何元a都成立;
IV,对于G的每一个元a,在G里至少存在一个左逆元,能让
=
定义2.2[3] 有限群的另一定义
一个有乘法的有限不空集合G作成一个群,假如
Ⅰ、G对于这个乘法来说是闭的;
Ⅱ、结合律成立:
对于G的任意三个元、、都成立;
Ⅲ、消去律成立:
2 程序
对于一个有限集合来说:如果利用有限群的另一定义来判断所给的有限集合及其代数运算是否构成群:封闭性的检验很简单,只需观察所给的运算表中没有新元素出现即可,如果有新元素出现则不满足封闭性,反之则满足封闭性;对于消去律的验证,只需观察集合A中的所有元素都出现在所给的运算表中每行每列,因而只需检验结合律是否成立;但对于一个给定的阶数很大的群,在判断消去律的时候就会显得麻烦。这时依据群的第二定义检验有限集合及其上二元运算是否构成群,可利用计算机的方法检验结合律是否成立及左单位元,左逆元的存在性。下面,笔者给出利用C语言编制的检验程序。
2.1 结合律及左单位元的检验程序
#include <stdio.h>
#define N 100
int f( int m, int n, int b[N][N] )
{ return b[m][n]; }
int g( int m, int n, int a[N], int b[N][N] )
{ int k, t=-1;
for(k=0; k<N; k++ )
if ( a[k]==f(m, n, b))
{ t=k; break; }
return t ;
}
getdata(int a[N], int b[N][N], int n )
{int i, j;
i=0; j=0;
printf( "n Enter the elements of set A:n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("n Enter the elements of matrix B:n");
for(i=0;i<n;i++)
for(j=0;j<n;j++) scanf("%d",&b[i][j]);
printf( "n" );
return;
}
void check(int a[N], int b[N][N], int n)
{ int i, j, k, s=0;
for( i=0; i<n; i++ )
if ( s==1) break;
else
for( j=0; j<n; j++)
if (s==1) break;
else
for( k=0; k<n; k++)
if (f(g(i,j,a,b),k,b)!=f (i,g(j,k,a,b),b))
{ s=1;
printf("NO!n");
printf("%2c%2c%2c",a[i],a[j],a[k]);
printf("n");
break;
}
if ( s==0 ) printf( "YES!n");
return;
}
main()
{int i, j, n,t=0,a[N], b[N][N];
do
{ printf("n Enter the data n: " );
scanf("%d",&n);
}while(n<=0||n>N);
getdata( a, b, n);
check(a, b, n);
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
if(b[i][j]==a[j])
{printf("%d",a[i]);
t++;}
}
printf("%4dn",t);
return;
}
2.2 左逆元的检验程序
#include <stdio.h>
#define N 100
main()
{
int i,j,n,s,m,a[N],b[N][N];
printf("n Enter the leftidentity m:n");
scanf("%d",&m);
do
{printf("n Enter the data n: ");
scanf("%d",&n);
}while(n<=0||n>N);
printf("n Enter the elements of set A:n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("n Enter the elements of matrix B:n");
for(i=0;i<n;i++)
for(j=0;j<n;j++) scanf("%d",&b[i][j]);
printf("n");
for(i=0;i<n;i++)
{for(j=0;j<n;j++)
if(b[j][i]==m){
s=0;
break;
}
else s=1;
}
if(s==0)
printf("Yes!n");
else
printf("No!n");
}
在检验过程中,需将运算表输入,输入的过程即可检验封闭性,因而本程序没有对封闭性检验的过程。
3 实例检验
设集合A中包含e,a,b,c,d,f六个元.A的乘法由下表规定:
e | a | b | c | d | f | |
e | e | a | b | c | d | f |
a | a | e | d | f | b | c |
b | b | f | e | d | c | a |
c | c | d | f | e | a | b |
d | d | c | a | b | f | e |
f | f | b | c | a | e | d |
试验证集合A对于该乘法来说是否作成群.
说明:由于本文中的程序仅对所给有限集A中的元为数字时能正常运行.若对于所给有限集A中的元为其外的字母或符号时,须先对其做一个替换.
在利用程序检验前,先做如下替换:分别用1,2,3,4,5,6代替字母e,a,b,c,d,f.则A的乘法表为