Я кодирую на языке Си.У меня есть матрица 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
Спасибо за вашу помощь.