1、实验内容
任意给定一个集合和该集合上的一个二元运算“”,判断给定集合关于运算“”是否构成半群?若构成半群,是否构成独异点?若是独异点,是否构成群?
2、实验目的
代数系统是带有运算的集合,代数系统的研究方法和结果可在构造可计算数学模型、研究算术计算的复杂性、刻画抽象数据结构(程序理论、编码理论、数据理论)中均有重大的理论和实际意义。
通过该实验,可以深刻理解半群、独异点或群的概念和性质,并掌握其判定方法。
3、算法主要思想
设集合A={a,b,c,d },“*”是A上的二元运算(满足封闭性),运算表通过二维矩阵进行赋值。
若满足结合律,则<A,>构成半群;
若半群<A,>存在幺元,则<A,>是独异点;
若<A,>是独异点,而且每个元素都存在逆元,则<A,>构成群。
4、主要算法
可结合律的算法
判断幺元的算法
确定每个元素逆元的算法
判断每行每列是否存在重复元素的算法
根据以上提示的完整代码:
import java.util.Scanner;
class judge {
public int joinable(String[] a, String[][] b) {// 判断可结合律(a*b)*c=a*(b*c)
int i, j, k, n, one = 0, two = 0, count1 = 0, count = 0;
int denominator = 1, element = 1;
for (i = 1; i <=a.length - 1; i++)
denominator = denominator * i;
for (i = 1; i <=a.length - 3; i++)
element = element * i;
int number = denominator / (2 * element);// 得到从n-1个元素中任意选2个元素的的个数
for (i = 0; i < a.length; i++) {
for (j = 0; j < a.length; j++)
if (j != i)
for (k = 0; k < a.length; k++)
if (k != j) {
for (n = 0; n < a.length; n++) {
if (a[n].equals(b[i][j]))
one = n;// 得到(a*b)的值
break;
}
for (n = 0; n < a.length; n++) {
if (a[n].equals(b[j][k]))
two = n;// 得到(b*c)的值
break;
}
if (b[one][k].equals(b[i][two]))// 判断(a*b)*c=a*(b*c)
count1++;
}
if(count1/2==number)
count++;
count1=0;
}
//System.out.println(count);
//System.out.println(number);
if (count < a.length)// 计数判断整个运算表是否满足结合律
return 0;
else
return 1;
}
public String identityElement(String[] a, String[][] b) {// 判断幺元的算法
int i, j, count = 0;
String identityElement = "have no identity element";
for (i = 0; i < a.length; i++) {
count = 0;
for (j = 0; j < a.length; j++) {
if (b[i][j].equals(a[j]) && b[j][i].equals(a[j]))// 幺元定义
count++;
}
if (count == a.length) {
identityElement = a[i];// 计数判断幺元对整个运算表成立
break;
}
}
return identityElement;
}
public int inverseElement(String[] a, String[][] b, String c) {// 判断是否每个元素都有逆元的算法
int i, j, count = 0;
for (i = 0; i < a.length; i++)
for (j = 0; j < a.length; j++)
if (b[i][j].equals(c))
count++;// 判断对于每个元素是否都能找到一个元素与之运算得到幺元,找到则计数加一
if (count < a.length)// 若每个元素都有逆元则count=a.length
return 0;
else
return 1;
}
public int noRepetition(String[] a, String[][] b) {// 每行每列知否含有重复元素的算法
int i, j, k, count = 0;
for (i = 0; i < a.length; i++)
for (j = 0; j < a.length; j++)
for (k = 0; k < a.length; k++)
if (k != j) {
if (b[i][j].equals(b[i][k]))// 行是否有重复元素
count++;
if (b[j][i].equals(b[k][i]))// 列是否有重复元素
count++;
}
if (count != 0)
return 0;
else
return 1;
}
}
public class work {
public static void main(String args[]){
Scanner reader=new Scanner(System.in);
System.out.println("判断给定的代数系统<A,*>是否为半群、独异点、群");
System.out.println("集合A中有几个元素?");
int number=reader.nextInt(),i,j;
System.out.println("请输入集合A中的"+number+"个元素");
String[] element=new String[number];
String[][] chart=new String[number][number];
for(i=0;i<number;i++)
element[i]=reader.next();
System.out.println("请输入代数系统的运算表");
for(i=0;i<number;i++)
for(j=0;j<number;j++){
System.out.println(element[i]+"*"+element[j]+"=");
chart[i][j]=reader.next();
}
System.out.println("该代数系统的运算表为");
for(i=0;i<number;i++){
for(j=0;j<number;j++)
System.out.print(chart[i][j]+" ");
System.out.print("\n");
}
//得到一个代数系统
judge judge=new judge();//判断各项性质
int a=judge.joinable(element, chart);
String b=judge.identityElement(element, chart);
int c=judge.inverseElement(element, chart, b);
int d=judge.noRepetition(element, chart);
if (a == 0)
System.out.println("集合关于运算“*”不构成半群");
else if (a == 1) {
System.out.println("集合关于运算“*”构成半群");
if (b != "have no identity element") {
System.out.println("集合关于运算“*”构成独异点");
if (c == 1 && d == 1)
System.out.println("集合关于运算“*”构成群");
else System.out.println("集合关于运算“*”不构成群");
}
if (b == "have no identity element")
System.out.println("集合关于运算“*”不构成独异点");
}
//System.out.println(element[1]);
}
}
文档说明:
测试用例:
a b c
a c a b
b a b c
c b c a
运行结果:
判断给定的代数系统<A,>是否为半群、独异点、群
集合A中有几个元素?
3
请输入集合A中的3个元素
a b c
请输入代数系统的运算表
aa=
c
ab=
a
ac=
b
ba=
a
bb=
b
bc=
c
ca=
b
cb=
c
cc=
a
该代数系统的运算表为
c a b
a b c
b c a
集合关于运算“”构成半群
集合关于运算“”构成独异点
集合关于运算“*”构成群