高斯消除GF2代码

时间:2018-08-15 21:17:55

标签: php gaussian

我有这个gauss_eliminate函数,但是我不想让它处理实数,而是希望它对二进制值起作用。 我需要GF2 gauss_eliminate函数,其中输入为二进制,输出为二进制。 这样会产生实数值,而不是二进制数值,例如 0.57142857142857 0.71428571428571 -0.42857142857143 -0.28571428571429 0.14285714285714

高斯消除具有以下三个允许的步骤: 1)交换两行(以实现某种外观) 2)将行乘以非零数字, 3)将一行的倍数添加到另一行。 -在GF2中:加法运算是XOR:0 + 0 = 0、0 + 1 = 1、1 + 0 = 1、1 + 1 = 0 乘法是AND运算:0 * 0 = 0,0 * 1 = 0,1 * 0 = 0,1 * 1 = 1

function gauss_eliminate($A, $b, $N)
{
for ($col = 0; $col < $N; $col++) {
    $j = $col;
    $max = $A[$j][$j];

    for ($i = $col + 1; $i < $N; $i++) {
        $tmp = abs($A[$i][$col]);
        if ($tmp > $max) {
            $j = $i;
            $max = $tmp;
        }
    }

    swap_rows($A, $b, $col, $j);

    for ($i = $col + 1; $i < $N; $i++) {
        $tmp = $A[$i][$col] / $A[$col][$col];
        for ($j = $col + 1; $j < $N; $j++) $A[$i][$j] -= $tmp * $A[$col][$j];
        $A[$i][$col] = 0;
        $b[$i] -= $tmp * $b[$col];
    }
}
$x = array();
for ($col = $N - 1; $col >= 0; $col--) {
    $tmp = $b[$col];
    for ($j = $N - 1; $j > $col; $j--) $tmp -= $x[$j] * $A[$col][$j];
    $x[$col] = $tmp / $A[$col][$col];
}
return $x;
}

新代码#1仍然无效:

function gauss_eliminate($A, $b, $N)
{
for ($col = 0; $col < $N; $col++) {
    $j = $col;
    $max = $A[$j][$j];

    for ($i = $col + 1; $i < $N; $i++) {
        $tmp = abs($A[$i][$col]);
        if ($tmp > $max) {
            $j = $i;
            $max = $tmp;
        }
    }

    swap_rows($A, $b, $col, $j);

    for ($i = $col + 1; $i < $N; $i++) {
        for ($j = $col + 1; $j < $N; $j++) 
          $A[$i][$j]=( $A[$i][$j] != $A[$col][$j] ) ? 1 : 0;
        $A[$i][$col] = 0;
        $b[$i]=( $b[$i] != $b[$col] ) ? 1 : 0;
    }
}
$x = array();
for ($col = $N - 1; $col >= 0; $col--) {
#        $tmp = $b[$col];    
#        for ($j = $N - 1; $j > $col; $j--) $tmp -= $x[$j] * $A[$col][$j];
    $x[$col] = ( $x[$col] != $A[$col][$j] ) ? 1 : 0;
}
return $x;
}

新代码#2-仍然不起作用-更改tmp设置

function gauss_eliminate($A, $b, $N)
{ 
for ($col = 0; $col < $N; $col++) {
    $j = $col;
    $max = $A[$j][$j];

    for ($i = $col + 1; $i < $N; $i++) {
        $tmp = abs($A[$i][$col]);
        if ($tmp > $max) { $j = $i; $max = $tmp; }
    }
    swap_rows($A, $b, $col, $j);

    for ($i = $col + 1; $i < $N; $i++) {
#            $tmp = $A[$i][$col] / $A[$col][$col];
        for ($j = $col + 1; $j < $N; $j++) $A[$i][$j]=($A[$i][$j] != $A[$col][$j] ? 1 : 0);
        $A[$i][$col] = 0;
        $b[$i] = ( $b[$i] != $b[$col] ? 1 : 0);
    }
}
$x = array();
for ($col = $N - 1; $col >= 0; $col--) {
    $tmp = $b[$col];
    for ($j = $N - 1; $j > $col; $j--) $tmp = 1 - $tmp;
    $x[$col] = ($tmp != $A[$col][$j] ? 1 : 0);
}
return $x;
}

1 个答案:

答案 0 :(得分:0)

看来我找到了正确的语法。在以一种有意义的方式修改代码后,我得到了一个示例的正确结果。...将-转换为+,然后将此+转换为XOR,而/被忽略,*为AND。 仍然可以确认此代码正确无误。

function gauss_eliminate($A, $b, $N) {
for ($col = 0; $col < $N; $col++) {
    $j = $col;
    $max = $A[$j][$j];

    for ($i = $col + 1; $i < $N; $i++) {
        $tmp = abs($A[$i][$col]);
        if ($tmp > $max) {
            $j = $i;
            $max = $tmp;
        }
    }
    swap_rows($A, $b, $col, $j);

    for ($i = $col + 1; $i < $N; $i++) {
#            $tmp = $A[$i][$col] / $A[$col][$col];
#            for ($j = $col + 1; $j < $N; $j++) {
#                $A[$i][$j] -= $tmp * $A[$col][$j];
#            }
#            $A[$i][$col] = 0;
#            $b[$i] -= $tmp * $b[$col];
        $tmp = $A[$i][$col];
        for ($j = $col + 1; $j < $N; $j++) {  
#                $A[$i][$j] = $A[$i][$j] + ( $tmp * $A[$col][$j] );
            $A[$i][$j] = ( $A[$i][$j] != ( $tmp && $A[$col][$j] ) ) ? 1 : 0;
        }
        $A[$i][$col] = 0;
#            $b[$i] = $b[$i]  + ($tmp * $b[$col]);
        $b[$i] = ( $b[$i] != ($tmp && $b[$col]) ) ? 1 : 0;
    }
}
$x = array();
for ($col = $N - 1; $col >= 0; $col--) {
    $tmp = $b[$col];
    for ($j = $N - 1; $j > $col; $j--) {
#            $tmp -= $x[$j] * $A[$col][$j];
#            $tmp = $tmp + ($x[$j] * $A[$col][$j]);
        $tmp = ( $tmp != ($x[$j] && $A[$col][$j]) ) ? 1 : 0;
    }  
#        $x[$col] = $tmp / $A[$col][$col];
    $x[$col] = $tmp;
}
return $x;
}

带注释的文本是旧的(非GF2代码),也是我“中间步骤”,显示了将+转换为XOR,*转换为AND等的地方

相关问题