From 805dc08146eb5596bd55d097ee80e9163ad45f45 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Thu, 28 Sep 2023 10:55:22 +0800 Subject: [PATCH] miner improve --- src/include/client.h | 131 +++++++++++++++++++++++++++++-------------- 1 file changed, 88 insertions(+), 43 deletions(-) diff --git a/src/include/client.h b/src/include/client.h index 290503e..9aa6544 100644 --- a/src/include/client.h +++ b/src/include/client.h @@ -153,6 +153,7 @@ void PrintEquations(std::vector > equations) { std::cout << std::endl; } } +inline int RandIntLessThan(int n) { return RawRnd() % n; } /** * @brief The definition of function GenerateEquations() * @@ -217,6 +218,8 @@ std::vector > GenerateEquations() { } } // PrintEquations(equations); + // randome shuffle lines of equations using RawRnd + std::random_shuffle(equations.begin(), equations.end(), RandIntLessThan); return equations; } /** @@ -241,20 +244,61 @@ std::vector > GaussianJordanElimination( int n = equations.size(); if (n == 0) return equations; int m = equations[0].size(); + std::vector equa_template; + equa_template.resize(m); // assert(n + 1 == m); - for (int i = 0; i < n; i++) { - int pivot = i; - for (int j = i + 1; j < n; j++) - if (abs(equations[j][i]) > abs(equations[pivot][i])) pivot = j; - std::swap(equations[i], equations[pivot]); - if (abs(equations[i][i]) < eps) continue; - const double pivot_value = equations[i][i]; - for (int j = 0; j < m; j++) equations[i][j] /= pivot_value; - for (int j = 0; j < n; j++) - if (j != i) { - const double tmp = equations[j][i]; - for (int k = 0; k < m; k++) equations[j][k] -= tmp * equations[i][k]; + for (int tot = 0; tot < 3; tot++) { + n = equations.size(); + for (int i = 0; i < n; i++) { + int pivot = i; + for (int j = i + 1; j < n; j++) + if (abs(equations[j][i]) > abs(equations[pivot][i])) pivot = j; + std::swap(equations[i], equations[pivot]); + if (abs(equations[i][i]) < eps) continue; + const double pivot_value = equations[i][i]; + for (int j = 0; j < m; j++) equations[i][j] /= pivot_value; + for (int j = 0; j < n; j++) + if (j != i) { + const double tmp = equations[j][i]; + for (int k = 0; k < m; k++) equations[j][k] -= tmp * equations[i][k]; + } + } + // continue; + for (int i = 0; i < equations.size(); i++) { + bool error_occur = false; + int total_num = 0; + for (int j = 0; j < m - 1; j++) { + int v = NearbyInt(equations[i][j]); + if (v == error_status_of_nearint || v < 0) { + error_occur = true; + break; + } + total_num += v; } + if (error_occur) continue; + if(total_num==1) continue; + if (NearbyInt(equations[i][m - 1]) == 0) { + for (int j = 0; j < m - 1; j++) + if (NearbyInt(equations[i][j]) > 0) { + equations.push_back(equa_template); + for (int k = 0; k < m; k++) equations[equations.size() - 1][k] = 0; + equations[equations.size() - 1][m - 1] = 0; + equations[equations.size() - 1][j] = 1; + } + equations.erase(equations.begin()+i); + i--; + } else if (NearbyInt(equations[i][m - 1]) == total_num) { + for (int j = 0; j < m - 1; j++) + if (NearbyInt(equations[i][j]) > 0) { + equations.push_back(equa_template); + for (int k = 0; k < m; k++) equations[equations.size() - 1][k] = 0; + equations[equations.size() - 1][m - 1] = 1; + equations[equations.size() - 1][j] = 1; + } + equations.erase(equations.begin()+i); + i--; + } + } } return equations; } @@ -286,11 +330,12 @@ void InterpretResult(std::vector > equations) { if (number_of_1 != 1) continue; int sol = NearbyInt(equations[i][m - 1]); if (sol == error_status_of_nearint) continue; - if(sol!=0&&sol!=1) - { - std::cerr<<"sol="<