【发布时间】:2012-07-14 12:54:38
【问题描述】:
我有这个方程组1=x⊕y⊕z
1=x⊕y⊕w
0=x⊕w⊕z
1=w⊕y⊕z
我正在尝试实施高斯消除来解决该系统,如 here 所述,用 XOR 替换除法、减法和乘法,但它给出了我的错误答案..正确答案是 (x,y,z,w)=(0,1,0,0)
我做错了什么?
public static void ComputeCoefficents(byte[,] X, byte[] Y)
{
int I, J, K, K1, N;
N = Y.Length;
for (K = 0; K < N; K++)
{
K1 = K + 1;
for (I = K; I < N; I++)
{
if (X[I, K] != 0)
{
for (J = K1; J < N; J++)
{
X[I, J] /= X[I, K];
}
//Y[I] /= X[I, K];
Y[I] ^= X[I, K];
}
}
for (I = K1; I < N; I++)
{
if (X[I, K] != 0)
{
for (J = K1; J < N; J++)
{
X[I, J] ^= X[K, J];
}
Y[I] ^= Y[K];
}
}
}
for (I = N - 2; I >= 0; I--)
{
for (J = N - 1; J >= I + 1; J--)
{
//Y[I] -= AndOperation(X[I, J], Y[J]);
Y[I] ^= (byte)(X[I, J]* Y[J]);
}
}
}
【问题讨论】:
-
似乎有些可疑。乘以 1 应该使值保持不变 - 如果您将其替换为
xor,乘以 1 将反转所有内容。通常,如果用逻辑运算符替换算术,则加法将替换为or或xor。or没有简单的逆,但xor是它自己的逆。乘法替换为and。and没有简单的逆运算,但在这种情况下您不需要除法。你甚至不需要乘法。 -
此算法仅在特定条件下有效。它无论如何都不稳定。您可以离开第一个 for 循环,因为除法只会执行 1,这不会导致任何变化。那么,在我看来,剩下的
for (J = K1; J < N; J++)一定是for (J = 0; J < N; J++)。但同样,该算法并不稳定,您应该真正使用库来完成该任务。或者,如果您的问题不那么普遍,也许我们可以编写一个算法。