12 template <
typename Matrix>
20 diagonal.resize(matrix.size1() < matrix.size2() ? matrix.size1() : matrix.size2(), 0);
28 if (permuted_matrix(handled, handled) < 0)
30 for (
size_t r = 0; r < permuted_matrix.
size1(); ++r)
31 permuted_matrix(r, handled) = -permuted_matrix(r, handled);
33 diagonal[handled] = permuted_matrix(handled, handled);
37 COLUMN_ZERO = 1, ROW_ZERO = 2, GCD = 4,
40 int tests = COLUMN_ZERO | ROW_ZERO;
44 if ((tests & COLUMN_ZERO) && !
matrix_column_zero(permuted_matrix, handled, handled + 1, permuted_matrix.
size1()))
47 for (
size_t r = handled + 1; r < matrix.size1(); ++r)
49 changed =
matrix_row_gcd(permuted_matrix, handled, r, handled) || changed;
58 if ((tests & ROW_ZERO) && !
matrix_row_zero(permuted_matrix, handled, handled + 1, permuted_matrix.
size2()))
61 for (
size_t c = handled + 1; c < permuted_matrix.
size2(); ++c)
73 for (
size_t r = handled + 1; r < permuted_matrix.
size1(); ++r)
75 for (
size_t c = handled + 1; c < permuted_matrix.
size2(); ++c)
77 if (
gcd(permuted_matrix(r, c), permuted_matrix(handled, handled)) != permuted_matrix(handled, handled))
79 for (
size_t r = handled; r < permuted_matrix.
size1(); ++r)
81 permuted_matrix(r, handled) += permuted_matrix(r, c);
Base class for matrices whose entries have type V.
Definition: matrix.hpp:55
Definition: matrix_permuted.hpp:17
size_type size2() const
Definition: matrix_permuted.hpp:65
size_type size1() const
Definition: matrix_permuted.hpp:56
Definition: algorithm.hpp:14
void matrix_permute1(MatrixType &matrix, size_t index1, size_t index2)
Definition: matrix.hpp:1723
bool find_smallest_nonzero_matrix_entry(const Matrix &matrix, size_t row_first, size_t row_beyond, size_t column_first, size_t column_beyond, size_t &row, size_t &column)
Definition: matrix.hpp:1652
T gcd(T a, T b, T &s, T &t)
Definition: gcd.hpp:29
void smith_normal_form_diagonal(Matrix &input_matrix, std::vector< int > &diagonal)
Definition: smith_normal_form.hpp:13
bool matrix_row_gcd(Matrix &matrix, size_t row1, size_t row2, size_t column)
Definition: linear_algebra.hpp:29
bool matrix_column_gcd(Matrix &matrix, size_t column1, size_t column2, size_t row)
Definition: linear_algebra.hpp:54
boost::numeric::ublas::matrix< long long > integer_matrix
Definition: common.hpp:27
bool matrix_column_zero(const Matrix &matrix, size_t column, size_t row_first, size_t row_beyond)
Definition: matrix.hpp:1689
bool matrix_row_zero(const Matrix &matrix, size_t row, size_t column_first, size_t column_beyond)
Definition: matrix.hpp:1680
void matrix_permute2(MatrixType &matrix, size_t index1, size_t index2)
Definition: matrix.hpp:1740