movs: basis single file
This commit is contained in:
167
circuit/25-1/basis.html
Normal file
167
circuit/25-1/basis.html
Normal file
@ -0,0 +1,167 @@
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
<style>
|
||||
th,
|
||||
td {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 1px solid black;
|
||||
min-width: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script>
|
||||
const app = document.getElementById('app')
|
||||
const func_names = ['константа 0', 'и', 'левая коимпликация', 'X', 'правая коимпликация', 'Y', 'исключающее или', 'или', 'стрелка пирса', 'эквивалентность', 'не Y', 'правая импликация', 'не X', 'левая импликация', 'штрих шеффера', 'константа 1']
|
||||
|
||||
function getTerm(num) {
|
||||
return [num >> 3, num >> 2 & 1, num >> 1 & 1, num & 1]
|
||||
}
|
||||
|
||||
function getName(num) {
|
||||
return 'F' + num + ' - ' + func_names[num]
|
||||
}
|
||||
|
||||
function isT0(num) {
|
||||
const term = getTerm(num)
|
||||
return term[0] == 0
|
||||
}
|
||||
|
||||
function isT1(num) {
|
||||
const term = getTerm(num)
|
||||
return term[3] == 1
|
||||
}
|
||||
|
||||
function isL(num) {
|
||||
const term = getTerm(num)
|
||||
return (term[0] ^ term[1] ^ term[2] ^ term[3]) == 0
|
||||
}
|
||||
|
||||
function isM(num) {
|
||||
const term = getTerm(num)
|
||||
return term[0] <= term[1] && term[1] <= term[2] && term[2] <= term[3]
|
||||
}
|
||||
|
||||
function isS(num) {
|
||||
const term = getTerm(num)
|
||||
return term[0] == !term[3] && term[1] == !term[2]
|
||||
}
|
||||
|
||||
const row_func = [isT0, isT1, isL, isM, isS]
|
||||
const table = document.createElement('table')
|
||||
table.innerHTML = '<tr><th>Функция</th><th>T0</th><th>T1</th><th>L</th><th>M</th><th>S</th></tr>'
|
||||
|
||||
const bitclasses = []
|
||||
|
||||
for (let i = 0; i < 16; i++) {
|
||||
bitclasses.push(0)
|
||||
const tr = document.createElement('tr')
|
||||
const td = document.createElement('td')
|
||||
td.innerHTML = getName(i)
|
||||
td.style.textAlign = 'left'
|
||||
tr.appendChild(td)
|
||||
|
||||
for (let j = 0; j < 5; j++) {
|
||||
bitclasses[i] |= row_func[j](i) << j
|
||||
const td = document.createElement('td')
|
||||
td.innerText = row_func[j](i) ? '+' : ''
|
||||
tr.appendChild(td)
|
||||
}
|
||||
|
||||
table.appendChild(tr)
|
||||
}
|
||||
|
||||
app.appendChild(table)
|
||||
|
||||
function forEachSubset(arr, callback) {
|
||||
for (let i = 0n; i < 2n ** BigInt(arr.length); i++) {
|
||||
const subset = []
|
||||
let bitset = i
|
||||
let pos = 0n
|
||||
|
||||
while (bitset > 0n) {
|
||||
if (bitset & 1n) {
|
||||
subset.push(arr[pos])
|
||||
}
|
||||
bitset >>= 1n
|
||||
pos++
|
||||
}
|
||||
|
||||
callback(subset)
|
||||
}
|
||||
}
|
||||
|
||||
const indexes = new Array(16).fill(0)
|
||||
indexes.forEach((v, i, a) => {a[i] = i})
|
||||
|
||||
const basis = []
|
||||
forEachSubset(indexes, (subset) => {
|
||||
for (let skipped_i = 0; skipped_i < subset.length; skipped_i++) {
|
||||
let bitclass = 2 ** 5 - 1
|
||||
|
||||
for (let i = 0; i < subset.length; i++) {
|
||||
if (i == skipped_i) {
|
||||
continue
|
||||
}
|
||||
|
||||
bitclass &= bitclasses[subset[i]]
|
||||
}
|
||||
if (bitclass == 0) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let bitclass = 2 ** 5 - 1
|
||||
|
||||
for (const index of subset) {
|
||||
bitclass &= bitclasses[index]
|
||||
}
|
||||
if (bitclass != 0) {
|
||||
return
|
||||
}
|
||||
|
||||
basis.push(subset)
|
||||
})
|
||||
|
||||
basis.sort((a, b) => {return a.length - b.length})
|
||||
let len
|
||||
let ul
|
||||
basis.forEach((basis) => {
|
||||
if (basis.length != len || ul === undefined) {
|
||||
len = basis.length
|
||||
|
||||
const h = document.createElement('h3')
|
||||
h.innerText = 'Базисы размера ' + len
|
||||
app.appendChild(h)
|
||||
|
||||
ul = document.createElement('ul')
|
||||
app.appendChild(ul)
|
||||
}
|
||||
|
||||
const li = document.createElement('li')
|
||||
const inner_ul = document.createElement('ul')
|
||||
|
||||
for (const index of basis) {
|
||||
const inner_li = document.createElement('li')
|
||||
inner_li.innerText = getName(index)
|
||||
inner_ul.appendChild(inner_li)
|
||||
}
|
||||
li.appendChild(inner_ul)
|
||||
ul.appendChild(li)
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@ -1,22 +0,0 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Document</title>
|
||||
<style>
|
||||
th, td {
|
||||
border: 1px solid black;
|
||||
min-width: 50px;
|
||||
text-align: center;
|
||||
}
|
||||
table {
|
||||
width: 600px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script src="index.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -1,138 +0,0 @@
|
||||
const app = document.getElementById('app')
|
||||
const func_names = ['константа 0', 'и', 'левая коимпликация', 'X', 'правая коимпликация', 'Y', 'исключающее или', 'или', 'стрелка пирса', 'эквивалентность', 'не Y', 'правая импликация', 'не X', 'левая импликация', 'штрих шеффера', 'константа 1']
|
||||
|
||||
function getTerm(num) {
|
||||
return [num >> 3, num >> 2 & 1, num >> 1 & 1, num & 1]
|
||||
}
|
||||
|
||||
function getName(num) {
|
||||
return 'F' + num + ' - ' + func_names[num]
|
||||
}
|
||||
|
||||
function isT0(num) {
|
||||
const term = getTerm(num)
|
||||
return term[0] == 0
|
||||
}
|
||||
|
||||
function isT1(num) {
|
||||
const term = getTerm(num)
|
||||
return term[3] == 1
|
||||
}
|
||||
|
||||
function isL(num) {
|
||||
const term = getTerm(num)
|
||||
return (term[0] ^ term[1] ^ term[2] ^ term[3]) == 0
|
||||
}
|
||||
|
||||
function isM(num) {
|
||||
const term = getTerm(num)
|
||||
return term[0] <= term[1] && term[1] <= term[2] && term[2] <= term[3]
|
||||
}
|
||||
|
||||
function isS(num) {
|
||||
const term = getTerm(num)
|
||||
return term[0] == !term[3] && term[1] == !term[2]
|
||||
}
|
||||
|
||||
const row_func = [isT0, isT1, isL, isM, isS]
|
||||
const table = document.createElement('table')
|
||||
table.innerHTML = '<tr><th>Функция</th><th>T0</th><th>T1</th><th>L</th><th>M</th><th>S</th></tr>'
|
||||
|
||||
const bitclasses = []
|
||||
|
||||
for (let i = 0; i < 16; i++) {
|
||||
bitclasses.push(0)
|
||||
const tr = document.createElement('tr')
|
||||
const td = document.createElement('td')
|
||||
td.innerHTML = getName(i)
|
||||
td.style.textAlign = 'left'
|
||||
tr.appendChild(td)
|
||||
|
||||
for (let j = 0; j < 5; j++) {
|
||||
bitclasses[i] |= row_func[j](i) << j
|
||||
const td = document.createElement('td')
|
||||
td.innerText = row_func[j](i) ? '+' : ''
|
||||
tr.appendChild(td)
|
||||
}
|
||||
|
||||
table.appendChild(tr)
|
||||
}
|
||||
|
||||
app.appendChild(table)
|
||||
|
||||
function forEachSubset(arr, callback) {
|
||||
for (let i = 0n; i < 2n ** BigInt(arr.length); i++) {
|
||||
const subset = []
|
||||
let bitset = i
|
||||
let pos = 0n
|
||||
|
||||
while (bitset > 0n) {
|
||||
if (bitset & 1n) {
|
||||
subset.push(arr[pos])
|
||||
}
|
||||
bitset >>= 1n
|
||||
pos++
|
||||
}
|
||||
|
||||
callback(subset)
|
||||
}
|
||||
}
|
||||
|
||||
const indexes = new Array(16).fill(0)
|
||||
indexes.forEach((v, i, a) => { a[i] = i })
|
||||
|
||||
const basis = []
|
||||
forEachSubset(indexes, (subset) => {
|
||||
for (let skipped_i = 0; skipped_i < subset.length; skipped_i++) {
|
||||
let bitclass = 2 ** 5 - 1
|
||||
|
||||
for (let i = 0; i < subset.length; i++) {
|
||||
if (i == skipped_i) {
|
||||
continue
|
||||
}
|
||||
|
||||
bitclass &= bitclasses[subset[i]]
|
||||
}
|
||||
if (bitclass == 0) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
let bitclass = 2 ** 5 - 1
|
||||
|
||||
for (const index of subset) {
|
||||
bitclass &= bitclasses[index]
|
||||
}
|
||||
if (bitclass != 0) {
|
||||
return
|
||||
}
|
||||
|
||||
basis.push(subset)
|
||||
})
|
||||
|
||||
basis.sort((a, b) => { return a.length - b.length })
|
||||
let len
|
||||
let ul
|
||||
basis.forEach((basis) => {
|
||||
if (basis.length != len || ul === undefined) {
|
||||
len = basis.length
|
||||
|
||||
const h = document.createElement('h3')
|
||||
h.innerText = 'Базисы размера ' + len
|
||||
app.appendChild(h)
|
||||
|
||||
ul = document.createElement('ul')
|
||||
app.appendChild(ul)
|
||||
}
|
||||
|
||||
const li = document.createElement('li')
|
||||
const inner_ul = document.createElement('ul')
|
||||
|
||||
for (const index of basis) {
|
||||
const inner_li = document.createElement('li')
|
||||
inner_li.innerText = getName(index)
|
||||
inner_ul.appendChild(inner_li)
|
||||
}
|
||||
li.appendChild(inner_ul)
|
||||
ul.appendChild(li)
|
||||
})
|
||||
Reference in New Issue
Block a user