#include #include #include "include/externs.h" #include "include/matrix.h" /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * R A N K A L G O R I T H M R O U T I N E S * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #define MATRIX_FORWARD_ELIMINATION 0 #define MATRIX_BACKWARD_ELIMINATION 1 int computeRank(int M, int Q, BitSequence **matrix) { int i, rank, m=MIN(M,Q); /* FORWARD APPLICATION OF ELEMENTARY ROW OPERATIONS */ for ( i=0; i0; i-- ) { if ( matrix[i][i] == 1 ) perform_elementary_row_operations(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix); else { /* matrix[i][i] = 0 */ if ( find_unit_element_and_swap(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix) == 1 ) perform_elementary_row_operations(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix); } } rank = determine_rank(m, M, Q, matrix); return rank; } void perform_elementary_row_operations(int flag, int i, int M, int Q, BitSequence **A) { int j, k; if ( flag == MATRIX_FORWARD_ELIMINATION ) { for ( j=i+1; j=0; j-- ) if ( A[j][i] == 1 ) for ( k=0; k= 0) && (A[index][i] == 0) ) index--; if ( index >= 0 ) row_op = swap_rows(i, index, Q, A); } return row_op; } int swap_rows(int i, int index, int Q, BitSequence **A) { int p; BitSequence temp; for ( p=0; p