diff --git a/2025.04.04/14Ex/solve.c b/2025.04.04/14Ex/solve.c index f99783d..ec62a74 100644 --- a/2025.04.04/14Ex/solve.c +++ b/2025.04.04/14Ex/solve.c @@ -13,7 +13,7 @@ int t14_solve(int n, double * restrict A, double * restrict X, int * restrict c) double maximum = -1.; int max_i = 0, max_j = 0; - //printf("\n--------- K = %d ---------\n", k); +// printf("\n--------- K = %d ---------\n", k); // Ищем максимальный элемент минора #pragma omp parallel @@ -48,7 +48,7 @@ int t14_solve(int n, double * restrict A, double * restrict X, int * restrict c) if (fabs(maximum) < DBL_EPSILON) return SINGULAR; - //printf("Maximum = %lf for i = %d, j = %d\n", maximum, max_i, max_j); +// printf("Maximum = %lf for i = %d, j = %d\n", maximum, max_i, max_j); // Меняем строки местами, если максимум находится не в k строке if (max_i != k) @@ -79,8 +79,8 @@ int t14_solve(int n, double * restrict A, double * restrict X, int * restrict c) } } - //print_matrix(A, n, n); - //printf("\n"); +// print_matrix(A, n, n); +// printf("\n"); // Меняем столбцы местами if (max_j != k) @@ -90,23 +90,23 @@ int t14_solve(int n, double * restrict A, double * restrict X, int * restrict c) c[k] = swap_temp; #pragma omp simd - for (int in = k * n; in < n; in+=n) + for (int in = 0; in < n*n; in+=n) { double swap = A[in + k]; A[in + k] = A[in + max_j]; A[in + max_j] = swap; } } - /* - print_matrix(A, n, n); - printf("\n"); - */ + +// print_matrix(A, n, n); +// printf("\n"); + gauss_inverse(n, k, A, X); - /* - print_matrix(A, n, n); - printf("Inverse matrix:\n"); - print_matrix(X, n, n); - */ + +// print_matrix(A, n, n); +// printf("Inverse matrix:\n"); +// print_matrix(X, n, n); + } gauss_back_substitution(n, A, X); @@ -114,27 +114,38 @@ int t14_solve(int n, double * restrict A, double * restrict X, int * restrict c) // Возвращаем строки назад for (int k = 0; k < n; ++k) { - int str_i = c[k]; + int pnt_cur = c[k]; + + if (pnt_cur != k) + { + int pnt_nxt = 0; - if (str_i != k) + #pragma omp parallel for for (int j = 0; j < n; ++j) { - int loc_k = k; - int loc_i = str_i; - double elem = X[k*n + j]; - + int loc_cur = pnt_cur; + double temp_cur = X[k*n + j]; + double temp_nxt = 0; + do { - X[loc_i*n + j] = elem; - elem = X[loc_i*n + j]; - - loc_k = loc_i; - loc_i = c[loc_i]; - if (j == n-1) - c[loc_k] = loc_k; - } while (loc_i != k); + temp_nxt = X[loc_cur*n + j]; + X[loc_cur*n + j] = temp_cur; + temp_cur = temp_nxt; + + loc_cur = c[loc_cur]; + } while (loc_cur != k); - X[k*n + j] = elem; + X[k*n + j] = temp_cur; } + + do { + pnt_nxt = c[pnt_cur]; + c[pnt_cur] = pnt_cur; + pnt_cur = pnt_nxt; + } while (pnt_nxt != k); + + c[k] = k; + } } return 0; diff --git a/2025.04.04/14Ex/tests/d.txt b/2025.04.04/14Ex/tests/d.txt new file mode 100644 index 0000000..2121773 --- /dev/null +++ b/2025.04.04/14Ex/tests/d.txt @@ -0,0 +1,4 @@ +2 0 0 0 +0 3 0 0 +0 0 4 0 +0 0 0 5 diff --git a/2025.04.04/14Ex/tests/l.txt b/2025.04.04/14Ex/tests/l.txt new file mode 100644 index 0000000..832dd72 --- /dev/null +++ b/2025.04.04/14Ex/tests/l.txt @@ -0,0 +1,4 @@ +1 2 3 4 +0 5 6 7 +0 0 8 9 +0 0 0 10 diff --git a/2025.04.04/14Ex/tests/lz.txt b/2025.04.04/14Ex/tests/lz.txt new file mode 100644 index 0000000..8f53f92 --- /dev/null +++ b/2025.04.04/14Ex/tests/lz.txt @@ -0,0 +1,4 @@ +1 2 3 4 +5 6 7 8 +9 10 11 12 +6 9 12 15 diff --git a/2025.04.04/14Ex/tests/nr.txt b/2025.04.04/14Ex/tests/nr.txt new file mode 100644 index 0000000..a47d86d --- /dev/null +++ b/2025.04.04/14Ex/tests/nr.txt @@ -0,0 +1,4 @@ +1 2 0 4 +5 6 0 8 +9 10 0 12 +13 14 0 16 diff --git a/2025.04.04/14Ex/tests/ns.txt b/2025.04.04/14Ex/tests/ns.txt new file mode 100644 index 0000000..1f8a8ba --- /dev/null +++ b/2025.04.04/14Ex/tests/ns.txt @@ -0,0 +1,4 @@ +1 2 3 4 +5 6 7 8 +0 0 0 0 +9 10 11 12 diff --git a/2025.04.04/14Ex/tests/pr.txt b/2025.04.04/14Ex/tests/pr.txt new file mode 100644 index 0000000..2abf15e --- /dev/null +++ b/2025.04.04/14Ex/tests/pr.txt @@ -0,0 +1,4 @@ +1 2 3 4 +2 4 6 8 +5 6 7 8 +9 10 11 12 diff --git a/2025.04.04/14Ex/tests/rp.txt b/2025.04.04/14Ex/tests/rp.txt new file mode 100644 index 0000000..dfb5500 --- /dev/null +++ b/2025.04.04/14Ex/tests/rp.txt @@ -0,0 +1,4 @@ +1 2 3 4 +5 6 7 8 +1 2 3 4 +9 10 11 12 diff --git a/2025.04.04/14Ex/tests/w.txt b/2025.04.04/14Ex/tests/w.txt new file mode 100644 index 0000000..8eec100 --- /dev/null +++ b/2025.04.04/14Ex/tests/w.txt @@ -0,0 +1,4 @@ +5 7 6 5 +7 10 8 7 +6 8 10 9 +5 7 9 10