flint_sys/
fmpz.rs

1#![allow(non_camel_case_types)]
2
3//! See the [FLINT documentation](http://flintlib.org/doc/fmpz.html).
4
5use crate::deps::*;
6use crate::flint::*;
7use libc::{c_char, c_int, size_t, FILE};
8
9#[repr(C)]
10#[derive(Default, Debug, Copy, Clone, Hash)]
11pub struct fmpz(pub slong);
12
13pub type fmpz_t = [fmpz; 1usize];
14pub type fmpz_randstate_t = gmp_randstate_t;
15
16#[repr(C)]
17#[derive(Debug, Copy, Clone)]
18pub struct fmpz_preinvn_struct {
19    pub dinv: mp_ptr,
20    pub n: mp_limb_signed_t,
21    pub norm: mp_limb_t,
22}
23
24pub type fmpz_preinvn_t = [fmpz_preinvn_struct; 1usize];
25
26/*
27#[repr(C)]
28#[derive(Debug, Copy, Clone)]
29pub struct fmpz_comb_struct {
30    pub primes: *const mp_limb_t,
31    pub num_primes: mp_limb_signed_t,
32    pub n: mp_limb_signed_t,
33    pub comb: *mut *mut fmpz,
34    pub res: *mut *mut fmpz,
35    pub mod_: *mut nmod_t,
36}
37
38#[repr(C)]
39#[derive(Debug, Copy, Clone)]
40pub struct fmpz_comb_temp_struct {
41    pub n: mp_limb_signed_t,
42    pub comb_temp: *mut *mut fmpz,
43    pub temp: fmpz_t,
44    pub temp2: fmpz_t,
45}
46
47pub type fmpz_comb_t = [fmpz_comb_struct; 1usize];
48pub type fmpz_comb_temp_t = [fmpz_comb_temp_struct; 1usize];
49*/
50
51#[repr(C)]
52#[derive(Debug, Copy, Clone)]
53pub struct _fmpz_multi_crt_prog_instr {
54    pub a_idx: mp_limb_signed_t,
55    pub b_idx: mp_limb_signed_t,
56    pub c_idx: mp_limb_signed_t,
57    pub idem: fmpz_t,
58    pub modulus: fmpz_t,
59}
60
61#[repr(C)]
62#[derive(Debug, Copy, Clone)]
63pub struct fmpz_multi_crt_struct {
64    pub prog: *mut _fmpz_multi_crt_prog_instr,
65    pub length: mp_limb_signed_t,
66    pub alloc: mp_limb_signed_t,
67    pub localsize: mp_limb_signed_t,
68    pub temp1loc: mp_limb_signed_t,
69    pub temp2loc: mp_limb_signed_t,
70    pub good: c_int,
71}
72
73pub type fmpz_multi_crt_t = [fmpz_multi_crt_struct; 1usize];
74
75extern "C" {
76    pub static mut fmpz_arr: *mut __mpz_struct;
77    pub static mut fmpz_randstate: gmp_randstate_t;
78    pub fn _fmpz_new_mpz() -> *mut __mpz_struct;
79    pub fn _fmpz_clear_mpz(f: fmpz);
80    pub fn _fmpz_cleanup_mpz_content();
81    pub fn _fmpz_cleanup();
82    pub fn _fmpz_promote(f: *mut fmpz) -> *mut __mpz_struct;
83
84    /// See the [FLINT Documentation](http://flintlib.org/doc/fmpz.html#c._fmpz_promote_val) for this function.
85    pub fn _fmpz_promote_val(f: *mut fmpz) -> *mut __mpz_struct;
86    pub fn _fmpz_demote(f: *mut fmpz);
87
88    /// See the [FLINT Documentation](http://flintlib.org/doc/fmpz.html#c._fmpz_demote_val) for this function.
89    pub fn _fmpz_demote_val(f: *mut fmpz);
90    pub fn _fmpz_init_readonly_mpz(f: *mut fmpz, z: *mut __mpz_struct);
91    pub fn _fmpz_clear_readonly_mpz(arg1: *mut __mpz_struct);
92
93    /// See the [FLINT Documentation](http://flintlib.org/doc/fmpz.html#c.fmpz_init) for this function.
94    pub fn fmpz_init(f: *mut fmpz);
95
96    /// See the [FLINT Documentation](http://flintlib.org/doc/fmpz.html#c.fmpz_init) for this function.
97    pub fn fmpz_init2(f: *mut fmpz, limbs: mp_limb_t);
98
99    /// See the [FLINT Documentation](http://flintlib.org/doc/fmpz.html#c.fmpz_init) for this function.
100    pub fn fmpz_init_set(f: *mut fmpz, g: *const fmpz);
101    pub fn fmpz_init_set_ui(f: *mut fmpz, g: mp_limb_t);
102    pub fn fmpz_init_set_si(f: *mut fmpz, g: mp_limb_signed_t);
103    pub fn fmpz_clear(f: *mut fmpz);
104    pub fn fmpz_randbits(f: *mut fmpz, state: *const flint_rand_s, bits: mp_limb_t);
105    pub fn fmpz_randm(f: *mut fmpz, state: *const flint_rand_s, m: *const fmpz);
106    pub fn fmpz_randtest(f: *mut fmpz, state: *const flint_rand_s, bits: mp_limb_t);
107    pub fn fmpz_randtest_unsigned(f: *mut fmpz, state: *const flint_rand_s, bits: mp_limb_t);
108    pub fn fmpz_randtest_not_zero(f: *mut fmpz, state: *const flint_rand_s, bits: mp_limb_t);
109    pub fn fmpz_randtest_mod(f: *mut fmpz, state: *const flint_rand_s, m: *const fmpz);
110    pub fn fmpz_randtest_mod_signed(f: *mut fmpz, state: *const flint_rand_s, m: *const fmpz);
111    pub fn fmpz_randprime(f: *mut fmpz, state: *const flint_rand_s, bits: mp_limb_t, proved: c_int);
112    pub fn fmpz_get_si(f: *const fmpz) -> mp_limb_signed_t;
113    pub fn fmpz_get_ui(f: *const fmpz) -> mp_limb_t;
114    pub fn fmpz_get_uiui(hi: *mut mp_limb_t, low: *mut mp_limb_t, f: *const fmpz);
115    pub fn fmpz_set_si(f: *mut fmpz, val: mp_limb_signed_t);
116    pub fn fmpz_set_ui(f: *mut fmpz, val: mp_limb_t);
117    pub fn fmpz_neg_ui(f: *mut fmpz, val: mp_limb_t);
118    pub fn fmpz_set_uiui(f: *mut fmpz, hi: mp_limb_t, lo: mp_limb_t);
119    pub fn fmpz_neg_uiui(f: *mut fmpz, hi: mp_limb_t, lo: mp_limb_t);
120    pub fn fmpz_set_signed_uiui(r: *mut fmpz, hi: mp_limb_t, lo: mp_limb_t);
121    pub fn fmpz_set_signed_uiuiui(r: *mut fmpz, hi: mp_limb_t, mid: mp_limb_t, lo: mp_limb_t);
122    pub fn fmpz_set_ui_array(out: *mut fmpz, in_: *const mp_limb_t, in_len: mp_limb_signed_t);
123    pub fn fmpz_get_ui_array(out: *mut mp_limb_t, out_len: mp_limb_signed_t, in_: *const fmpz);
124    pub fn fmpz_get_mpz(x: *mut __mpz_struct, f: *const fmpz);
125    pub fn fmpz_set_mpz(f: *mut fmpz, x: *const __mpz_struct);
126    pub fn fmpz_get_d(f: *const fmpz) -> f64;
127    pub fn fmpz_set_d(f: *mut fmpz, c: f64);
128    pub fn fmpz_get_mpf(x: *mut __mpf_struct, f: *const fmpz);
129    pub fn fmpz_set_mpf(f: *mut fmpz, x: *const __mpf_struct);
130    pub fn fmpz_get_mpfr(x: *mut __mpfr_struct, f: *const fmpz, rnd: mpfr_rnd_t);
131    pub fn fmpz_get_mpn(n: *mut mp_ptr, n_in: *const fmpz) -> c_int;
132    pub fn fmpz_set_str(f: *mut fmpz, str_: *const c_char, b: c_int) -> c_int;
133    pub fn flint_mpz_init_set_readonly(z: *mut __mpz_struct, f: *const fmpz);
134    pub fn flint_mpz_clear_readonly(z: *mut __mpz_struct);
135    pub fn fmpz_init_set_readonly(f: *mut fmpz, z: *const __mpz_struct);
136    pub fn fmpz_clear_readonly(f: *mut fmpz);
137    pub fn fmpz_abs_fits_ui(f: *const fmpz) -> c_int;
138    pub fn fmpz_fits_si(f: *const fmpz) -> c_int;
139    pub fn fmpz_zero(f: *mut fmpz);
140    pub fn fmpz_one(f: *mut fmpz);
141    pub fn fmpz_is_zero(f: *const fmpz) -> c_int;
142    pub fn fmpz_is_one(f: *const fmpz) -> c_int;
143    pub fn fmpz_is_pm1(f: *const fmpz) -> c_int;
144    pub fn fmpz_set(f: *mut fmpz, g: *const fmpz);
145    pub fn fmpz_equal(f: *const fmpz, g: *const fmpz) -> c_int;
146    pub fn fmpz_equal_si(f: *const fmpz, g: mp_limb_signed_t) -> c_int;
147    pub fn fmpz_equal_ui(f: *const fmpz, g: mp_limb_t) -> c_int;
148    pub fn fmpz_read(f: *mut fmpz) -> c_int;
149    pub fn fmpz_fread(file: *mut FILE, f: *mut fmpz) -> c_int;
150    pub fn fmpz_inp_raw(x: *mut fmpz, fin: *mut FILE) -> size_t;
151    pub fn fmpz_print(x: *const fmpz) -> c_int;
152    pub fn fmpz_fprint(file: *mut FILE, x: *const fmpz) -> c_int;
153    pub fn fmpz_out_raw(fout: *mut FILE, x: *const fmpz) -> size_t;
154    pub fn fmpz_sizeinbase(f: *const fmpz, b: c_int) -> size_t;
155    pub fn fmpz_get_str(str_: *mut c_char, b: c_int, f: *const fmpz) -> *mut c_char;
156    pub fn fmpz_swap(f: *mut fmpz, g: *mut fmpz);
157    pub fn fmpz_cmp(f: *const fmpz, g: *const fmpz) -> c_int;
158    pub fn fmpz_cmp_ui(f: *const fmpz, g: mp_limb_t) -> c_int;
159    pub fn fmpz_cmp_si(f: *const fmpz, g: mp_limb_signed_t) -> c_int;
160    pub fn fmpz_cmpabs(f: *const fmpz, g: *const fmpz) -> c_int;
161    pub fn fmpz_is_even(f: *const fmpz) -> c_int;
162    pub fn fmpz_is_odd(f: *const fmpz) -> c_int;
163    pub fn fmpz_size(f: *const fmpz) -> mp_size_t;
164    pub fn fmpz_sgn(f: *const fmpz) -> c_int;
165    pub fn fmpz_bits(f: *const fmpz) -> mp_limb_t;
166    pub fn fmpz_val2(x: *const fmpz) -> mp_limb_t;
167    pub fn fmpz_neg(f1: *mut fmpz, f2: *const fmpz);
168    pub fn fmpz_abs(f1: *mut fmpz, f2: *const fmpz);
169    pub fn fmpz_add(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
170    pub fn fmpz_sub(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
171    pub fn fmpz_mul_ui(f: *mut fmpz, g: *const fmpz, x: mp_limb_t);
172    pub fn fmpz_mul_si(f: *mut fmpz, g: *const fmpz, x: mp_limb_signed_t);
173    pub fn fmpz_mul(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
174    pub fn fmpz_mul_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
175    pub fn fmpz_add_ui(f: *mut fmpz, g: *const fmpz, x: mp_limb_t);
176    pub fn fmpz_sub_ui(f: *mut fmpz, g: *const fmpz, x: mp_limb_t);
177    pub fn fmpz_add_si(f: *mut fmpz, g: *const fmpz, x: mp_limb_signed_t);
178    pub fn fmpz_sub_si(f: *mut fmpz, g: *const fmpz, x: mp_limb_signed_t);
179    pub fn fmpz_addmul_ui(f: *mut fmpz, g: *const fmpz, x: mp_limb_t);
180    pub fn fmpz_addmul_si(f: *mut fmpz, g: *const fmpz, x: mp_limb_signed_t);
181    pub fn fmpz_submul_ui(f: *mut fmpz, g: *const fmpz, x: mp_limb_t);
182    pub fn fmpz_submul_si(f: *mut fmpz, g: *const fmpz, x: mp_limb_signed_t);
183    pub fn fmpz_addmul(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
184    pub fn fmpz_submul(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
185    pub fn fmpz_fmma(f: *mut fmpz, a: *const fmpz, b: *const fmpz, c: *const fmpz, d: *const fmpz);
186    pub fn fmpz_fmms(f: *mut fmpz, a: *const fmpz, b: *const fmpz, c: *const fmpz, d: *const fmpz);
187    pub fn fmpz_pow_ui(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
188    pub fn fmpz_pow_fmpz(a: *mut fmpz, b: *const fmpz, e: *const fmpz) -> c_int;
189    pub fn fmpz_powm_ui(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t, m: *const fmpz);
190    pub fn fmpz_powm(f: *mut fmpz, g: *const fmpz, e: *const fmpz, m: *const fmpz);
191    pub fn fmpz_setbit(f: *mut fmpz, i: mp_limb_t);
192    pub fn fmpz_tstbit(f: *const fmpz, i: mp_limb_t) -> c_int;
193    pub fn fmpz_clrbit(f: *mut fmpz, i: mp_limb_t);
194    pub fn fmpz_complement(r: *mut fmpz, f: *const fmpz);
195    pub fn fmpz_combit(f: *mut fmpz, i: mp_limb_t);
196    pub fn fmpz_and(r: *mut fmpz, a: *const fmpz, b: *const fmpz);
197    pub fn fmpz_or(r: *mut fmpz, a: *const fmpz, b: *const fmpz);
198    pub fn fmpz_xor(r: *mut fmpz, a: *const fmpz, b: *const fmpz);
199    pub fn fmpz_popcnt(c: *mut fmpz) -> mp_limb_t;
200    pub fn fmpz_dlog(x: *const fmpz) -> f64;
201    pub fn fmpz_flog(x: *const fmpz, b: *const fmpz) -> mp_limb_signed_t;
202    pub fn fmpz_flog_ui(x: *const fmpz, b: mp_limb_t) -> mp_limb_signed_t;
203    pub fn fmpz_clog(x: *const fmpz, b: *const fmpz) -> mp_limb_signed_t;
204    pub fn fmpz_clog_ui(x: *const fmpz, b: mp_limb_t) -> mp_limb_signed_t;
205    pub fn fmpz_sqrtmod(b: *mut fmpz, a: *const fmpz, p: *const fmpz) -> c_int;
206    pub fn fmpz_sqrt(f: *mut fmpz, g: *const fmpz);
207    pub fn fmpz_is_square(f: *const fmpz) -> c_int;
208    pub fn fmpz_root(r: *mut fmpz, f: *const fmpz, n: mp_limb_signed_t);
209    pub fn fmpz_is_perfect_power(root: *mut fmpz, f: *const fmpz) -> c_int;
210    pub fn fmpz_sqrtrem(f: *mut fmpz, r: *const fmpz, g: *const fmpz);
211    pub fn fmpz_fdiv_ui(g: *const fmpz, h: mp_limb_t) -> mp_limb_t;
212    pub fn fmpz_mod_ui(f: *mut fmpz, g: *const fmpz, h: mp_limb_t) -> mp_limb_t;
213    pub fn fmpz_mod(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
214    pub fn fmpz_smod(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
215    pub fn fmpz_negmod(r: *mut fmpz, a: *const fmpz, mod_: *const fmpz);
216    pub fn fmpz_gcd(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
217    pub fn fmpz_lcm(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
218    pub fn fmpz_gcdinv(d: *mut fmpz, a: *mut fmpz, f: *const fmpz, g: *const fmpz);
219    pub fn fmpz_xgcd(d: *mut fmpz, a: *mut fmpz, b: *mut fmpz, f: *const fmpz, g: *const fmpz);
220    pub fn fmpz_xgcd_canonical_bezout(
221        d: *mut fmpz,
222        a: *mut fmpz,
223        b: *mut fmpz,
224        f: *const fmpz,
225        g: *const fmpz,
226    );
227    pub fn fmpz_xgcd_partial(
228        co2: *mut fmpz,
229        co1: *mut fmpz,
230        r2: *mut fmpz,
231        r1: *mut fmpz,
232        L: *mut fmpz,
233    );
234    pub fn fmpz_invmod(f: *mut fmpz, g: *const fmpz, h: *const fmpz) -> c_int;
235    pub fn fmpz_jacobi(a: *const fmpz, p: *const fmpz) -> c_int;
236    pub fn fmpz_kronecker(a: *const fmpz, n: *const fmpz) -> c_int;
237    pub fn fmpz_divides_mod_list(
238        xstart: *mut fmpz,
239        xstride: *mut fmpz,
240        xlength: *mut fmpz,
241        a: *const fmpz,
242        b: *const fmpz,
243        n: *const fmpz,
244    );
245    pub fn _fmpz_remove(x: *mut fmpz, f: *const fmpz, finv: f64) -> mp_limb_signed_t;
246    pub fn fmpz_remove(rop: *mut fmpz, op: *const fmpz, f: *const fmpz) -> mp_limb_signed_t;
247    pub fn fmpz_divexact(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
248    pub fn fmpz_divexact_si(f: *mut fmpz, g: *const fmpz, h: mp_limb_signed_t);
249    pub fn fmpz_divexact_ui(f: *mut fmpz, g: *const fmpz, h: mp_limb_t);
250    pub fn fmpz_divisible(f: *const fmpz, g: *const fmpz) -> c_int;
251    pub fn fmpz_divisible_si(f: *const fmpz, g: mp_limb_signed_t) -> c_int;
252    pub fn fmpz_cdiv_qr(f: *mut fmpz, s: *mut fmpz, g: *const fmpz, h: *const fmpz);
253    pub fn fmpz_cdiv_q(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
254    pub fn fmpz_cdiv_q_si(f: *mut fmpz, g: *const fmpz, h: mp_limb_signed_t);
255    pub fn fmpz_cdiv_q_ui(f: *mut fmpz, g: *const fmpz, h: mp_limb_t);
256    pub fn fmpz_cdiv_q_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
257    pub fn fmpz_cdiv_r_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
258    pub fn fmpz_cdiv_ui(g: *const fmpz, h: mp_limb_t) -> mp_limb_t;
259    pub fn fmpz_fdiv_qr(f: *mut fmpz, s: *mut fmpz, g: *const fmpz, h: *const fmpz);
260    pub fn fmpz_fdiv_qr_preinvn(
261        f: *mut fmpz,
262        s: *mut fmpz,
263        g: *mut fmpz,
264        h: *mut fmpz,
265        inv: *mut fmpz_preinvn_struct,
266    );
267    pub fn fmpz_fdiv_q(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
268    pub fn fmpz_fdiv_r(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
269    pub fn fmpz_fdiv_q_ui(f: *mut fmpz, g: *const fmpz, h: mp_limb_t);
270    pub fn fmpz_fdiv_q_si(f: *mut fmpz, g: *const fmpz, h: mp_limb_signed_t);
271    pub fn fmpz_fdiv_q_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
272    pub fn fmpz_fdiv_r_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
273    pub fn fmpz_tdiv_q(f: *mut fmpz, g: *const fmpz, h: *const fmpz);
274    pub fn fmpz_tdiv_qr(f: *mut fmpz, s: *mut fmpz, g: *const fmpz, h: *const fmpz);
275    pub fn fmpz_ndiv_qr(q: *mut fmpz, r: *mut fmpz, a: *const fmpz, b: *const fmpz);
276    pub fn fmpz_tdiv_q_ui(f: *mut fmpz, g: *const fmpz, h: mp_limb_t);
277    pub fn fmpz_tdiv_q_si(f: *mut fmpz, g: *const fmpz, h: mp_limb_signed_t);
278    pub fn fmpz_tdiv_r_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
279    pub fn fmpz_tdiv_ui(g: *const fmpz, h: mp_limb_t) -> mp_limb_t;
280    pub fn fmpz_tdiv_q_2exp(f: *mut fmpz, g: *const fmpz, exp: mp_limb_t);
281    pub fn fmpz_preinvn_init(inv: *mut fmpz_preinvn_struct, f: *const fmpz);
282    pub fn fmpz_preinvn_clear(inv: *mut fmpz_preinvn_struct);
283    pub fn fmpz_get_d_2exp(exp: *const mp_limb_signed_t, f: *const fmpz) -> f64;
284    pub fn fmpz_set_d_2exp(f: *mut fmpz, m: f64, exp: mp_limb_signed_t);
285    pub fn fmpz_mul2_uiui(f: *mut fmpz, g: *const fmpz, h1: mp_limb_t, h2: mp_limb_t);
286    pub fn fmpz_divexact2_uiui(f: *mut fmpz, g: *const fmpz, h1: mp_limb_t, h2: mp_limb_t);
287    pub fn fmpz_mul_tdiv_q_2exp(f: *mut fmpz, g: *mut fmpz, h: *mut fmpz, exp: mp_limb_t);
288    pub fn fmpz_mul_si_tdiv_q_2exp(f: *mut fmpz, g: *mut fmpz, x: mp_limb_signed_t, exp: mp_limb_t);
289    pub fn fmpz_fac_ui(f: *mut fmpz, n: mp_limb_t);
290    pub fn fmpz_fib_ui(f: *mut fmpz, n: mp_limb_t);
291    pub fn fmpz_bin_uiui(res: *mut fmpz, n: mp_limb_t, k: mp_limb_t);
292    pub fn _fmpz_rfac_ui(r: *mut fmpz, x: *const fmpz, a: mp_limb_t, b: mp_limb_t);
293    pub fn fmpz_rfac_ui(r: *mut fmpz, x: *const fmpz, n: mp_limb_t);
294    pub fn fmpz_rfac_uiui(r: *mut fmpz, x: mp_limb_t, n: mp_limb_t);
295    pub fn fmpz_bit_pack(
296        arr: mp_ptr,
297        shift: mp_limb_t,
298        bits: mp_limb_t,
299        coeff: *mut fmpz,
300        negate: c_int,
301        borrow: c_int,
302    ) -> c_int;
303    pub fn fmpz_bit_unpack(
304        coeff: *mut fmpz,
305        arr: mp_srcptr,
306        shift: mp_limb_t,
307        bits: mp_limb_t,
308        negate: c_int,
309        borrow: c_int,
310    ) -> c_int;
311    pub fn fmpz_bit_unpack_unsigned(
312        coeff: *mut fmpz,
313        arr: mp_srcptr,
314        shift: mp_limb_t,
315        bits: mp_limb_t,
316    );
317    pub fn _fmpz_CRT_ui_precomp(
318        out: *mut fmpz,
319        r1: *mut fmpz,
320        m1: *mut fmpz,
321        r2: mp_limb_t,
322        m2: mp_limb_t,
323        m2inv: mp_limb_t,
324        m1m2: *mut fmpz,
325        c: mp_limb_t,
326        sign: c_int,
327    );
328    pub fn fmpz_CRT_ui(
329        out: *mut fmpz,
330        r1: *const fmpz,
331        m1: *const fmpz,
332        r2: mp_limb_t,
333        m2: mp_limb_t,
334        sign: c_int,
335    );
336    /*
337    pub fn fmpz_comb_temp_init(temp: *mut fmpz_comb_temp_struct, comb: *mut fmpz_comb_struct);
338    pub fn fmpz_comb_temp_clear(temp: *mut fmpz_comb_temp_struct);
339    pub fn fmpz_comb_init(
340        comb: *mut fmpz_comb_struct,
341        primes: mp_srcptr,
342        num_primes: mp_limb_signed_t,
343    );
344    pub fn fmpz_comb_clear(comb: *mut fmpz_comb_struct);
345    pub fn fmpz_multi_mod_ui(
346        out: *mut mp_limb_t,
347        in_: *mut fmpz,
348        comb: *mut fmpz_comb_struct,
349        temp: *mut fmpz_comb_temp_struct,
350    );
351    pub fn fmpz_multi_CRT_ui(
352        output: *mut fmpz,
353        residues: mp_srcptr,
354        comb: *mut fmpz_comb_struct,
355        temp: *mut fmpz_comb_temp_struct,
356        sign: c_int,
357    );
358    */
359    pub fn fmpz_CRT(
360        out: *mut fmpz,
361        r1: *const fmpz,
362        m1: *const fmpz,
363        r2: *const fmpz,
364        m2: *const fmpz,
365        sign: c_int,
366    );
367    pub fn fmpz_set_ui_smod(f: *mut fmpz, x: mp_limb_t, m: mp_limb_t);
368    pub fn fmpz_multi_crt_init(CRT: *mut fmpz_multi_crt_struct);
369    pub fn fmpz_multi_crt_precompute(
370        CRT: *mut fmpz_multi_crt_struct,
371        moduli: *const fmpz,
372        len: mp_limb_signed_t,
373    ) -> c_int;
374    pub fn fmpz_multi_crt_precompute_p(
375        CRT: *mut fmpz_multi_crt_struct,
376        moduli: *const *const fmpz,
377        len: mp_limb_signed_t,
378    ) -> c_int;
379    pub fn fmpz_multi_crt_precomp(
380        output: *mut fmpz,
381        P: *mut fmpz_multi_crt_struct,
382        inputs: *const fmpz,
383    );
384    pub fn fmpz_multi_crt_precomp_p(
385        output: *mut fmpz,
386        P: *mut fmpz_multi_crt_struct,
387        inputs: *const *const fmpz,
388    );
389    pub fn fmpz_multi_crt(
390        output: *mut fmpz,
391        moduli: *const fmpz,
392        values: *const fmpz,
393        len: mp_limb_signed_t,
394    ) -> c_int;
395    pub fn fmpz_multi_crt_clear(P: *mut fmpz_multi_crt_struct);
396    pub fn _fmpz_multi_crt_local_size(CRT: *mut fmpz_multi_crt_struct) -> mp_limb_signed_t;
397    pub fn _fmpz_multi_crt_run(
398        outputs: *mut fmpz,
399        CRT: *mut fmpz_multi_crt_struct,
400        inputs: *const fmpz,
401    );
402    pub fn _fmpz_multi_crt_run_p(
403        outputs: *mut fmpz,
404        CRT: *mut fmpz_multi_crt_struct,
405        inputs: *const *const fmpz,
406    );
407    pub fn fmpz_abs_ubound_ui_2exp(
408        exp: *mut mp_limb_signed_t,
409        x: *mut fmpz,
410        bits: c_int,
411    ) -> mp_limb_t;
412    pub fn fmpz_abs_lbound_ui_2exp(
413        exp: *mut mp_limb_signed_t,
414        x: *mut fmpz,
415        bits: c_int,
416    ) -> mp_limb_t;
417    pub fn fmpz_lucas_chain(
418        Vm: *mut fmpz,
419        Vm1: *mut fmpz,
420        A: *mut fmpz,
421        m: *mut fmpz,
422        n: *mut fmpz,
423    );
424    pub fn fmpz_lucas_chain_full(
425        Vm: *mut fmpz,
426        Vm1: *mut fmpz,
427        A: *mut fmpz,
428        B: *mut fmpz,
429        m: *mut fmpz,
430        n: *mut fmpz,
431    );
432    pub fn fmpz_lucas_chain_double(
433        U2m: *mut fmpz,
434        U2m1: *mut fmpz,
435        Um: *mut fmpz,
436        Um1: *mut fmpz,
437        A: *mut fmpz,
438        B: *mut fmpz,
439        n: *mut fmpz,
440    );
441    pub fn fmpz_lucas_chain_add(
442        Umn: *mut fmpz,
443        Umn1: *mut fmpz,
444        Um: *mut fmpz,
445        Um1: *mut fmpz,
446        Un: *mut fmpz,
447        Un1: *mut fmpz,
448        A: *mut fmpz,
449        B: *mut fmpz,
450        n: *mut fmpz,
451    );
452    pub fn fmpz_lucas_chain_mul(
453        Ukm: *mut fmpz,
454        Ukm1: *mut fmpz,
455        Um: *mut fmpz,
456        Um1: *mut fmpz,
457        A: *mut fmpz,
458        B: *mut fmpz,
459        k: *mut fmpz,
460        n: *mut fmpz,
461    );
462    pub fn fmpz_lucas_chain_VtoU(
463        Um: *mut fmpz,
464        Um1: *mut fmpz,
465        Vm: *mut fmpz,
466        Vm1: *mut fmpz,
467        A: *mut fmpz,
468        B: *mut fmpz,
469        Dinv: *mut fmpz,
470        n: *mut fmpz,
471    );
472    pub fn fmpz_is_probabprime_lucas(n: *mut fmpz) -> c_int;
473    pub fn fmpz_is_probabprime_BPSW(n: *mut fmpz) -> c_int;
474    pub fn fmpz_is_strong_probabprime(n: *mut fmpz, a: *mut fmpz) -> c_int;
475    pub fn fmpz_is_probabprime(p: *mut fmpz) -> c_int;
476    pub fn fmpz_is_prime_pseudosquare(n: *mut fmpz) -> c_int;
477    pub fn _fmpz_nm1_trial_factors(
478        n: *mut fmpz,
479        pm1: mp_ptr,
480        num_pm1: *mut mp_limb_signed_t,
481        limit: mp_limb_t,
482    );
483    pub fn fmpz_is_prime_pocklington(
484        F: *mut fmpz,
485        R: *mut fmpz,
486        n: *mut fmpz,
487        pm1: mp_ptr,
488        num_pm1: mp_limb_signed_t,
489    ) -> c_int;
490    pub fn _fmpz_np1_trial_factors(
491        n: *mut fmpz,
492        pp1: mp_ptr,
493        num_pp1: *mut mp_limb_signed_t,
494        limit: mp_limb_t,
495    );
496    pub fn fmpz_is_prime_morrison(
497        F: *mut fmpz,
498        R: *mut fmpz,
499        n: *mut fmpz,
500        pm1: mp_ptr,
501        num_pm1: mp_limb_signed_t,
502    ) -> c_int;
503    pub fn fmpz_is_prime(p: *const fmpz) -> c_int;
504    pub fn fmpz_divisor_in_residue_class_lenstra(
505        fac: *mut fmpz,
506        n: *mut fmpz,
507        r: *mut fmpz,
508        s: *mut fmpz,
509    ) -> c_int;
510    pub fn fmpz_nextprime(res: *mut fmpz, n: *const fmpz, proved: c_int);
511    pub fn fmpz_primorial(res: *mut fmpz, n: mp_limb_t);
512    pub fn fmpz_euler_phi(res: *mut fmpz, n: *const fmpz);
513    pub fn fmpz_moebius_mu(n: *const fmpz) -> c_int;
514    pub fn fmpz_divisor_sigma(res: *mut fmpz, n: *const fmpz, k: mp_limb_t);
515    pub fn n_powmod2_fmpz_preinv(
516        a: mp_limb_t,
517        exp: *mut fmpz,
518        n: mp_limb_t,
519        ninv: mp_limb_t,
520    ) -> mp_limb_t;
521    //pub fn nmod_pow_fmpz(a: mp_limb_t, exp: *mut fmpz, mod_: nmod_t) -> mp_limb_t;
522    pub fn __new_fmpz() -> *mut fmpz;
523    pub fn __free_fmpz(f: *mut fmpz);
524    pub fn __fmpz_set_si(f: *mut fmpz, val: mp_limb_signed_t);
525    pub fn __fmpz_set_ui(f: *mut fmpz, val: mp_limb_t);
526    pub fn __fmpz_init(f: *mut fmpz);
527    pub fn __fmpz_init_set_ui(f: *mut fmpz, g: mp_limb_t);
528    pub fn __fmpz_clear(f: *mut fmpz);
529    pub fn __fmpz_lt(f: *mut fmpz, g: *mut fmpz) -> c_int;
530    pub fn __fmpz_gt(f: *mut fmpz, g: *mut fmpz) -> c_int;
531    pub fn __fmpz_lte(f: *mut fmpz, g: *mut fmpz) -> c_int;
532    pub fn __fmpz_gte(f: *mut fmpz, g: *mut fmpz) -> c_int;
533    pub fn __fmpz_eq(f: *mut fmpz, g: *mut fmpz) -> c_int;
534    pub fn __fmpz_neq(f: *mut fmpz, g: *mut fmpz) -> c_int;
535    pub fn __fmpz_init_set(f: *mut fmpz, g: *mut fmpz);
536    pub fn __fmpz_neg(f1: *mut fmpz, f2: *mut fmpz);
537}
538
539// Added to simplify operator macros
540pub unsafe fn fmpz_tdiv_r(r: *mut fmpz, g: *const fmpz, h: *const fmpz) {
541    let mut f: fmpz = fmpz::default();
542    fmpz_init(&mut f);
543    fmpz_tdiv_qr(&mut f, r, g, h);
544    fmpz_clear(&mut f);
545}