10 template <
typename Matrix>
13 assert(abs(ul * lr - ll * ur) == 1);
14 for (
size_t c = 0; c < matrix.size2(); ++c)
16 long long x = matrix(row1, c);
17 long long y = matrix(row2, c);
18 if ((abs(x) > (1L << 31)) || (abs(y) > (1L << 31))
19 || (abs(ul) > (1L << 31)) || (abs(ur) > (1L << 31)))
21 throw std::runtime_error(
"Numbers too large.");
23 matrix(row1, c) = ul * x + ur * y;
24 matrix(row2, c) = ll * x + lr * y;
28 template <
typename Matrix>
31 if (matrix(row2, column) == 0)
34 long long x = matrix(row1, column);
35 long long y = matrix(row2, column);
36 if (x > (1L << 31) || x < -1 * (1L << 32) || y > (1L << 31) || y < -1 * (1L << 32))
38 throw std::runtime_error(
"Numbers too large.");
41 long long g =
gcd(x, y, s, t);
53 template <
typename Matrix>
60 template <
typename InputMatrix,
typename OutputMatrix>
62 std::vector <size_t>& column_basis)
64 output_matrix = input_matrix;
69 for (rank = 0; rank < permuted_matrix.
size1(); ++rank)
73 for (
size_t c = rank; c < permuted_matrix.
size2(); ++c)
87 for (
size_t r = rank; r < permuted_matrix.
size1(); ++r)
89 if (permuted_matrix(r, rank) != 0)
97 for (
size_t r = rank + 1; r < permuted_matrix.
size1(); ++r)
103 for (
size_t p = rank; p > 0; --p)
105 long long entry = permuted_matrix(p - 1, p - 1);
108 for (
size_t c = p; c < permuted_matrix.
size2(); ++c)
109 g =
gcd(g, permuted_matrix(p - 1, c));
118 for (
size_t c = p - 1; c < permuted_matrix.
size2(); ++c)
120 assert(permuted_matrix(p - 1, c) % g == 0);
121 permuted_matrix(p - 1, c) /= g;
126 for (
size_t r = 0; r < p - 1; ++r)
128 long long factor = permuted_matrix(r, p - 1) / entry;
129 for (
size_t c = p - 1; c < permuted_matrix.
size2(); ++c)
131 permuted_matrix(r, c) -= factor * permuted_matrix(p - 1, c);
136 output_matrix.resize(rank, output_matrix.size2());
138 for (
size_t r = 0; r < rank; ++r)
139 column_basis.push_back(permuted_matrix.
perm2()(r));
Base class for matrices whose entries have type V.
Definition: matrix.hpp:55
Definition: matrix_permuted.hpp:17
const permutation_type & perm2() const
Definition: matrix_permuted.hpp:92
size_type size2() const
Definition: matrix_permuted.hpp:65
size_type size1() const
Definition: matrix_permuted.hpp:56
Definition: matrix_transposed.hpp:47
Definition: algorithm.hpp:14
void matrix_permute1(MatrixType &matrix, size_t index1, size_t index2)
Definition: matrix.hpp:1723
T gcd(T a, T b, T &s, T &t)
Definition: gcd.hpp:29
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
matrix_transposed< MatrixType > make_transposed_matrix(MatrixType &matrix)
Definition: matrix_transposed.hpp:148
size_t matrix_find_column_basis_and_transform_integral(const InputMatrix &input_matrix, OutputMatrix &output_matrix, std::vector< size_t > &column_basis)
Definition: linear_algebra.hpp:61
bool matrix_column_zero(const Matrix &matrix, size_t column, size_t row_first, size_t row_beyond)
Definition: matrix.hpp:1689
void matrix_row_combine(Matrix &matrix, size_t row1, size_t row2, long long ul, long long ur, long long ll, long long lr)
Definition: linear_algebra.hpp:11
void matrix_permute2(MatrixType &matrix, size_t index1, size_t index2)
Definition: matrix.hpp:1740