1#![allow(non_camel_case_types)]
2
3use 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}