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;
}
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;
}
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);