Javascript 反向二进制网络
我怎样才能反转一个二元方程,这样我就可以找到哪些输入将产生一个给定的输出 例如:Javascript 反向二进制网络,javascript,algorithm,math,binary,Javascript,Algorithm,Math,Binary,我怎样才能反转一个二元方程,这样我就可以找到哪些输入将产生一个给定的输出 例如: Inputs: i0 through i8 Outputs: o0 through o8 Operators: ^ = XOR, & = AND 二元方程: (1&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o0 (0&am
Inputs: i0 through i8
Outputs: o0 through o8
Operators: ^ = XOR, & = AND
二元方程:
(1&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o0
(0&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (1&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o1
(0&i0) ^ (1&i1) ^ (1&i2) ^ (0&i3) ^ (0&i4) ^ (1&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o2
(1&i0) ^ (0&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o3
(0&i0) ^ (1&i1) ^ (0&i2) ^ (1&i3) ^ (1&i4) ^ (0&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o4
(0&i0) ^ (0&i1) ^ (0&i2) ^ (0&i3) ^ (0&i4) ^ (1&i5) ^ (0&i6) ^ (0&i7) ^ (0&i8) = o5
(0&i0) ^ (0&i1) ^ (0&i2) ^ (1&i3) ^ (0&i4) ^ (0&i5) ^ (1&i6) ^ (0&i7) ^ (0&i8) = o6
(0&i0) ^ (0&i1) ^ (0&i2) ^ (1&i3) ^ (1&i4) ^ (0&i5) ^ (1&i6) ^ (1&i7) ^ (0&i8) = o7
(0&i0) ^ (0&i1) ^ (0&i2) ^ (0&i3) ^ (0&i4) ^ (1&i5) ^ (0&i6) ^ (0&i7) ^ (1&i8) = o8
以矩阵形式:
1,1,0,1,0,0,0,0,0,1
0,1,0,1,1,0,0,0,0,1
0,1,1,0,0,1,0,0,0,1
1,0,0,1,0,0,0,0,0,1
0,1,0,1,1,0,0,0,0,1
0,0,0,0,0,1,0,0,0,1
0,0,0,1,0,0,1,0,0,1
0,0,0,1,1,0,1,1,0,1
0,0,0,0,0,1,0,0,1,1
其他限制:
- 素数对角线总是1
- 我感兴趣的是是否有解决方案,而不仅仅是解决方案本身
我需要一种可扩展到更大网络的算法,至少100个输入/输出。关于异或的一个有趣的事情是:
a ^ b ^ b = a
这允许进行很好的操作,比如说:
a ^ b = c
然后,您可以通过xor
使用b
对两侧进行排序,轻松算出a
,得到:
a = c ^ b
如果我处在你的位置,我会用这个技巧从输出中获取输入。方程中出现的和
ing仅具有从某些方程中删除某些输入变量的效果,因此它不会对这种方法造成任何问题
首先,您必须知道,对于特定的系数矩阵,可能没有解决方案,例如,如果输入从未出现在任何方程中(即,矩阵中的一列全零),或者一个方程出现两次(即,两行相同),或者一个方程是两个其他方程的组合
现在,假设你的矩阵确实产生了问题的解决方案,方法是使用每个方程来找到一个输入。对于每个方程,xor
除一个输入外的所有输入的两侧(并为每个方程更改此输入)。例如,假设我想使用第一个方程式来查找i0
,第二个方程式来查找i1
(注意,输入必须出现在方程式中才能生成此值),我现在可以:
i0 = o0 ^ i1 ^ i3
i1 = o1 ^ i3 ^ i4
继续其他方程式,然后用方程式中的值替换右侧的所有输入。递归重复,直到右侧仅包含输出。如果对所有方程式重复,将找到所有输入的值
我确信在求解线性方程组时,可以使用已经建立的方法优化此方法,尤其是利用矩阵形式。您可以在多项式时间内解决2-SAT问题,请参阅 这里是一个链接到一个快速算法(繁重的数学,我会继续寻找更好的链接) 与的另一个链接 编辑:虽然我在这方面找到了很多文章,但我没有看到多少可实现的代码。大部分工作都是为了证明可满足性。您可能需要简化子句(删除每次运行时带零的子句),然后使用递归算法证明不可满足性,如果您发现满足了,那么您就解决了问题。使用XOR(而不是OR),乍一看,某种形式的函数至少可以简化问题。改编维基百科关于reduced的文章中的伪代码,我们得到: 在此基础上,您可以调整算法以生成行的可能输入,同时考虑前面行的分区。生成分区是一个很好的记忆选择
仍然需要进行时间分析,以确定上述内容是否值得。看来我的答案比预期/要求的水平要低得多。对不起~!实际上这很好。是关于我现在的处境。基本上,我正在尝试实现Gussian消除。但不知何故,我到目前为止尝试过的两种不同的实现都出现了故障。我只接受了另一个答案,因为他提供了伪代码,这正是我想要的。但你所说的异或为我指明了正确的方向,让我来弄清楚。谢谢不客气:)如果我处在你的位置,我也会接受他的回答+我向他致敬!嘿,我刚到了一个类似的状态。基本上,我认为唯一有意义的基本行操作是将行异或在一起。但后来我得到了那一排0,我想这行不通。现在我意识到仍然可以有多个解决方案,因此我可以得到自由变量。所以我所能做的就是尽可能地减少它,然后对0行尝试所有可能的输入。谢谢
function ToReducedRowEchelonForm(Matrix M) is
// 'lead' is the column index in a row of the leading 1
lead := 0
rowCount := the number of rows in M
columnCount := the number of columns in M
for 0 ≤ r < rowCount do
if columnCount ≤ lead then
stop
end if
i = r
// Find row with lead point
while M[i, lead] = 0 do
i = i + 1
if rowCount = i then
// no pivot in this column, move to next
i = r
lead = lead + 1
if columnCount = lead then
stop
end if
end if
end while
Swap rows i and r
for 0 ≤ i < rowCount do
if i ≠ r do
Set row i to row i XOR row r
end if
end for
lead = lead + 1
end for
end function
1,0,0,0,0,0,0,1,0,0
0,1,0,0,0,0,0,0,0,0
0,0,1,0,0,0,0,0,0,0
0,0,0,1,0,0,0,1,0,1
0,0,0,0,1,0,0,1,0,0
0,0,0,0,0,1,0,0,0,1
0,0,0,0,0,0,1,1,0,0
0,0,0,0,0,0,0,0,1,0
0,0,0,0,0,0,0,0,0,0