flint_sys/
fmpq.rs

1#![allow(non_camel_case_types)]
2
3//! See the [FLINT documentation](http://flintlib.org/doc/fmpq.html).
4
5use crate::deps::*;
6use crate::flint::*;
7use crate::fmpz::fmpz;
8use libc::{c_char, c_int, FILE};
9
10#[repr(C)]
11#[derive(Default, Debug, Copy, Clone, Hash)]
12pub struct fmpq {
13    pub num: fmpz,
14    pub den: fmpz,
15}
16
17pub type fmpq_t = [fmpq; 1usize];
18
19extern "C" {
20    pub fn fmpq_init(x: *mut fmpq);
21    pub fn fmpq_clear(x: *mut fmpq);
22    pub fn fmpq_zero(res: *mut fmpq);
23    pub fn fmpq_one(res: *mut fmpq);
24    pub fn fmpq_equal(x: *const fmpq, y: *const fmpq) -> c_int;
25    pub fn fmpq_sgn(x: *const fmpq) -> c_int;
26    pub fn fmpq_is_zero(x: *const fmpq) -> c_int;
27    pub fn fmpq_is_one(x: *const fmpq) -> c_int;
28    pub fn fmpq_is_pm1(x: *const fmpq) -> c_int;
29    pub fn fmpq_set(dest: *mut fmpq, src: *const fmpq);
30    pub fn fmpq_swap(op1: *mut fmpq, op2: *mut fmpq);
31    pub fn fmpq_neg(dest: *mut fmpq, src: *const fmpq);
32    pub fn fmpq_abs(dest: *mut fmpq, src: *const fmpq);
33    pub fn _fmpq_cmp(p: *const fmpz, q: *const fmpz, r: *const fmpz, s: *const fmpz) -> c_int;
34    pub fn fmpq_cmp(x: *const fmpq, y: *const fmpq) -> c_int;
35    pub fn _fmpq_cmp_fmpz(p: *const fmpz, q: *const fmpz, r: *const fmpz) -> c_int;
36    pub fn fmpq_cmp_fmpz(x: *const fmpq, y: *const fmpz) -> c_int;
37    pub fn _fmpq_cmp_ui(p: *const fmpz, q: *const fmpz, c: mp_limb_t) -> c_int;
38    pub fn fmpq_cmp_ui(x: *const fmpq, c: mp_limb_t) -> c_int;
39    pub fn _fmpq_cmp_si(p: *const fmpz, q: *const fmpz, c: mp_limb_signed_t) -> c_int;
40    pub fn fmpq_cmp_si(x: *const fmpq, c: mp_limb_signed_t) -> c_int;
41    pub fn _fmpq_canonicalise(num: *mut fmpz, den: *mut fmpz);
42    pub fn fmpq_canonicalise(res: *mut fmpq);
43    pub fn _fmpq_is_canonical(num: *const fmpz, den: *const fmpz) -> c_int;
44    pub fn fmpq_is_canonical(x: *const fmpq) -> c_int;
45    pub fn _fmpq_set_ui(rnum: *mut fmpz, rden: *mut fmpz, p: mp_limb_t, q: mp_limb_t);
46    pub fn fmpq_set_ui(res: *mut fmpq, p: mp_limb_t, q: mp_limb_t);
47    pub fn _fmpq_set_si(rnum: *mut fmpz, rden: *mut fmpz, p: mp_limb_signed_t, q: mp_limb_t);
48    pub fn fmpq_set_si(res: *mut fmpq, p: mp_limb_signed_t, q: mp_limb_t);
49    pub fn fmpq_equal_ui(q: *const fmpq, n: mp_limb_t) -> c_int;
50    pub fn fmpq_equal_si(q: *const fmpq, n: mp_limb_signed_t) -> c_int;
51    pub fn fmpq_set_fmpz_frac(res: *mut fmpq, p: *const fmpz, q: *const fmpz);
52    pub fn fmpq_set_str(res: *mut fmpq, str_: *const c_char, base: c_int) -> c_int;
53    pub fn fmpq_set_mpq(dest: *mut fmpq, src: *const __mpq_struct);
54    pub fn fmpq_get_mpq(dest: *mut __mpq_struct, src: *const fmpq);
55    pub fn fmpq_get_d(a: *const fmpq) -> f64;
56    pub fn fmpq_get_mpfr(r: *mut __mpfr_struct, x: *const fmpq, rnd: mpfr_rnd_t) -> c_int;
57    pub fn fmpq_get_mpz_frac(a: *mut __mpz_struct, b: *mut __mpz_struct, c: *const fmpq);
58    pub fn flint_mpq_init_set_readonly(z: *mut __mpq_struct, f: *mut fmpq);
59    pub fn flint_mpq_clear_readonly(z: *mut __mpq_struct);
60    pub fn fmpq_init_set_readonly(f: *mut fmpq, z: *mut __mpq_struct);
61    pub fn fmpq_clear_readonly(f: *mut fmpq);
62    pub fn fmpq_init_set_mpz_frac_readonly(
63        z: *mut fmpq,
64        num: *mut __mpz_struct,
65        den: *mut __mpz_struct,
66    );
67    pub fn _fmpq_get_str(
68        str_: *mut c_char,
69        b: c_int,
70        num: *const fmpz,
71        den: *const fmpz,
72    ) -> *mut c_char;
73    pub fn fmpq_get_str(str_: *mut c_char, b: c_int, x: *const fmpq) -> *mut c_char;
74    pub fn _fmpq_fprint(file: *mut FILE, num: *const fmpz, den: *const fmpz) -> c_int;
75    pub fn fmpq_fprint(file: *mut FILE, x: *const fmpq) -> c_int;
76    pub fn _fmpq_print(num: *const fmpz, den: *const fmpz) -> c_int;
77    pub fn fmpq_print(x: *const fmpq) -> c_int;
78    pub fn _fmpq_randtest(
79        num: *mut fmpz,
80        den: *mut fmpz,
81        state: *mut flint_rand_s,
82        bits: mp_limb_t,
83    );
84    pub fn fmpq_randtest(res: *mut fmpq, state: *mut flint_rand_s, bits: mp_limb_t);
85    pub fn fmpq_randtest_not_zero(res: *mut fmpq, state: *mut flint_rand_s, bits: mp_limb_t);
86    pub fn _fmpq_randbits(
87        num: *mut fmpz,
88        den: *mut fmpz,
89        state: *mut flint_rand_s,
90        bits: mp_limb_t,
91    );
92    pub fn fmpq_randbits(res: *mut fmpq, state: *mut flint_rand_s, bits: mp_limb_t);
93    pub fn _fmpq_add_small(
94        rnum: *mut fmpz,
95        rden: *mut fmpz,
96        p1: mp_limb_signed_t,
97        q1: mp_limb_t,
98        p2: mp_limb_signed_t,
99        q2: mp_limb_t,
100    );
101    pub fn _fmpq_mul_small(
102        rnum: *mut fmpz,
103        rden: *mut fmpz,
104        p1: mp_limb_signed_t,
105        q1: mp_limb_t,
106        p2: mp_limb_signed_t,
107        q2: mp_limb_t,
108    );
109    pub fn _fmpq_add(
110        rnum: *mut fmpz,
111        rden: *mut fmpz,
112        op1num: *const fmpz,
113        op1den: *const fmpz,
114        op2num: *const fmpz,
115        op2den: *const fmpz,
116    );
117    pub fn fmpq_add(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
118    pub fn _fmpq_add_si(
119        rnum: *mut fmpz,
120        rden: *mut fmpz,
121        p: *const fmpz,
122        q: *const fmpz,
123        r: mp_limb_signed_t,
124    );
125    pub fn fmpq_add_si(res: *mut fmpq, op1: *const fmpq, c: mp_limb_signed_t);
126    pub fn _fmpq_add_ui(
127        rnum: *mut fmpz,
128        rden: *mut fmpz,
129        p: *const fmpz,
130        q: *const fmpz,
131        r: mp_limb_t,
132    );
133    pub fn fmpq_add_ui(res: *mut fmpq, op1: *const fmpq, c: mp_limb_t);
134    pub fn _fmpq_add_fmpz(
135        rnum: *mut fmpz,
136        rden: *mut fmpz,
137        p: *const fmpz,
138        q: *const fmpz,
139        r: *const fmpz,
140    );
141    pub fn fmpq_add_fmpz(res: *mut fmpq, op1: *const fmpq, c: *const fmpz);
142    pub fn _fmpq_sub(
143        rnum: *mut fmpz,
144        rden: *mut fmpz,
145        op1num: *const fmpz,
146        op1den: *const fmpz,
147        op2num: *const fmpz,
148        op2den: *const fmpz,
149    );
150    pub fn fmpq_sub(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
151    pub fn _fmpq_sub_si(
152        rnum: *mut fmpz,
153        rden: *mut fmpz,
154        p: *const fmpz,
155        q: *const fmpz,
156        r: mp_limb_signed_t,
157    );
158    pub fn fmpq_sub_si(res: *mut fmpq, op1: *const fmpq, c: mp_limb_signed_t);
159    pub fn _fmpq_sub_ui(
160        rnum: *mut fmpz,
161        rden: *mut fmpz,
162        p: *const fmpz,
163        q: *const fmpz,
164        r: mp_limb_t,
165    );
166    pub fn fmpq_sub_ui(res: *mut fmpq, op1: *const fmpq, c: mp_limb_t);
167    pub fn _fmpq_sub_fmpz(
168        rnum: *mut fmpz,
169        rden: *mut fmpz,
170        p: *const fmpz,
171        q: *const fmpz,
172        r: *const fmpz,
173    );
174    pub fn fmpq_sub_fmpz(res: *mut fmpq, op1: *const fmpq, c: *const fmpz);
175    pub fn _fmpq_mul_si(
176        rnum: *mut fmpz,
177        rden: *mut fmpz,
178        p: *const fmpz,
179        q: *const fmpz,
180        r: mp_limb_signed_t,
181    );
182    pub fn fmpq_mul_si(res: *mut fmpq, op1: *const fmpq, c: mp_limb_signed_t);
183    pub fn _fmpq_mul_ui(
184        rnum: *mut fmpz,
185        rden: *mut fmpz,
186        p: *const fmpz,
187        q: *const fmpz,
188        r: mp_limb_t,
189    );
190    pub fn fmpq_mul_ui(res: *mut fmpq, op1: *const fmpq, c: mp_limb_t);
191    pub fn _fmpq_mul(
192        rnum: *mut fmpz,
193        rden: *mut fmpz,
194        op1num: *const fmpz,
195        op1den: *const fmpz,
196        op2num: *const fmpz,
197        op2den: *const fmpz,
198    );
199    pub fn fmpq_mul(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
200    pub fn fmpq_mul_fmpz(res: *mut fmpq, op: *const fmpq, x: *const fmpz);
201    pub fn _fmpq_pow_si(
202        rnum: *mut fmpz,
203        rden: *mut fmpz,
204        opnum: *const fmpz,
205        opden: *const fmpz,
206        e: mp_limb_signed_t,
207    );
208    pub fn fmpq_pow_si(rop: *mut fmpq, op: *const fmpq, e: mp_limb_signed_t);
209    pub fn fmpq_pow_fmpz(a: *mut fmpq, b: *const fmpq, e: *const fmpz) -> c_int;
210    pub fn _fmpq_addmul(
211        rnum: *mut fmpz,
212        rden: *mut fmpz,
213        op1num: *const fmpz,
214        op1den: *const fmpz,
215        op2num: *const fmpz,
216        op2den: *const fmpz,
217    );
218    pub fn fmpq_addmul(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
219    pub fn _fmpq_submul(
220        rnum: *mut fmpz,
221        rden: *mut fmpz,
222        op1num: *const fmpz,
223        op1den: *const fmpz,
224        op2num: *const fmpz,
225        op2den: *const fmpz,
226    );
227    pub fn fmpq_submul(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
228    pub fn fmpq_inv(dest: *mut fmpq, src: *const fmpq);
229    pub fn _fmpq_div(
230        rnum: *mut fmpz,
231        rden: *mut fmpz,
232        op1num: *const fmpz,
233        op1den: *const fmpz,
234        op2num: *const fmpz,
235        op2den: *const fmpz,
236    );
237    pub fn fmpq_div(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
238    pub fn fmpq_div_fmpz(res: *mut fmpq, op: *const fmpq, x: *const fmpz);
239    pub fn fmpq_mul_2exp(res: *mut fmpq, x: *const fmpq, exp: mp_limb_t);
240    pub fn fmpq_div_2exp(res: *mut fmpq, x: *const fmpq, exp: mp_limb_t);
241    pub fn _fmpq_mod_fmpz(
242        res: *mut fmpz,
243        num: *const fmpz,
244        den: *const fmpz,
245        mod_: *const fmpz,
246    ) -> c_int;
247    pub fn fmpq_mod_fmpz(res: *mut fmpz, x: *const fmpq, mod_: *const fmpz) -> c_int;
248    pub fn _fmpq_gcd(
249        rnum: *mut fmpz,
250        rden: *mut fmpz,
251        p: *const fmpz,
252        q: *const fmpz,
253        r: *const fmpz,
254        s: *const fmpz,
255    );
256    pub fn fmpq_gcd(res: *mut fmpq, op1: *const fmpq, op2: *const fmpq);
257    pub fn _fmpq_gcd_cofactors(
258        ng: *mut fmpz,
259        dg: *mut fmpz,
260        A: *mut fmpz,
261        B: *mut fmpz,
262        na: *const fmpz,
263        da: *const fmpz,
264        nb: *const fmpz,
265        db: *const fmpz,
266    );
267    pub fn fmpq_gcd_cofactors(
268        g: *mut fmpq,
269        A: *mut fmpz,
270        B: *mut fmpz,
271        a: *const fmpq,
272        b: *const fmpq,
273    );
274    pub fn _fmpq_reconstruct_fmpz(
275        num: *mut fmpz,
276        den: *mut fmpz,
277        a: *const fmpz,
278        m: *const fmpz,
279    ) -> c_int;
280    pub fn fmpq_reconstruct_fmpz(res: *mut fmpq, a: *const fmpz, m: *const fmpz) -> c_int;
281    pub fn _fmpq_reconstruct_fmpz_2_naive(
282        n: *mut fmpz,
283        d: *mut fmpz,
284        a: *const fmpz,
285        m: *const fmpz,
286        N: *const fmpz,
287        D: *const fmpz,
288    ) -> c_int;
289    pub fn _fmpq_reconstruct_fmpz_2(
290        n: *mut fmpz,
291        d: *mut fmpz,
292        a: *const fmpz,
293        m: *const fmpz,
294        N: *const fmpz,
295        D: *const fmpz,
296    ) -> c_int;
297    pub fn fmpq_reconstruct_fmpz_2(
298        res: *mut fmpq,
299        a: *const fmpz,
300        m: *const fmpz,
301        N: *const fmpz,
302        D: *const fmpz,
303    ) -> c_int;
304    pub fn fmpq_height_bits(x: *const fmpq) -> mp_limb_t;
305    pub fn fmpq_height(height: *mut fmpz, x: *const fmpq);
306    pub fn _fmpq_next_calkin_wilf(
307        rnum: *mut fmpz,
308        rden: *mut fmpz,
309        num: *const fmpz,
310        den: *const fmpz,
311    );
312    pub fn fmpq_next_calkin_wilf(res: *mut fmpq, x: *const fmpq);
313    pub fn _fmpq_next_signed_calkin_wilf(
314        rnum: *mut fmpz,
315        rden: *mut fmpz,
316        num: *const fmpz,
317        den: *const fmpz,
318    );
319    pub fn fmpq_next_signed_calkin_wilf(res: *mut fmpq, x: *const fmpq);
320    pub fn _fmpq_next_minimal(rnum: *mut fmpz, rden: *mut fmpz, num: *const fmpz, den: *const fmpz);
321    pub fn fmpq_next_minimal(res: *mut fmpq, x: *const fmpq);
322    pub fn _fmpq_next_signed_minimal(
323        rnum: *mut fmpz,
324        rden: *mut fmpz,
325        num: *const fmpz,
326        den: *const fmpz,
327    );
328    pub fn fmpq_next_signed_minimal(res: *mut fmpq, x: *const fmpq);
329    pub fn fmpq_farey_neighbors(left: *mut fmpq, right: *mut fmpq, mid: *mut fmpq, Q: *const fmpz);
330    pub fn fmpq_simplest_between(mid: *mut fmpq, l: *const fmpq, r: *const fmpq);
331    pub fn _fmpq_simplest_between(
332        mid_num: *mut fmpz,
333        mid_den: *mut fmpz,
334        l_num: *const fmpz,
335        l_den: *const fmpz,
336        r_num: *const fmpz,
337        r_den: *const fmpz,
338    );
339    pub fn fmpq_get_cfrac_naive(
340        c: *mut fmpz,
341        rem: *mut fmpq,
342        x: *const fmpq,
343        n: mp_limb_signed_t,
344    ) -> mp_limb_signed_t;
345    pub fn fmpq_get_cfrac(
346        c: *mut fmpz,
347        rem: *mut fmpq,
348        x: *const fmpq,
349        n: mp_limb_signed_t,
350    ) -> mp_limb_signed_t;
351    pub fn fmpq_set_cfrac(x: *mut fmpq, c: *const fmpz, n: mp_limb_signed_t);
352    pub fn fmpq_cfrac_bound(x: *mut fmpq) -> mp_limb_signed_t;
353    pub fn fmpq_dedekind_sum_naive(s: *mut fmpq, h: *const fmpz, k: *const fmpz);
354    pub fn fmpq_dedekind_sum(s: *mut fmpq, h: *const fmpz, k: *const fmpz);
355    pub fn _fmpq_harmonic_ui(num: *mut fmpz, den: *mut fmpz, n: mp_limb_t);
356    pub fn fmpq_harmonic_ui(x: *mut fmpq, n: mp_limb_t);
357    pub fn _fmpq_vec_init(len: mp_limb_signed_t) -> *mut fmpq;
358    pub fn _fmpq_vec_clear(vec: *mut fmpq, len: mp_limb_signed_t);
359}
360
361pub unsafe fn fmpq_set_ui_den1(res: *mut fmpq, num: mp_limb_t) {
362    fmpq_set_ui(res, num, 1 as mp_limb_t);
363}
364
365pub unsafe fn fmpq_set_si_den1(res: *mut fmpq, num: mp_limb_signed_t) {
366    fmpq_set_si(res, num, 1 as mp_limb_t);
367}
368
369pub unsafe fn fmpq_set_fmpz_den1(res: *mut fmpq, num: *const fmpz) {
370    fmpq_set_fmpz_frac(res, num, &fmpz(1) as *const fmpz);
371}