如果您熟悉求解常规方程组,那么这并不是一个重大进步。在方程组中使用实数时,您可以像这样进行消除:
[a b; c d] -> [a b; 0 d-(b*c/a)] -> [a 0; 0 d-(b*c/a)] -> [1 0; 0 1]
注意:这里我使用 MATLAB 矩阵表示法以便于输入。
重要的认识是所有这些矩阵运算(即除法、乘法、加法和减法)都存在于任何领域,而不仅仅是实数。如果您不熟悉术语field,它仅表示允许乘法、取反、反转、加法等的一组值。
这将我们带入求解异或方程组。您目前将您的系统描述为一组异或在一起的 16 位值。但是,我选择将其表示为一组异或在一起的位的方式,例如,如果您的第一个等式是:
p[0] = a[1] ^ a[2]
我将其表示为:
p[0][0] = a[1][0] ^ a[2][0]
p[0][1] = a[1][1] ^ a[2][1]
…
其中第二组括号表示bit
16 位值中的偏移量。所以,你的每个小方程都相当于 16 个方程。
布尔值上的单个位异或运算形成一个字段。在该字段中,我们使“加法”运算符等效于 xor。我们可以定义加法和乘法表如下:
1 + 0 = 0 + 1 = 1; 1 + 1 = 0 + 0 = 0
1 * 0 = 0 * 1 = 0 * 0 = 0; 1 * 1 = 1
只能除以 1(因为您不能除以零),因此除法运算符保持元素不变。
有了这个,你应该能够为你的异或方程系统形成一个矩阵。该矩阵将完全由 1 和 0 组成。然后像处理普通实数一样使用 gauss-jordan 消除算法(实现起来真的不难)。这将允许您反转矩阵并找到解决方案。
我个人对这个问题非常感兴趣,因此我编写了一个小型 C++ 矩阵实现,它允许您提供您喜欢的任何字段。这可能是一个很好的起点,或者您甚至可能希望完全使用我的代码!这是 Github 上的源代码:XorSystem。我特别建议查看 ANMatrix 上的 invert() 方法。