flint_sys/
fmpz_factor.rs

1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3
4//! See the [FLINT documentation](http://flintlib.org/doc/fmpz_factor.html).
5
6use crate::deps::*;
7use crate::flint::*;
8use crate::fmpz::fmpz;
9use libc::{c_int, c_uchar};
10
11#[repr(C)]
12#[derive(Debug, Copy, Clone)]
13pub struct fmpz_factor_struct {
14    pub sign: c_int,
15    pub p: *mut fmpz,
16    pub exp: *mut mp_limb_t,
17    pub alloc: mp_limb_signed_t,
18    pub num: mp_limb_signed_t,
19}
20
21pub type fmpz_factor_t = [fmpz_factor_struct; 1usize];
22
23#[repr(C)]
24#[derive(Debug, Copy, Clone)]
25pub struct ecm_s {
26    pub t: mp_ptr,
27    pub u: mp_ptr,
28    pub v: mp_ptr,
29    pub w: mp_ptr,
30    pub x: mp_ptr,
31    pub z: mp_ptr,
32    pub a24: mp_ptr,
33    pub ninv: mp_ptr,
34    pub one: mp_ptr,
35    pub GCD_table: *mut c_uchar,
36    pub prime_table: *mut *mut c_uchar,
37    pub n_size: mp_limb_t,
38    pub normbits: mp_limb_t,
39}
40
41pub type ecm_t = [ecm_s; 1usize];
42
43extern "C" {
44    pub fn fmpz_factor_init(factor: *mut fmpz_factor_struct);
45    pub fn fmpz_factor_clear(factor: *mut fmpz_factor_struct);
46    pub fn fmpz_factor_print(factor: *const fmpz_factor_struct);
47    pub fn _fmpz_factor_fit_length(factor: *mut fmpz_factor_struct, len: mp_limb_signed_t);
48    pub fn _fmpz_factor_append_ui(factor: *mut fmpz_factor_struct, p: mp_limb_t, exp: mp_limb_t);
49    pub fn _fmpz_factor_append(factor: *mut fmpz_factor_struct, p: *const fmpz, exp: mp_limb_t);
50    pub fn _fmpz_factor_set_length(factor: *mut fmpz_factor_struct, newlen: mp_limb_signed_t);
51    pub fn _fmpz_factor_concat(
52        factor1: *mut fmpz_factor_struct,
53        factor2: *const fmpz_factor_struct,
54        exp: mp_limb_t,
55    );
56    pub fn _fmpz_factor_extend_factor_ui(factor: *mut fmpz_factor_struct, n: mp_limb_t);
57    pub fn fmpz_factor_trial_range(
58        factor: *mut fmpz_factor_struct,
59        n: *const fmpz,
60        start: mp_limb_t,
61        num_primes: mp_limb_t,
62    ) -> c_int;
63    pub fn fmpz_factor_trial(
64        factor: *mut fmpz_factor_struct,
65        n: *const fmpz,
66        num_primes: mp_limb_signed_t,
67    ) -> c_int;
68    pub fn fmpz_factor(factor: *mut fmpz_factor_struct, n: *const fmpz);
69    pub fn fmpz_factor_no_trial(factor: *mut fmpz_factor_struct, n: *const fmpz);
70    pub fn fmpz_factor_smooth(
71        factor: *mut fmpz_factor_struct,
72        n: *const fmpz,
73        bits: mp_limb_signed_t,
74        proved: c_int,
75    ) -> c_int;
76    pub fn fmpz_factor_si(factor: *mut fmpz_factor_struct, n: mp_limb_signed_t);
77    pub fn fmpz_factor_pp1(
78        factor: *mut fmpz,
79        n: *const fmpz,
80        B1: mp_limb_t,
81        B2_sqrt: mp_limb_t,
82        c: mp_limb_t,
83    ) -> c_int;
84    pub fn fmpz_factor_refine(res: *mut fmpz_factor_struct, f: *const fmpz_factor_struct);
85    pub fn flint_mpn_sqr_and_add_a(
86        y: mp_ptr,
87        a: mp_ptr,
88        n: mp_ptr,
89        n_size: mp_limb_t,
90        ninv: mp_ptr,
91        normbits: mp_limb_t,
92    );
93    pub fn flint_mpn_factor_pollard_brent_single(
94        factor: mp_ptr,
95        n: mp_ptr,
96        ninv: mp_ptr,
97        a: mp_ptr,
98        y: mp_ptr,
99        n_size: mp_limb_t,
100        normbits: mp_limb_t,
101        max_iters: mp_limb_t,
102    ) -> c_int;
103    pub fn fmpz_factor_pollard_brent_single(
104        p_factor: *mut fmpz,
105        n_in: *const fmpz,
106        yi: *const fmpz,
107        ai: *const fmpz,
108        max_iters: mp_limb_t,
109    ) -> c_int;
110    pub fn fmpz_factor_pollard_brent(
111        factor: *mut fmpz,
112        state: *const flint_rand_s,
113        n: *const fmpz,
114        max_tries: mp_limb_t,
115        max_iters: mp_limb_t,
116    ) -> c_int;
117    pub fn fmpz_factor_expand_iterative(n: *mut fmpz, factor: *const fmpz_factor_struct);
118    pub fn fmpz_factor_expand_multiexp(n: *mut fmpz, factor: *const fmpz_factor_struct);
119    pub fn fmpz_factor_expand(n: *mut fmpz, factor: *const fmpz_factor_struct);
120    pub fn fmpz_factor_euler_phi(res: *mut fmpz, fac: *const fmpz_factor_struct);
121    pub fn fmpz_factor_moebius_mu(fac: *const fmpz_factor_struct) -> c_int;
122    pub fn fmpz_factor_divisor_sigma(res: *mut fmpz, fac: *const fmpz_factor_struct, k: mp_limb_t);
123    pub fn fmpz_factor_ecm_init(ecm_inf: *mut ecm_s, sz: mp_limb_t);
124    pub fn fmpz_factor_ecm_clear(ecm_inf: *mut ecm_s);
125    pub fn fmpz_factor_ecm_addmod(a: mp_ptr, b: mp_ptr, c: mp_ptr, n: mp_ptr, n_size: mp_limb_t);
126    pub fn fmpz_factor_ecm_submod(x: mp_ptr, a: mp_ptr, b: mp_ptr, n: mp_ptr, n_size: mp_limb_t);
127    pub fn fmpz_factor_ecm_double(
128        x: mp_ptr,
129        z: mp_ptr,
130        x0: mp_ptr,
131        z0: mp_ptr,
132        n: mp_ptr,
133        ecm_inf: *const ecm_s,
134    );
135    pub fn fmpz_factor_ecm_add(
136        x: mp_ptr,
137        z: mp_ptr,
138        x1: mp_ptr,
139        z1: mp_ptr,
140        x2: mp_ptr,
141        z2: mp_ptr,
142        x0: mp_ptr,
143        z0: mp_ptr,
144        n: mp_ptr,
145        ecm_inf: *const ecm_s,
146    );
147    pub fn fmpz_factor_ecm_mul_montgomery_ladder(
148        x: mp_ptr,
149        z: mp_ptr,
150        x0: mp_ptr,
151        z0: mp_ptr,
152        k: mp_limb_t,
153        n: mp_ptr,
154        ecm_inf: *const ecm_s,
155    );
156    pub fn fmpz_factor_ecm_select_curve(
157        f: mp_ptr,
158        sig: mp_ptr,
159        n: mp_ptr,
160        ecm_inf: *const ecm_s,
161    ) -> c_int;
162    pub fn fmpz_factor_ecm_stage_I(
163        f: mp_ptr,
164        prime_array: *const mp_limb_t,
165        num: mp_limb_t,
166        B1: mp_limb_t,
167        n: mp_ptr,
168        ecm_inf: *const ecm_s,
169    ) -> c_int;
170    pub fn fmpz_factor_ecm_stage_II(
171        f: mp_ptr,
172        B1: mp_limb_t,
173        B2: mp_limb_t,
174        P: mp_limb_t,
175        n: mp_ptr,
176        ecm_inf: *const ecm_s,
177    ) -> c_int;
178    pub fn fmpz_factor_ecm(
179        f: *mut fmpz,
180        curves: mp_limb_t,
181        B1: mp_limb_t,
182        B2: mp_limb_t,
183        state: *const flint_rand_s,
184        n_in: *const fmpz,
185    ) -> c_int;
186    pub fn fmpz_factor_get_fmpz(
187        z: *mut fmpz,
188        factor: *const fmpz_factor_struct,
189        i: mp_limb_signed_t,
190    );
191}