离散数学代数系统上机实验

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
请输入代数系统的运算表
a
a=
c
ab=
a
a
c=
b
ba=
a
b
b=
b
bc=
c
c
a=
b
cb=
c
c
c=
a
该代数系统的运算表为
c a b
a b c
b c a
集合关于运算“”构成半群
集合关于运算“
”构成独异点
集合关于运算“*”构成群

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值