6

我必须解决一个由 32 个异或方程组成的系统,每个方程涉及 32 个变量中的 15 个。一个看起来像这样:

i[0] = p[0] ^ p[4] ^ p[5] ^ p[10] ^ p[11] ^ p[20] ^ p[21] ^ p[22] ^ p[23] ^ p[25] ^ p[26] ^ p[27] ^ p[28] ^ p[30] ^ p[31]

i[n]并且p[n]是 16 位整数。

所以据我了解,我最终会得到一个 32x32 矩阵(仅包含 1 和 0)和 32 结果向量。

显然高斯消除是我需要的,但我无法解决这个问题,有人能给我一些关于如何解决这个问题的见解吗?

4

2 回答 2

6

是的,您可以使用高斯消元法来解决这个问题。关键是要认识到异或运算相当于模2加法。所以你写的方程相当于

i[0] = (p[0] + p[4] + ... ) mod 2

然后,您可以将整个系统设置为矩阵方程

M*p=i mod 2

您可以像往常一样使用高斯消元法来解决这个问题,只是您的所有操作都将以 2 为模执行。由于您的矩阵包含很多 0,因此您将不得不使用旋转,但除此之外,算法是相同的。

于 2013-10-13T23:44:09.023 回答
1

如果您熟悉求解常规方程组,那么这并不是一个重大进步。在方程组中使用实数时,您可以像这样进行消除:

[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]
…

其中第二组括号表示bit16 位值中的偏移量。所以,你的每个小方程都相当于 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() 方法。

于 2013-10-14T17:03:57.700 回答