南邮离散第三次实验JS版

// 实验项目名称:偏序关系中盖住关系的求取及格论中有补格的判定
// 实验内容:
// 编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格。
// 实验要求:
//     对任意给定正整数,利用整除关系求所有由其因子构成的集合所构成的格,判断其是否为有补格


// 获得因子
function getFractors(n){
	const ans = [];

	for(let i = 1; i <= n; i++){
		if( n % i == 0){
			ans.push(i);
		}
	}

	return ans;
}

// 获得偏序集
function getOrders(n){
	const fractors = getFractors(n);
	let map_orders = [];

	for(let i = 0, len = fractors.length; i < len ;i ++){
		
		let num = fractors[i];

		for(let j = 0; j < i; j++){
			
			let obj = {};
			
			if( num % fractors[j] == 0 && 
				isParticialOrders(fractors, j, i, num)){
				obj.key = fractors[j];
				obj.value = num;
				map_orders.push(obj);
			}
		}
	}
	return map_orders;
}

//判断是否是盖住关系
function isParticialOrders(fractors, low,  high, num){

	for(let i = low + 1; i < high; i++){
		if(fractors[i] % fractors[low] == 0 && num % fractors[i] == 0){
			return false;
		}
	}

	return true;
}


// 输出盖住关系和对是否是有补格进行判断
function getParticialOrders(n){
	const orders = getOrders(n);
	console.log("盖住关系: {")
	orders.forEach(item => {
		console.log( `< ${item.key} , ${item.value} >`);
	})
	console.log("}")
	console.log(isGrid(n, orders) ? '此偏序集是有补格' : '此偏序集不是有补格');
}


// 判断是否是有补格
function isGrid(n, order){
	const orders = order, fractors = getFractors(n);

	for(let i = 0, len = fractors.length; i < len; i ++){
		for(let j = 0; j < len; j ++ ){
			if(i !== j && isLow(fractors[i], fractors[j], orders)
					   && isHigh(fractors[i], fractors[j], orders, n)){
				return true;
			}
		}
	}

	return false;
}


// 判断全下界是否为1
function isLow(val_i, val_j, orders){
	let limit_i = [], limit_j = [];

	// 下界值
	while(val_i != 1){
		orders.forEach(item => {
			if(item.value == val_i){
				limit_i.push(item.key);
				val_i = item.key;
			}
		})
	}
	

	while(val_j != 1){
		orders.forEach(item => {

			if(item.value == val_j){
				limit_j.push(item.key);
				val_j = item.key;
			}
		})
	}

	if(limit_i.length == 0 || limit_j.length == 0){
		return true;
	}

	limit_i.pop();
	for(let item of limit_i){
		if(limit_j.includes(item)){
			return false;
		}
	}

	return true;
}

// 判断全上界是否为n
function isHigh(val_i, val_j, orders, n){
	let limit_i = [], limit_j = [];

	// 上界值
	while(val_i !== n){
		orders.forEach(item => {
			if(item.key == val_i){
				limit_i.push(item.value);
				val_i = item.value;
			}
		})
	}
	
	while(val_j !== n){
		orders.forEach(item => {
			if(item.key == val_j){
				limit_j.push(item.value);
				val_j = item.value;
			}
		})
	}

	if(limit_i.length == 0 || limit_j.length == 0){
		return true;
	}

	limit_i.pop();
	for(let item of limit_i){
		if(limit_j.includes(item)){
			return false;
		}
	}

	return true;
}


getParticialOrders(12);




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值