diff options
Diffstat (limited to 'content/math')
| -rw-r--r-- | content/math/lgsFp.cpp | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/content/math/lgsFp.cpp b/content/math/lgsFp.cpp index bf18c86..a4f3d0f 100644 --- a/content/math/lgsFp.cpp +++ b/content/math/lgsFp.cpp @@ -1,25 +1,20 @@ -void normalLine(int line, ll p) { - ll factor = multInv(mat[line][line], p); - for (ll& x : mat[line]) x = (x * factor) % p; -} - -void takeAll(int n, int line, ll p) { - for (int i = 0; i < n; i++) { - if (i == line) continue; - ll diff = mat[i][line]; - for (int j = 0; j < sz(mat[i]); j++) { - mat[i][j] -= (diff * mat[line][j]) % p; - mat[i][j] = (mat[i][j] + p) % p; -}}} - -void gauss(int n, ll mod) { - vector<bool> done(n, false); - for (int i = 0; i < n; i++) { - int j = 0; - while (j < n && (done[j] || mat[j][i] == 0)) j++; - if (j == n) continue; - swap(mat[i], mat[j]); - normalLine(i, mod); - takeAll(n, i, mod); - done[i] = true; -}} // für Eindeutigkeit, Existenz etc. siehe LGS über R @\sourceref{math/gauss.cpp}@ +vector<int> piv; +void gauss(){ + for(int r = 0, c = 0; c < m; c++){ + for(int i = r; i < n; i++){ + if(mat[i][c] != 0){ + swap(mat[r], mat[i]); + break; + }} + if(mat[r][c] == 0) continue; + ll f = multInv(mat[r][c], mod); + for(ll &x : mat[r]) x = x * f % mod; + for(int i = 0; i < n; i++){ + if(i == r) continue; + f = mat[i][c]; + for(int j = c; j < sz(mat[r]); j++){ + mat[i][j] = (mat[i][j] - f * mat[r][j] % mod + mod) % mod; + }} + piv.push_back(c); + if(++r == n) break; +}}
\ No newline at end of file |
