summaryrefslogtreecommitdiff
path: root/content/math
diff options
context:
space:
mode:
Diffstat (limited to 'content/math')
-rw-r--r--content/math/lgsFp.cpp45
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