使用自定义运算符进行高斯消除

时间:2009-08-01 08:34:07

标签: javascript algorithm math

当运算符是自定义运算符而不是标准算术运算符时,实现高斯消元法的好方法是什么?

以下是运营商:

增加:

0 + 0 = 0
0 + 1 = 1
1 + 1 = 0

减法:

0 - 0 = 0
0 - 1 = 1
1 - 1 = 0

乘:

0 * 0 = 0
0 * 1 = 0
1 * 1 = 1

司:

0 / 0 = illegal
0 / 1 = 0
1 / 1 = 1

以下是一组方程组作为增广矩阵,RHS位于最右侧的列中:

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

此套装的解决方案是:

x1 = 1
x2 = 0
x3 = 0
x4 = 0
x5 = 1
x6 = 1
x7 = 1
x8 = 1
x9 = 0

高斯消除对我来说失败了,因为我在这个集合上尝试了它。

方程将有9,16,25或36项。如果算法可以轻松扩展到更大的方块(最多100个),那将会很棒。 我正在寻找一种算法,最好用伪代码或JavaScript。

2 个答案:

答案 0 :(得分:6)

伪代码中的高斯消元算法可以找到here

如果使用“普通”数字或者如果您处于Z 2 环中,则无关紧要,算法保持不变。

您可以做的是实现一个结构来保存您正在操作的值并使所有必需的运算符超载。然后,您需要做的就是将伪代码重写为您想要使用它的语言。

不幸的是,由于你提到了JavaScript,你不能用这种语言覆盖运算符,所以这会变得有点复杂。我想你可以定义执行操作员作业的函数,并使用它们代替标准运算符。

function add(v1, v2) {
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) {
        alert('Invalid params');
        return;
    }

    return (v1 + v2) % 2;
}

function subtract(v1, v2) {
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) {
        alert('Invalid params');
        return;
    }

    return Math.abs((v1 - v2) % 2);
}

function multiply(v1, v2) {
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) {
        alert('Invalid params');
        return;
    }

    return v1 * v2;
}

function divide(v1, v2) {
    if ((v1 != 0 && v1 != 1) || (v2 != 0 && v2 != 1)) {
        alert('Invalid params');
        return;
    } else if (v2 == 0) {
        alert('Divider cannot be zero');
        return;
    }

    return v1 / v2;
}

答案 1 :(得分:3)

您所描述的并不是真正的自定义运算符。相反,它是Z 2 ,标准加法和乘法模2。

这是field;所以你没有任何“分数”问题。

高斯消元算法不限于实数域;它在Z 2 上也有效。