C++ 如何求解异或方程组?

C++ 如何求解异或方程组?,c++,algorithm,xor,linear-equation,C++,Algorithm,Xor,Linear Equation,我必须解一个由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] [a b; c d] -> [a b; 0 d-(b*c/a)] -> [a 0; 0 d-(b*c/a)] -> [1 0; 0 1] i[

我必须解一个由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]
[a b; c d] -> [a b; 0 d-(b*c/a)] -> [a 0; 0 d-(b*c/a)] -> [1 0; 0 1]
i[n]
p[n]
是16位整数

因此,据我所知,我最终将得到一个32x32矩阵(只包含1和0)和一个32结果向量


显然,高斯消去法是我所需要的,但我无法集中精力解决这个问题,有人能告诉我如何解决这个问题吗?

是的,你可以用高斯消去法来解决这个问题。关键是要认识到异或运算等价于模2的加法。所以你写的等式等于

i[0] = (p[0] + p[4] + ... ) mod 2
然后可以将整个系统设置为矩阵方程

M*p=i mod 2

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

如果你熟悉求解正则方程组,这并不是一个很大的进步。在方程组中使用实数时,您可以这样做:

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]
[a b; c d] -> [a b; 0 d-(b*c/a)] -> [a 0; 0 d-(b*c/a)] -> [1 0; 0 1]
注意:这里我使用MATLAB矩阵表示法,以便于输入

重要的是,所有这些矩阵运算(即除法、乘法、加法和减法)都适用于任何字段,而不仅仅是实数。如果您不熟悉术语字段,它只是指允许乘法、求反、求逆、加法等的一组值

这就带我们去解xor方程组。您当前将系统描述为一组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]
…
其中,第二组括号表示16位值中的
偏移量。所以,你们的每一个小方程都相当于16个方程

布尔型上的单位异或运算形成一个字段。在这个字段中,我们将“加法”操作符等价于xor。我们可以如下定义加法表和乘法表:

1 + 0 = 0 + 1 = 1; 1 + 1 = 0 + 0 = 0
1 * 0 = 0 * 1 = 0 * 0 = 0; 1 * 1 = 1
除法只能被1除(因为不能被零除),因此除法运算符保留元素不变

有了这个,你应该能够为你的xor方程组建立一个矩阵。该矩阵将完全由1和0组成。然后使用gauss-jordan消去算法(其实并不难实现),就像对普通实数一样。这将允许您反转矩阵并找到解决方案


我个人对这个问题很感兴趣,我写了一个小的C++矩阵实现,允许你提供任何你喜欢的字段。这可能是一个很好的起点,或者您甚至可能希望完全使用我的代码!以下是Github上的源代码:。我特别建议查看ANMatrix上的invert()方法。

我发现您的问题不清楚。而不是“…(15 xor)”显示一个完整的示例。您将得到32个16位数字,或者(逻辑上)一个32x16矩阵。你是如何得到32x32的?给出了什么,你想解决什么?我编辑并添加了一个完整的例子。我想求解p[0..31],给出了I[0..31]。我认为32 x32是因为我有32个方程组成的p(0…31)系数为0或1。谢谢你的解释,但我想出了一个方法来做C++,我会把我的代码添加到岗位上的人可能需要它:)谢谢我所需要的是提醒XOR是一个附加的MOD 2!