From f8f53c2f9e63f0ac89b67dc4d413ec9a76415a73 Mon Sep 17 00:00:00 2001 From: Gloria Mundi Date: Sat, 7 Jun 2025 19:42:50 +0200 Subject: adapt Tutte matching to new Gauss, and remove some global variables --- test/math/lgsFp.cpp | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) (limited to 'test/math/lgsFp.cpp') diff --git a/test/math/lgsFp.cpp b/test/math/lgsFp.cpp index 9c7bda8..376a067 100644 --- a/test/math/lgsFp.cpp +++ b/test/math/lgsFp.cpp @@ -1,6 +1,5 @@ #include "../util.h" #include -vector> mat; constexpr ll mod = 1'000'000'007; namespace lgs { #include @@ -9,22 +8,18 @@ namespace lgs { vector> inverseMat(const vector>& m) { int n = ssize(m); - mat = m; + vector> mat = m; for (int i = 0; i < n; i++) { if (ssize(mat[i]) != n) cerr << "error: no square matrix" << FAIL; mat[i].resize(2*n); mat[i][n+i] = 1; } - lgs::gauss(ssize(mat), ssize(mat[0])); - vector> res(m); + vector pivots = lgs::gauss(mat); for (int i = 0; i < n; i++) { - res[i] = vector(mat[i].begin() + n, mat[i].end()); - for (int j = 0; j < n; j++) { - if (j != i && mat[i][j] != 0) cerr << "error: not full rank?" << FAIL; - if (j == i && mat[i][j] != 1) cerr << "error: not full rank?" << FAIL; - } + if (pivots[i] != i) cerr << "error: not full rank?" << FAIL; + mat[i].erase(begin(mat[i]), begin(mat[i]) + n); } - return res; + return mat; } vector> mul(const vector>& a, const vector>& b) { @@ -53,18 +48,17 @@ void test_square() { vector> m(n); for (auto& v : m) v = Random::integers(n, 0, mod); - mat = m; - lgs::gauss(ssize(mat), ssize(mat[0])); + lgs::gauss(m); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { - hash += mat[i][j]; + hash += m[i][j]; } } queries += n; } - cerr << "tested sqaures: " << queries << " (hash: " << hash << ")" << endl;; + cerr << "tested squares: " << queries << " (hash: " << hash << ")" << endl;; } void stress_test_inv() { @@ -82,8 +76,7 @@ void stress_test_inv() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { - if (i == j && prod[i][j] != 1) cerr << "error: not inverted" << FAIL; - if (i != j && prod[i][j] != 0) cerr << "error: not inverted" << FAIL; + if (prod[i][j] != (i == j)) cerr << "error: not inverted" << FAIL; } } @@ -98,15 +91,14 @@ void performance_test() { vector> m(N); for (auto& v : m) v = Random::integers(N, 0, mod); - mat = m; t.start(); - lgs::gauss(ssize(mat), ssize(mat[0])); + lgs::gauss(m); t.stop(); hash_t hash = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { - hash += mat[i][j]; + hash += m[i][j]; } } if (t.time > 500) cerr << "too slow: " << t.time << FAIL; -- cgit v1.2.3