Уменьшение Гаусса с четным вектором результата - PullRequest
0 голосов
/ 20 мая 2018

Я кодирую на языке Си.У меня есть матрица A , я уменьшаю эту матрицу по модулю 2 и называю результат B .

Теперь я хотел бы решить B * X = C , где C - четный вектор (все значенияэтого вектора четные) действительно, мне бы хотелось, чтобы C был 0-вектором по модулю 2.

Если я попытаюсь использовать уменьшение Гаусса с C равно 0-вектору, поэтому он, естественно, дает мне все коэффициенты x_i из X , равные 0.

Я не знаю, как сделать, чтобы уменьшение Гаусса (не все значения x_i , равные 0) дают четный вектор ...

Может быть, небольшая картинкадля более полного понимания: ссылка на картинку

Мой код:

int valAbs( int n ) {
    return ( n < 0 ) ? -n : n;
}

// Alloc a matrice nb_lignes (lines) * nb_colonnes (columns)
// Where nb_colonnes = nb_lignes + 1 because I put the vector C in the
// last column
int ** newMatrice( unsigned long long int nb_lignes, unsigned long long int nb_colonnes ) {

    int **mat = malloc( nb_lignes * sizeof( int* ) );

    for ( unsigned long long int i=0; i < nb_lignes; i++ ) {
        mat[ i ]= malloc( nb_colonnes * sizeof( int ) );
    }

    return mat;
}

// If you want print the system :
void afficheSysteme( int **m, unsigned long long int nb_lignes, unsigned long long int nb_colonnes ) {

    printf(" /\n");

    for ( unsigned  long long int i = 0; i < nb_lignes; i++ ) {

        printf("|  ");

        for( unsigned  long long int j = 0; j < nb_colonnes; j++ ) {

            if( j != nb_colonnes - 1 ) {

                if( m[ i ][ j ] >= 0 && j )
                    printf( " + " );

                printf( "%3d*X%llu", m[ i ][ j ], j );
            }
            else {
                printf( " = %3d  (L%llu)", m[ i ][ j ], i );
            }
        }
        printf( "\n" );
    }

    printf( " \\ \n" );
}


// Apply Gauss
void gauuss( int **m, unsigned long long int nb_ligne, unsigned long long int nb_colonne,  double *sol ) {

    for( unsigned long long int col = 0; col < nb_colonne - 1; col++) {

        // Get pivot line
        unsigned long long int lignePiv = getPivot( m, col, nb_ligne );


        //permutat line 'col' (where we are) and lignePiv (line of pivot)
        for ( unsigned long long int i = 0; i < nb_colonne; i++ ) {
            int tmp = m[ col ][ i ];
            m[ col ][ i ] = m[ lignePiv ][ i ];
            m[ lignePiv ][ i ] = tmp;
        }

        // Simplify the other lines
        for( unsigned long long int i = col + 1; i < nb_ligne; i++ ) { //pour chaque nb_ligne
            //    (nb_ligne col) * m[ col + 1 ][ col ]
            //    (nb_ligne i) * -m[ col ][ col ]
            int coef_piv= m[ i ][ col ];
            int coef_ligni = m[ col ][ col ];

            // For all colums
            for( unsigned long long int j = col; j < nb_colonne; j++ ) { 
                m[ i ][ j ] = coef_piv * m[ col ][ j ] - coef_ligni * m[ i ][ j ];
            }
        }

    }


    // Solve système

    sol[ nb_ligne - 1 ] = 0;

    if( m[ nb_ligne - 1 ][ nb_colonne - 2 ] != 0 )
        sol[ nb_ligne - 1 ] = (double) ( m[ nb_ligne - 1 ][ nb_colonne - 1 ] ) / (double) ( m[ nb_ligne - 1 ][ nb_colonne - 2 ] );


    //fill in the solutions table (opposite direction)
    for( unsigned long long int i = nb_ligne - 1; i >= 0; i-- ) { 
        double sigma = 0;


        for ( unsigned long long int j = i + 1; j <= nb_ligne - 1; j++ ) { 

            //calcul of sigma
            sigma += m[ i ][ j ] * sol[ j ];
        }

        sol[ i ] = 0;

        if( m[ i ][ i ] != 0 )
            sol[ i ] = ( m[ i ][ nb_ligne ] - sigma ) / m[ i ][ i ];

        if( i == 0 )
            break;
    }
}

//Pseudo application
// For exemple, I try to solve :
// 0x + 0y = 0 mod 2;
// 1x + 1y = 0 mod 2;
unsigned long long int nb_lines = 2;
unsigned long long int nb_columns = 3;

int ** matrix = newMatrice( nb_lines, nb_columns );

// Initialize coefficients 
matrix[ 0 ][ 0 ] = 0;
matrix[ 0 ][ 1 ] = 0;
matrix[ 1 ][ 0 ] = 1;
matrix[ 1 ][ 1 ] = 1;

// Initialize vector C
matrix[ 0 ][ 2 ] = 0;
matrix[ 1 ][ 2 ] = 0;

// Try gauss
double *sol = calloc( nb_lines,  sizeof( double ) );

gauuss( matrix, nb_lines, nb_columns, sol );

// show solutions
printf( ">>> Solutions <<<\n" );
for( unsigned long long int i = 0; i < nb_lines; i++ ) {
    printf( "\tx%llu = %.3f\n", i, sol[i] );
}

Результат выполнения этого кода даст мне:

x0 = 0.000
x1 = 0.000

Меня интересует поиск комбинации столбцов матрицы, в которой сумма равна0-вектор по модулю 2. Например, если мы возьмем коэффициенты этой матрицы,

0 + 0 = 0 // 0 is even
1 + 1 = 2 // 2 is even

Так что я хотел бы, чтобы x0 = 1 и x1 = 1

Спасибо за вашу помощь.

...