flint_sys/
qsieve.rs

1#![allow(non_snake_case)]
2#![allow(non_camel_case_types)]
3
4//! *See the [FLINT documentation](http://flintlib.org/doc/qsieve.html).
5
6use crate::deps::*;
7use crate::flint::*;
8use crate::fmpz::{fmpz, fmpz_t};
9use crate::fmpz_factor::fmpz_factor_struct;
10use libc::{c_char, c_int, c_uchar, c_void, pthread_mutex_t, FILE};
11
12#[repr(C)]
13#[derive(Debug, Copy, Clone)]
14pub struct prime_t {
15    pub pinv: mp_limb_t,
16    pub p: c_int,
17    pub size: c_char,
18}
19
20#[repr(C)]
21#[derive(Debug, Copy, Clone)]
22pub struct fac_t {
23    pub ind: mp_limb_signed_t,
24    pub exp: mp_limb_signed_t,
25}
26
27#[repr(C)]
28#[derive(Debug, Copy, Clone)]
29pub struct la_col_t {
30    pub data: *mut mp_limb_signed_t,
31    pub weight: mp_limb_signed_t,
32    pub orig: mp_limb_signed_t,
33}
34
35#[repr(C)]
36#[derive(Debug, Copy, Clone)]
37pub struct hash_t {
38    pub prime: mp_limb_t,
39    pub next: mp_limb_t,
40    pub count: mp_limb_t,
41}
42
43#[repr(C)]
44#[derive(Debug, Copy, Clone)]
45pub struct relation_t {
46    pub lp: mp_limb_t,
47    pub num_factors: mp_limb_signed_t,
48    pub small_primes: mp_limb_signed_t,
49    pub small: *mut mp_limb_signed_t,
50    pub factor: *mut fac_t,
51    pub Y: fmpz_t,
52}
53
54#[repr(C)]
55#[derive(Debug, Copy, Clone)]
56pub struct qs_poly_s {
57    pub B: fmpz_t,
58    pub soln1: *mut c_int,
59    pub soln2: *mut c_int,
60    pub posn1: *mut c_int,
61    pub posn2: *mut c_int,
62    pub small: *mut mp_limb_signed_t,
63    pub factor: *mut fac_t,
64    pub num_factors: mp_limb_signed_t,
65}
66
67pub type qs_poly_t = [qs_poly_s; 1usize];
68
69#[repr(C)]
70#[derive(Copy, Clone)]
71pub struct qs_s {
72    pub index_j: mp_limb_signed_t,
73    pub mutex: pthread_mutex_t,
74    pub handles: *mut thread_pool_handle,
75    pub num_handles: mp_limb_signed_t,
76    pub n: fmpz_t,
77    pub bits: mp_limb_t,
78    pub ks_primes: mp_limb_t,
79    pub k: mp_limb_t,
80    pub kn: fmpz_t,
81    pub num_primes: mp_limb_signed_t,
82    pub factor_base: *mut prime_t,
83    pub sqrts: *mut c_int,
84    pub small_primes: mp_limb_signed_t,
85    pub second_prime: mp_limb_signed_t,
86    pub sieve_size: mp_limb_signed_t,
87    pub sieve_bits: c_uchar,
88    pub sieve_fill: c_uchar,
89    pub A: fmpz_t,
90    pub B: fmpz_t,
91    pub A_ind: *mut mp_limb_t,
92    pub A_divp: *mut fmpz_t,
93    pub B0_terms: *mut mp_limb_t,
94    pub B_terms: *mut fmpz_t,
95    pub A_inv: *mut mp_limb_t,
96    pub A_inv2B: *mut *mut mp_limb_t,
97    pub soln1: *mut c_int,
98    pub soln2: *mut c_int,
99    pub target_A: fmpz_t,
100    pub upp_bound: fmpz_t,
101    pub low_bound: fmpz_t,
102    pub s: mp_limb_signed_t,
103    pub low: mp_limb_signed_t,
104    pub high: mp_limb_signed_t,
105    pub span: mp_limb_signed_t,
106    pub h: mp_limb_signed_t,
107    pub m: mp_limb_signed_t,
108    pub A_ind_diff: mp_limb_signed_t,
109    pub curr_subset: *mut mp_limb_t,
110    pub first_subset: *mut mp_limb_t,
111    pub j: mp_limb_t,
112    pub poly: *mut qs_poly_s,
113    pub siqs: *mut FILE,
114    pub fname: *mut c_char,
115    pub full_relation: mp_limb_signed_t,
116    pub num_cycles: mp_limb_signed_t,
117    pub vertices: mp_limb_signed_t,
118    pub components: mp_limb_signed_t,
119    pub edges: mp_limb_signed_t,
120    pub table_size: mp_limb_signed_t,
121    pub table: *mut hash_t,
122    pub hash_table: *mut mp_limb_t,
123    pub extra_rels: mp_limb_signed_t,
124    pub max_factors: mp_limb_signed_t,
125    pub Y_arr: *mut fmpz,
126    pub curr_rel: *mut mp_limb_signed_t,
127    pub relation: *mut mp_limb_signed_t,
128    pub buffer_size: mp_limb_signed_t,
129    pub num_relations: mp_limb_signed_t,
130    pub small_factor: mp_limb_t,
131    pub matrix: *mut la_col_t,
132    pub qsort_arr: *mut *mut la_col_t,
133    pub columns: mp_limb_signed_t,
134    pub prime_count: *mut mp_limb_signed_t,
135}
136
137pub type qs_t = [qs_s; 1usize];
138
139extern "C" {
140    pub static mut qsieve_tune: [[mp_limb_t; 6usize]; 30usize];
141    pub fn qsieve_init(qs_inf: *mut qs_s, n: *mut fmpz);
142    pub fn qsieve_knuth_schroeppel(qs_inf: *mut qs_s) -> mp_limb_t;
143    pub fn qsieve_clear(qs_inf: *mut qs_s);
144    pub fn qsieve_factor(factors: *mut fmpz_factor_struct, n: *mut fmpz);
145    pub fn compute_factor_base(
146        small_factor: *mut mp_limb_t,
147        qs_inf: *mut qs_s,
148        num_primes: mp_limb_signed_t,
149    ) -> *mut prime_t;
150    pub fn qsieve_primes_init(qs_inf: *mut qs_s) -> mp_limb_t;
151    pub fn qsieve_primes_increment(qs_inf: *mut qs_s, delta: mp_limb_t) -> mp_limb_t;
152    pub fn qsieve_poly_init(qs_inf: *mut qs_s) -> mp_limb_t;
153    pub fn qsieve_init_A(qs_inf: *mut qs_s) -> c_int;
154    pub fn qsieve_reinit_A(qs_inf: *mut qs_s);
155    pub fn qsieve_next_A(qs_inf: *mut qs_s) -> c_int;
156    pub fn qsieve_init_poly_first(qs_inf: *mut qs_s);
157    pub fn qsieve_init_poly_next(qs_inf: *mut qs_s, i: mp_limb_signed_t);
158    pub fn qsieve_compute_C(C: *mut fmpz, qs_inf: *mut qs_s, poly: *mut qs_poly_s);
159    pub fn qsieve_poly_copy(poly: *mut qs_poly_s, qs_inf: *mut qs_s);
160    pub fn qsieve_poly_clear(qs_inf: *mut qs_s);
161    pub fn qsieve_do_sieving(qs_inf: *mut qs_s, sieve: *mut c_uchar, poly: *mut qs_poly_s);
162    pub fn qsieve_do_sieving2(qs_inf: *mut qs_s, sieve: *mut c_uchar, poly: *mut qs_poly_s);
163    pub fn qsieve_evaluate_candidate(
164        qs_inf: *mut qs_s,
165        i: mp_limb_t,
166        sieve: *mut c_uchar,
167        poly: *mut qs_poly_s,
168    ) -> mp_limb_signed_t;
169    pub fn qsieve_evaluate_sieve(
170        qs_inf: *mut qs_s,
171        sieve: *mut c_uchar,
172        poly: *mut qs_poly_s,
173    ) -> mp_limb_signed_t;
174    pub fn qsieve_collect_relations(qs_inf: *mut qs_s, sieve: *mut c_uchar) -> mp_limb_signed_t;
175    pub fn qsieve_linalg_init(qs_inf: *mut qs_s);
176    pub fn qsieve_linalg_realloc(qs_inf: *mut qs_s);
177    pub fn qsieve_linalg_clear(qs_inf: *mut qs_s);
178    pub fn qsieve_relations_cmp(a: *const c_void, b: *const c_void) -> c_int;
179    pub fn qsieve_merge_relations(qs_inf: *mut qs_s) -> mp_limb_signed_t;
180    pub fn qsieve_write_to_file(
181        qs_inf: *mut qs_s,
182        prime: mp_limb_t,
183        Y: *mut fmpz,
184        poly: *mut qs_poly_s,
185    );
186    pub fn qsieve_get_table_entry(qs_inf: *mut qs_s, prime: mp_limb_t) -> *mut hash_t;
187    pub fn qsieve_add_to_hashtable(qs_inf: *mut qs_s, prime: mp_limb_t);
188    pub fn qsieve_parse_relation(qs_inf: *mut qs_s, str_: *mut c_char) -> relation_t;
189    pub fn qsieve_merge_relation(qs_inf: *mut qs_s, a: relation_t, b: relation_t) -> relation_t;
190    pub fn qsieve_compare_relation(a: *const c_void, b: *const c_void) -> c_int;
191    pub fn qsieve_remove_duplicates(
192        rel_list: *mut relation_t,
193        num_relations: mp_limb_signed_t,
194    ) -> c_int;
195    pub fn qsieve_insert_relation(
196        qs_inf: *mut qs_s,
197        rel_list: *mut relation_t,
198        num_relations: mp_limb_signed_t,
199    );
200    pub fn qsieve_process_relation(qs_inf: *mut qs_s) -> c_int;
201    pub fn get_null_entry(nullrows: *mut u64, i: mp_limb_signed_t, l: mp_limb_signed_t) -> u64;
202    pub fn reduce_matrix(
203        qs_inf: *mut qs_s,
204        nrows: *mut mp_limb_signed_t,
205        ncols: *mut mp_limb_signed_t,
206        cols: *mut la_col_t,
207    );
208    pub fn block_lanczos(
209        state: *mut flint_rand_s,
210        nrows: mp_limb_signed_t,
211        dense_rows: mp_limb_signed_t,
212        ncols: mp_limb_signed_t,
213        B: *mut la_col_t,
214    ) -> *mut u64;
215    pub fn qsieve_square_root(
216        X: *mut fmpz,
217        Y: *mut fmpz,
218        qs_inf: *mut qs_s,
219        nullrows: *mut u64,
220        ncols: mp_limb_signed_t,
221        l: mp_limb_signed_t,
222        N: *mut fmpz,
223    );
224}