Skip to content

Commit ae36cf1

Browse files
committed
Fix linalg_bitset template argument deduction
1 parent 879824a commit ae36cf1

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

linear_algebra_matrix/linalg_bitset.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
#pragma once
22
#include <bitset>
33
#include <cassert>
4+
#include <cstddef>
45
#include <tuple>
56
#include <utility>
67
#include <vector>
78

89
// Gauss-Jordan elimination of n * m matrix M
910
// Complexity: O(nm + nm rank(M) / 64)
1011
// Verified: abc276_h (2000 x 8000)
11-
template <int Wmax>
12+
template <std::size_t Wmax>
1213
std::vector<std::bitset<Wmax>> f2_gauss_jordan(int W, std::vector<std::bitset<Wmax>> M) {
1314
assert(W <= Wmax);
1415
int H = M.size(), c = 0;
@@ -33,7 +34,7 @@ std::vector<std::bitset<Wmax>> f2_gauss_jordan(int W, std::vector<std::bitset<Wm
3334
}
3435

3536
// Rank of Gauss-Jordan eliminated matrix
36-
template <int Wmax> int f2_rank_gauss_jordan(int W, const std::vector<std::bitset<Wmax>> &M) {
37+
template <std::size_t Wmax> int f2_rank_gauss_jordan(int W, const std::vector<std::bitset<Wmax>> &M) {
3738
assert(W <= Wmax);
3839
for (int h = (int)M.size() - 1; h >= 0; h--) {
3940
int j = 0;
@@ -46,7 +47,7 @@ template <int Wmax> int f2_rank_gauss_jordan(int W, const std::vector<std::bitse
4647
// determinant of F2 matrix.
4748
// Return 0 if the matrix is singular, otherwise return 1.
4849
// Complexity: O(W^3 / 64)
49-
template <int Wmax> int f2_determinant(const std::vector<std::bitset<Wmax>> &M) {
50+
template <std::size_t Wmax> int f2_determinant(const std::vector<std::bitset<Wmax>> &M) {
5051
const int H = M.size();
5152
if (H > Wmax) return 0;
5253

@@ -70,7 +71,7 @@ template <int Wmax> int f2_determinant(const std::vector<std::bitset<Wmax>> &M)
7071
return 1; // nonsingular
7172
}
7273

73-
template <int W1, int W2>
74+
template <std::size_t W1, std::size_t W2>
7475
std::vector<std::bitset<W2>>
7576
f2_matmul(const std::vector<std::bitset<W1>> &A, const std::vector<std::bitset<W2>> &B) {
7677
int H = A.size(), K = B.size();
@@ -83,7 +84,7 @@ f2_matmul(const std::vector<std::bitset<W1>> &A, const std::vector<std::bitset<W
8384
return C;
8485
}
8586

86-
template <int Wmax>
87+
template <std::size_t Wmax>
8788
std::vector<std::bitset<Wmax>> f2_matpower(std::vector<std::bitset<Wmax>> X, long long n) {
8889
int D = X.size();
8990
std::vector<std::bitset<Wmax>> ret(D);
@@ -99,7 +100,7 @@ std::vector<std::bitset<Wmax>> f2_matpower(std::vector<std::bitset<Wmax>> X, lon
99100
// - retval: {true, one of the solutions, {freedoms}} (if solution exists)
100101
// {false, {}, {}} (otherwise)
101102
// Complexity: O(HW + HW rank(A) / 64 + W^2 len(freedoms))
102-
template <int Wmax, class Vec>
103+
template <std::size_t Wmax, class Vec>
103104
std::tuple<bool, std::bitset<Wmax>, std::vector<std::bitset<Wmax>>>
104105
f2_system_of_linear_equations(std::vector<std::bitset<Wmax>> A, Vec b, int W) {
105106
int H = A.size();

linear_algebra_matrix/linalg_bitset.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ vector<bitset<Wmax>> A;
1515
vector<bool> b;
1616

1717
// Solve Ax = b (x: F_2^W)
18-
auto [feasible, x0, freedoms] = f2_system_of_linear_equations<Wmax, vector<bool>>(A, b, W);
18+
auto [feasible, x0, freedoms] = f2_system_of_linear_equations(A, b, W);
1919

2020
// Calc determinant (or check whether A is regular)
21-
int det = f2_determinant<dim>(mat);
21+
int det = f2_determinant(mat);
2222
```
2323

2424
## 問題例

0 commit comments

Comments
 (0)