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