1 #ifndef LAS_COFACTOR_HPP_
2 #define LAS_COFACTOR_HPP_
3
4 // IWYU pragma: no_include <ext/alloc_traits.h>
5
6 #include <cstdint> // for uint32_t
7 #include <cstdio> // for FILE, NULL
8 #include <array> // for array, array<>::value_type
9 #include <mutex> // for mutex
10 #include <vector> // for vector
11 #include <gmp.h> // for mpz_sizeinbase
12 #include "cxx_mpz.hpp" // for cxx_mpz
13 #include "ecm/facul.hpp" // for facul_make_strategies, facul_strate...
14 #include "las-siever-config.hpp" // for siever_config::side_config, siever_...
15 #include "params.h" // param_list_ptr
16
17 class cofactorization_statistics {
18 FILE * file;
19 std::vector<std::vector<uint32_t>> cof_call;
20 std::vector<std::vector<uint32_t>> cof_success;
21 std::mutex lock;
22 public:
23 cofactorization_statistics(param_list_ptr pl);
active()24 bool active() { return file != NULL; }
25 void call(int bits0, int bits1);
26 void print();
call(std::array<cxx_mpz,2> const & norm,std::array<int,2> & cof_bitsize)27 void call(std::array<cxx_mpz, 2> const & norm, std::array<int, 2> & cof_bitsize) {
28 if (!active()) return;
29 cof_bitsize[0] = mpz_sizeinbase(norm[0], 2);
30 cof_bitsize[1] = mpz_sizeinbase(norm[1], 2);
31 call(cof_bitsize[0], cof_bitsize[1]);
32 }
success(std::array<int,2> const & cof_bitsize)33 void success(std::array<int, 2> const & cof_bitsize) {
34 if (!active()) return;
35 cof_success[cof_bitsize[0]][cof_bitsize[1]]++;
36 }
success(int bits0,int bits1)37 void success(int bits0, int bits1)
38 {
39 if (!file) return;
40 cof_success[bits0][bits1]++;
41 }
42 ~cofactorization_statistics();
43 static void declare_usage(cxx_param_list & pl);
44 };
45
46 int check_leftover_norm (cxx_mpz const & n, siever_config::side_config const & sc);
47
48 int factor_both_leftover_norms(
49 std::array<cxx_mpz, 2> & norms,
50 std::array<std::vector<cxx_mpz>, 2> &,
51 std::array<unsigned long, 2> const &,
52 facul_strategies_t const *);
53
54 /* handy shortcut. Can't have it defined at the facul.hpp level because
55 * facul does not know about las stuff. */
56 static inline facul_strategies_t* facul_make_strategies (siever_config const & conf, FILE* file, const int verbose);
facul_make_strategies(siever_config const & conf,FILE * file,const int verbose)57 static inline facul_strategies_t* facul_make_strategies (siever_config const & conf, FILE* file, const int verbose)
58 {
59 return facul_make_strategies(
60 conf.sides[0].lim,
61 conf.sides[0].lpb,
62 conf.sides[0].mfb,
63 conf.sides[1].lim,
64 conf.sides[1].lpb,
65 conf.sides[1].mfb,
66 (conf.sublat_bound == 0), // with sublat, some primes are skipped.
67 conf.sides[0].ncurves,
68 conf.sides[1].ncurves,
69 file, verbose);
70 }
71
72 #endif
73