flint_sys/
fmpz_mat.rs

1#![allow(non_camel_case_types)]
2// TODO: nmod
3
4//! See the [FLINT documentation](http://flintlib.org/doc/fmpz_mat.html).
5
6use crate::deps::*;
7use crate::flint::*;
8use crate::fmpq::fmpq;
9use crate::fmpz::fmpz;
10use crate::fmpz_poly::fmpz_poly_struct;
11use libc::{c_int, FILE};
12
13#[repr(C)]
14#[derive(Debug, Copy, Clone, Hash)]
15pub struct fmpz_mat_struct {
16    pub entries: *mut fmpz,
17    pub r: mp_limb_signed_t,
18    pub c: mp_limb_signed_t,
19    pub rows: *mut *mut fmpz,
20}
21
22pub type fmpz_mat_t = [fmpz_mat_struct; 1usize];
23
24#[repr(C)]
25#[derive(Debug, Copy, Clone)]
26pub struct col_hash_t {
27    pub col: mp_limb_t,
28    pub hash: mp_limb_t,
29}
30
31extern "C" {
32    pub fn fmpz_mat_entry(
33        mat: *const fmpz_mat_struct,
34        i: mp_limb_signed_t,
35        j: mp_limb_signed_t,
36    ) -> *mut fmpz;
37    pub fn fmpz_mat_nrows(mat: *const fmpz_mat_struct) -> mp_limb_signed_t;
38    pub fn fmpz_mat_ncols(mat: *const fmpz_mat_struct) -> mp_limb_signed_t;
39    pub fn fmpz_mat_init(mat: *mut fmpz_mat_struct, rows: mp_limb_signed_t, cols: mp_limb_signed_t);
40    pub fn fmpz_mat_init_set(mat: *mut fmpz_mat_struct, src: *const fmpz_mat_struct);
41    pub fn fmpz_mat_swap(mat1: *mut fmpz_mat_struct, mat2: *mut fmpz_mat_struct);
42    pub fn fmpz_mat_set(mat1: *mut fmpz_mat_struct, mat2: *const fmpz_mat_struct);
43    pub fn fmpz_mat_clear(mat: *mut fmpz_mat_struct);
44    pub fn fmpz_mat_equal(mat1: *const fmpz_mat_struct, mat2: *const fmpz_mat_struct) -> c_int;
45    pub fn fmpz_mat_is_zero(mat: *const fmpz_mat_struct) -> c_int;
46    pub fn fmpz_mat_is_one(mat: *const fmpz_mat_struct) -> c_int;
47    pub fn fmpz_mat_is_zero_row(mat: *const fmpz_mat_struct, i: mp_limb_signed_t) -> c_int;
48    pub fn fmpz_mat_col_equal(
49        M: *const fmpz_mat_struct,
50        m: mp_limb_signed_t,
51        n: mp_limb_signed_t,
52    ) -> c_int;
53    pub fn fmpz_mat_row_equal(
54        M: *const fmpz_mat_struct,
55        m: mp_limb_signed_t,
56        n: mp_limb_signed_t,
57    ) -> c_int;
58    pub fn fmpz_mat_is_empty(mat: *const fmpz_mat_struct) -> c_int;
59    pub fn fmpz_mat_is_square(mat: *const fmpz_mat_struct) -> c_int;
60    pub fn fmpz_mat_zero(mat: *mut fmpz_mat_struct);
61    pub fn fmpz_mat_one(mat: *mut fmpz_mat_struct);
62    pub fn fmpz_mat_window_init(
63        window: *mut fmpz_mat_struct,
64        mat: *const fmpz_mat_struct,
65        r1: mp_limb_signed_t,
66        c1: mp_limb_signed_t,
67        r2: mp_limb_signed_t,
68        c2: mp_limb_signed_t,
69    );
70    pub fn fmpz_mat_window_clear(window: *mut fmpz_mat_struct);
71    pub fn fmpz_mat_concat_horizontal(
72        res: *mut fmpz_mat_struct,
73        mat1: *const fmpz_mat_struct,
74        mat2: *const fmpz_mat_struct,
75    );
76    pub fn fmpz_mat_concat_vertical(
77        res: *mut fmpz_mat_struct,
78        mat1: *const fmpz_mat_struct,
79        mat2: *const fmpz_mat_struct,
80    );
81    pub fn fmpz_mat_fprint(file: *mut FILE, mat: *const fmpz_mat_struct) -> c_int;
82    pub fn fmpz_mat_fprint_pretty(file: *mut FILE, mat: *const fmpz_mat_struct) -> c_int;
83    pub fn fmpz_mat_print(mat: *const fmpz_mat_struct) -> c_int;
84    pub fn fmpz_mat_print_pretty(mat: *const fmpz_mat_struct) -> c_int;
85    pub fn fmpz_mat_fread(file: *const FILE, mat: *mut fmpz_mat_struct) -> c_int;
86    pub fn fmpz_mat_read(mat: *mut fmpz_mat_struct) -> c_int;
87    pub fn fmpz_mat_randbits(
88        mat: *mut fmpz_mat_struct,
89        state: *const flint_rand_s,
90        bits: mp_limb_t,
91    );
92    pub fn fmpz_mat_randtest(
93        mat: *mut fmpz_mat_struct,
94        state: *const flint_rand_s,
95        bits: mp_limb_t,
96    );
97    pub fn fmpz_mat_randtest_unsigned(
98        mat: *mut fmpz_mat_struct,
99        state: *const flint_rand_s,
100        bits: mp_limb_t,
101    );
102    pub fn fmpz_mat_randintrel(
103        mat: *mut fmpz_mat_struct,
104        state: *const flint_rand_s,
105        bits: mp_limb_t,
106    );
107    pub fn fmpz_mat_randsimdioph(
108        mat: *mut fmpz_mat_struct,
109        state: *const flint_rand_s,
110        bits: mp_limb_t,
111        bits2: mp_limb_t,
112    );
113    pub fn fmpz_mat_randntrulike(
114        mat: *mut fmpz_mat_struct,
115        state: *const flint_rand_s,
116        bits: mp_limb_t,
117        q: mp_limb_t,
118    );
119    pub fn fmpz_mat_randntrulike2(
120        mat: *mut fmpz_mat_struct,
121        state: *const flint_rand_s,
122        bits: mp_limb_t,
123        q: mp_limb_t,
124    );
125    pub fn fmpz_mat_randajtai(mat: *mut fmpz_mat_struct, state: *const flint_rand_s, alpha: f64);
126    pub fn fmpz_mat_randrank(
127        mat: *mut fmpz_mat_struct,
128        state: *const flint_rand_s,
129        rank: mp_limb_signed_t,
130        bits: mp_limb_t,
131    );
132    pub fn fmpz_mat_randdet(
133        mat: *mut fmpz_mat_struct,
134        state: *const flint_rand_s,
135        det: *const fmpz,
136    );
137    pub fn fmpz_mat_randops(
138        mat: *mut fmpz_mat_struct,
139        state: *const flint_rand_s,
140        count: mp_limb_signed_t,
141    );
142    pub fn fmpz_mat_randpermdiag(
143        mat: *mut fmpz_mat_struct,
144        state: *const flint_rand_s,
145        diag: *const fmpz,
146        n: mp_limb_signed_t,
147    ) -> c_int;
148    pub fn fmpz_mat_max_bits(mat: *const fmpz_mat_struct) -> mp_limb_signed_t;
149    pub fn fmpz_mat_transpose(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
150    pub fn fmpz_mat_add(
151        C: *mut fmpz_mat_struct,
152        A: *const fmpz_mat_struct,
153        B: *const fmpz_mat_struct,
154    );
155    pub fn fmpz_mat_sub(
156        C: *mut fmpz_mat_struct,
157        A: *const fmpz_mat_struct,
158        B: *const fmpz_mat_struct,
159    );
160    pub fn fmpz_mat_neg(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
161    pub fn fmpz_mat_scalar_mul_fmpz(
162        B: *mut fmpz_mat_struct,
163        A: *const fmpz_mat_struct,
164        c: *const fmpz,
165    );
166    pub fn fmpz_mat_scalar_mul_si(
167        B: *mut fmpz_mat_struct,
168        A: *const fmpz_mat_struct,
169        c: mp_limb_signed_t,
170    );
171    pub fn fmpz_mat_scalar_mul_ui(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct, c: mp_limb_t);
172    pub fn fmpz_mat_scalar_addmul_fmpz(
173        B: *mut fmpz_mat_struct,
174        A: *const fmpz_mat_struct,
175        c: *const fmpz,
176    );
177    pub fn fmpz_mat_scalar_addmul_si(
178        B: *mut fmpz_mat_struct,
179        A: *const fmpz_mat_struct,
180        c: mp_limb_signed_t,
181    );
182    pub fn fmpz_mat_scalar_addmul_ui(
183        B: *mut fmpz_mat_struct,
184        A: *const fmpz_mat_struct,
185        c: mp_limb_t,
186    );
187    pub fn fmpz_mat_scalar_submul_fmpz(
188        B: *mut fmpz_mat_struct,
189        A: *const fmpz_mat_struct,
190        c: *const fmpz,
191    );
192    pub fn fmpz_mat_scalar_submul_si(
193        B: *mut fmpz_mat_struct,
194        A: *const fmpz_mat_struct,
195        c: mp_limb_signed_t,
196    );
197    pub fn fmpz_mat_scalar_submul_ui(
198        B: *mut fmpz_mat_struct,
199        A: *const fmpz_mat_struct,
200        c: mp_limb_t,
201    );
202    /*
203    pub fn fmpz_mat_scalar_addmul_nmod_mat_fmpz(
204        B: *mut fmpz_mat_struct,
205        A: *mut nmod_mat_struct,
206        c: *mut fmpz,
207    );
208    pub fn fmpz_mat_scalar_addmul_nmod_mat_ui(
209        B: *mut fmpz_mat_struct,
210        A: *mut nmod_mat_struct,
211        c: mp_limb_t,
212    );
213    */
214    pub fn fmpz_mat_scalar_divexact_fmpz(
215        B: *mut fmpz_mat_struct,
216        A: *const fmpz_mat_struct,
217        c: *const fmpz,
218    );
219    pub fn fmpz_mat_scalar_divexact_si(
220        B: *mut fmpz_mat_struct,
221        A: *const fmpz_mat_struct,
222        c: mp_limb_signed_t,
223    );
224    pub fn fmpz_mat_scalar_divexact_ui(
225        B: *mut fmpz_mat_struct,
226        A: *const fmpz_mat_struct,
227        c: mp_limb_t,
228    );
229    pub fn fmpz_mat_scalar_mul_2exp(
230        B: *mut fmpz_mat_struct,
231        A: *const fmpz_mat_struct,
232        exp: mp_limb_t,
233    );
234    pub fn fmpz_mat_scalar_tdiv_q_2exp(
235        B: *mut fmpz_mat_struct,
236        A: *const fmpz_mat_struct,
237        exp: mp_limb_t,
238    );
239    pub fn fmpz_mat_scalar_smod(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct, P: *const fmpz);
240    pub fn fmpz_mat_scalar_mod_fmpz(
241        B: *mut fmpz_mat_struct,
242        A: *const fmpz_mat_struct,
243        m: *const fmpz,
244    );
245    pub fn fmpz_mat_mul(
246        C: *mut fmpz_mat_struct,
247        A: *const fmpz_mat_struct,
248        B: *const fmpz_mat_struct,
249    );
250    pub fn fmpz_mat_mul_classical(
251        C: *mut fmpz_mat_struct,
252        A: *const fmpz_mat_struct,
253        B: *const fmpz_mat_struct,
254    );
255    pub fn fmpz_mat_mul_strassen(
256        C: *mut fmpz_mat_struct,
257        A: *const fmpz_mat_struct,
258        B: *const fmpz_mat_struct,
259    );
260    pub fn fmpz_mat_mul_classical_inline(
261        C: *mut fmpz_mat_struct,
262        A: *const fmpz_mat_struct,
263        B: *const fmpz_mat_struct,
264    );
265    pub fn _fmpz_mat_mul_multi_mod(
266        C: *mut fmpz_mat_struct,
267        A: *const fmpz_mat_struct,
268        B: *const fmpz_mat_struct,
269        bits: mp_limb_t,
270    );
271    pub fn fmpz_mat_mul_multi_mod(
272        C: *mut fmpz_mat_struct,
273        A: *const fmpz_mat_struct,
274        B: *const fmpz_mat_struct,
275    );
276    pub fn fmpz_mat_sqr_bodrato(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
277    pub fn fmpz_mat_sqr(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
278    pub fn fmpz_mat_pow(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct, exp: mp_limb_t);
279    pub fn fmpz_mat_kronecker_product(
280        C: *mut fmpz_mat_struct,
281        A: *const fmpz_mat_struct,
282        B: *const fmpz_mat_struct,
283    );
284    pub fn fmpz_mat_content(ret: *mut fmpz, A: *const fmpz_mat_struct);
285    pub fn fmpz_mat_swap_rows(
286        mat: *mut fmpz_mat_struct,
287        perm: *const mp_limb_signed_t,
288        r: mp_limb_signed_t,
289        s: mp_limb_signed_t,
290    );
291    pub fn fmpz_mat_invert_rows(mat: *mut fmpz_mat_struct, perm: *const mp_limb_signed_t);
292    pub fn fmpz_mat_swap_cols(
293        mat: *mut fmpz_mat_struct,
294        perm: *const mp_limb_signed_t,
295        r: mp_limb_signed_t,
296        s: mp_limb_signed_t,
297    );
298    pub fn fmpz_mat_invert_cols(mat: *mut fmpz_mat_struct, perm: *const mp_limb_signed_t);
299    pub fn fmpz_mat_find_pivot_any(
300        mat: *const fmpz_mat_struct,
301        start_row: mp_limb_signed_t,
302        end_row: mp_limb_signed_t,
303        c: mp_limb_signed_t,
304    ) -> mp_limb_signed_t;
305    pub fn fmpz_mat_find_pivot_smallest(
306        mat: *const fmpz_mat_struct,
307        start_row: mp_limb_signed_t,
308        end_row: mp_limb_signed_t,
309        c: mp_limb_signed_t,
310    ) -> mp_limb_signed_t;
311    pub fn fmpz_mat_fflu(
312        B: *mut fmpz_mat_struct,
313        den: *mut fmpz,
314        perm: *const mp_limb_signed_t,
315        A: *const fmpz_mat_struct,
316        rank_check: c_int,
317    ) -> mp_limb_signed_t;
318    pub fn fmpz_mat_rank_small_inplace(B: *mut fmpz_mat_struct) -> mp_limb_signed_t;
319    pub fn fmpz_mat_rref(
320        B: *mut fmpz_mat_struct,
321        den: *mut fmpz,
322        A: *const fmpz_mat_struct,
323    ) -> mp_limb_signed_t;
324    pub fn fmpz_mat_rref_fflu(
325        B: *mut fmpz_mat_struct,
326        den: *mut fmpz,
327        A: *const fmpz_mat_struct,
328    ) -> mp_limb_signed_t;
329    pub fn fmpz_mat_rref_mul(
330        B: *mut fmpz_mat_struct,
331        den: *mut fmpz,
332        A: *const fmpz_mat_struct,
333    ) -> mp_limb_signed_t;
334    pub fn fmpz_mat_is_in_rref_with_rank(
335        A: *mut fmpz_mat_struct,
336        den: *mut fmpz,
337        rank: mp_limb_signed_t,
338    ) -> c_int;
339    pub fn fmpz_mat_rref_mod(
340        perm: *mut mp_limb_signed_t,
341        A: *mut fmpz_mat_struct,
342        p: *const fmpz,
343    ) -> mp_limb_signed_t;
344    pub fn fmpz_mat_howell_form_mod(A: *mut fmpz_mat_struct, mod_: *const fmpz)
345        -> mp_limb_signed_t;
346    pub fn fmpz_mat_strong_echelon_form_mod(A: *mut fmpz_mat_struct, mod_: *const fmpz);
347    pub fn fmpz_mat_trace(trace: *mut fmpz, mat: *const fmpz_mat_struct);
348    pub fn fmpz_mat_det(det: *mut fmpz, A: *const fmpz_mat_struct);
349    pub fn fmpz_mat_det_cofactor(det: *mut fmpz, A: *const fmpz_mat_struct);
350    pub fn fmpz_mat_det_bareiss(det: *mut fmpz, A: *const fmpz_mat_struct);
351    pub fn fmpz_mat_det_modular(det: *mut fmpz, A: *const fmpz_mat_struct, proved: c_int);
352    pub fn fmpz_mat_det_modular_accelerated(
353        det: *mut fmpz,
354        A: *const fmpz_mat_struct,
355        proved: c_int,
356    );
357    pub fn fmpz_mat_det_modular_given_divisor(
358        det: *mut fmpz,
359        A: *const fmpz_mat_struct,
360        d: *const fmpz,
361        proved: c_int,
362    );
363    pub fn fmpz_mat_det_bound(bound: *mut fmpz, A: *const fmpz_mat_struct);
364    pub fn fmpz_mat_det_bound_nonzero(bound: *mut fmpz, A: *const fmpz_mat_struct);
365    pub fn fmpz_mat_det_divisor(d: *mut fmpz, A: *const fmpz_mat_struct);
366    pub fn fmpz_mat_similarity(A: *mut fmpz_mat_struct, r: mp_limb_signed_t, d: *const fmpz);
367    pub fn _fmpz_mat_charpoly_berkowitz(rop: *mut fmpz, op: *const fmpz_mat_struct);
368    pub fn fmpz_mat_charpoly_berkowitz(cp: *mut fmpz_poly_struct, mat: *const fmpz_mat_struct);
369    pub fn _fmpz_mat_charpoly_modular(rop: *mut fmpz, op: *const fmpz_mat_struct);
370    pub fn fmpz_mat_charpoly_modular(cp: *mut fmpz_poly_struct, mat: *const fmpz_mat_struct);
371    pub fn _fmpz_mat_charpoly(cp: *mut fmpz, mat: *const fmpz_mat_struct);
372    pub fn fmpz_mat_charpoly(cp: *mut fmpz_poly_struct, mat: *const fmpz_mat_struct);
373    pub fn _fmpz_mat_minpoly_modular(
374        rop: *mut fmpz,
375        op: *const fmpz_mat_struct,
376    ) -> mp_limb_signed_t;
377    pub fn fmpz_mat_minpoly_modular(cp: *mut fmpz_poly_struct, mat: *const fmpz_mat_struct);
378    pub fn _fmpz_mat_minpoly(cp: *mut fmpz, mat: *const fmpz_mat_struct) -> mp_limb_signed_t;
379    pub fn fmpz_mat_minpoly(cp: *mut fmpz_poly_struct, mat: *const fmpz_mat_struct);
380    pub fn fmpz_mat_rank(A: *const fmpz_mat_struct) -> mp_limb_signed_t;
381    pub fn fmpz_mat_solve_bound(
382        N: *mut fmpz,
383        D: *mut fmpz,
384        A: *const fmpz_mat_struct,
385        B: *const fmpz_mat_struct,
386    );
387    pub fn fmpz_mat_solve(
388        X: *mut fmpz_mat_struct,
389        den: *mut fmpz,
390        A: *const fmpz_mat_struct,
391        B: *const fmpz_mat_struct,
392    ) -> c_int;
393    pub fn fmpz_mat_solve_cramer(
394        X: *mut fmpz_mat_struct,
395        den: *mut fmpz,
396        A: *const fmpz_mat_struct,
397        B: *const fmpz_mat_struct,
398    ) -> c_int;
399    pub fn fmpz_mat_solve_fflu(
400        X: *mut fmpz_mat_struct,
401        den: *mut fmpz,
402        A: *const fmpz_mat_struct,
403        B: *const fmpz_mat_struct,
404    ) -> c_int;
405    pub fn fmpz_mat_solve_fflu_precomp(
406        X: *mut fmpz_mat_struct,
407        perm: *const mp_limb_signed_t,
408        FFLU: *const fmpz_mat_struct,
409        B: *const fmpz_mat_struct,
410    );
411    /*
412    pub fn fmpz_mat_find_good_prime_and_invert(
413        Ainv: *mut nmod_mat_struct,
414        A: *mut fmpz_mat_struct,
415        det_bound: *mut fmpz,
416    ) -> mp_limb_t;
417    */
418    pub fn fmpz_mat_dixon_get_crt_primes(
419        num_primes: *mut mp_limb_signed_t,
420        A: *mut fmpz_mat_struct,
421        p: mp_limb_t,
422    ) -> *mut mp_limb_t;
423    /*
424    pub fn _fmpz_mat_solve_dixon(
425        X: *mut fmpz_mat_struct,
426        mod_: *mut fmpz,
427        A: *mut fmpz_mat_struct,
428        B: *mut fmpz_mat_struct,
429        Ainv: *mut nmod_mat_struct,
430        p: mp_limb_t,
431        N: *mut fmpz,
432        D: *mut fmpz,
433    );*/
434    pub fn fmpz_mat_solve_dixon(
435        X: *mut fmpz_mat_struct,
436        mod_: *mut fmpz,
437        A: *const fmpz_mat_struct,
438        B: *const fmpz_mat_struct,
439    ) -> c_int;
440    /*
441    pub fn _fmpz_mat_solve_dixon_den(
442        X: *mut fmpz_mat_struct,
443        den: *mut fmpz,
444        A: *mut fmpz_mat_struct,
445        B: *mut fmpz_mat_struct,
446        Ainv: *mut nmod_mat_struct,
447        p: mp_limb_t,
448        N: *mut fmpz,
449        D: *mut fmpz,
450    );*/
451    pub fn fmpz_mat_solve_dixon_den(
452        X: *mut fmpz_mat_struct,
453        den: *mut fmpz,
454        A: *const fmpz_mat_struct,
455        B: *const fmpz_mat_struct,
456    ) -> c_int;
457    pub fn fmpz_mat_solve_multi_mod_den(
458        X: *mut fmpz_mat_struct,
459        den: *mut fmpz,
460        A: *const fmpz_mat_struct,
461        B: *const fmpz_mat_struct,
462    ) -> c_int;
463    pub fn fmpz_mat_can_solve_multi_mod_den(
464        X: *mut fmpz_mat_struct,
465        den: *mut fmpz,
466        A: *const fmpz_mat_struct,
467        B: *const fmpz_mat_struct,
468    ) -> c_int;
469    pub fn fmpz_mat_nullspace(
470        res: *mut fmpz_mat_struct,
471        mat: *const fmpz_mat_struct,
472    ) -> mp_limb_signed_t;
473    pub fn fmpz_mat_inv(
474        B: *mut fmpz_mat_struct,
475        den: *mut fmpz,
476        A: *const fmpz_mat_struct,
477    ) -> c_int;
478    /*
479    pub fn fmpz_mat_set_nmod_mat(A: *mut fmpz_mat_struct, Amod: *mut nmod_mat_struct);
480    pub fn fmpz_mat_set_nmod_mat_unsigned(A: *mut fmpz_mat_struct, Amod: *mut nmod_mat_struct);
481    pub fn fmpz_mat_get_nmod_mat(Amod: *mut nmod_mat_struct, A: *mut fmpz_mat_struct);
482    pub fn fmpz_mat_CRT_ui(
483        res: *mut fmpz_mat_struct,
484        mat1: *mut fmpz_mat_struct,
485        m1: *mut fmpz,
486        mat2: *mut nmod_mat_struct,
487        sign: c_int,
488    );
489    pub fn fmpz_mat_multi_mod_ui_precomp(
490        residues: *mut nmod_mat_t,
491        nres: mp_limb_signed_t,
492        mat: *mut fmpz_mat_struct,
493        comb: *mut fmpz_comb_struct,
494        temp: *mut fmpz_comb_temp_struct,
495    );
496    pub fn fmpz_mat_multi_mod_ui(
497        residues: *mut nmod_mat_t,
498        nres: mp_limb_signed_t,
499        mat: *mut fmpz_mat_struct,
500    );
501    pub fn fmpz_mat_multi_CRT_ui_precomp(
502        mat: *mut fmpz_mat_struct,
503        residues: *mut nmod_mat_t,
504        nres: mp_limb_signed_t,
505        comb: *mut fmpz_comb_struct,
506        temp: *mut fmpz_comb_temp_struct,
507        sign: c_int,
508    );
509    pub fn fmpz_mat_multi_CRT_ui(
510        mat: *mut fmpz_mat_struct,
511        residues: *mut nmod_mat_t,
512        nres: mp_limb_signed_t,
513        sign: c_int,
514    );
515    */
516    pub fn fmpz_mat_hnf(H: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
517    pub fn fmpz_mat_hnf_transform(
518        H: *mut fmpz_mat_struct,
519        U: *mut fmpz_mat_struct,
520        A: *const fmpz_mat_struct,
521    );
522    pub fn fmpz_mat_hnf_classical(H: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
523    pub fn fmpz_mat_hnf_xgcd(H: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
524    pub fn fmpz_mat_hnf_minors(H: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
525    pub fn fmpz_mat_hnf_minors_transform(
526        H: *mut fmpz_mat_struct,
527        U: *mut fmpz_mat_struct,
528        A: *const fmpz_mat_struct,
529    );
530    pub fn fmpz_mat_hnf_modular(H: *mut fmpz_mat_struct, A: *const fmpz_mat_struct, D: *const fmpz);
531    pub fn fmpz_mat_hnf_modular_eldiv(A: *mut fmpz_mat_struct, D: *const fmpz);
532    pub fn fmpz_mat_hnf_pernet_stein(
533        H: *mut fmpz_mat_struct,
534        A: *const fmpz_mat_struct,
535        state: *const flint_rand_s,
536    );
537    pub fn fmpz_mat_is_in_hnf(A: *const fmpz_mat_struct) -> c_int;
538    pub fn fmpz_mat_snf(S: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
539    pub fn fmpz_mat_snf_diagonal(S: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
540    pub fn fmpz_mat_snf_kannan_bachem(S: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
541    pub fn fmpz_mat_snf_iliopoulos(
542        S: *mut fmpz_mat_struct,
543        A: *const fmpz_mat_struct,
544        mod_: *const fmpz,
545    );
546    pub fn fmpz_mat_is_in_snf(A: *const fmpz_mat_struct) -> c_int;
547    pub fn fmpz_mat_is_hadamard(A: *const fmpz_mat_struct) -> c_int;
548    pub fn fmpz_mat_hadamard(A: *mut fmpz_mat_struct) -> c_int;
549    pub fn fmpz_mat_gram(B: *mut fmpz_mat_struct, A: *const fmpz_mat_struct);
550    /*
551    pub fn fmpz_mat_get_d_mat(
552        B: *mut d_mat_struct,
553        A: *mut fmpz_mat_struct,
554    ) -> c_int;
555    pub fn fmpz_mat_get_d_mat_transpose(
556        B: *mut d_mat_struct,
557        A: *mut fmpz_mat_struct,
558    ) -> c_int;
559    pub fn fmpz_mat_get_mpf_mat(B: *mut mpf_mat_struct, A: *mut fmpz_mat_struct);
560    pub fn fmpz_mat_chol_d(R: *mut d_mat_struct, A: *mut fmpz_mat_struct);
561    */
562    pub fn fmpz_mat_is_reduced(A: *const fmpz_mat_struct, delta: f64, eta: f64) -> c_int;
563    pub fn fmpz_mat_is_reduced_gram(A: *const fmpz_mat_struct, delta: f64, eta: f64) -> c_int;
564    pub fn fmpz_mat_is_reduced_with_removal(
565        A: *const fmpz_mat_struct,
566        delta: f64,
567        eta: f64,
568        gs_B: *mut fmpz,
569        newd: c_int,
570    ) -> c_int;
571    pub fn fmpz_mat_is_reduced_gram_with_removal(
572        A: *const fmpz_mat_struct,
573        delta: f64,
574        eta: f64,
575        gs_B: *const fmpz,
576        newd: c_int,
577    ) -> c_int;
578    pub fn fmpz_mat_lll_original(A: *mut fmpz_mat_struct, delta: *const fmpq, eta: *const fmpq);
579    pub fn fmpz_mat_lll_storjohann(A: *mut fmpz_mat_struct, delta: *const fmpq, eta: *const fmpq);
580    pub fn fmpz_mat_col_partition(
581        part: *mut mp_limb_signed_t,
582        M: *const fmpz_mat_struct,
583        short_circuit: c_int,
584    ) -> c_int;
585    pub fn fmpz_mat_next_col_van_hoeij(
586        M: *mut fmpz_mat_struct,
587        P: *mut fmpz,
588        col: *mut fmpz_mat_struct,
589        exp: mp_limb_signed_t,
590        U_exp: mp_limb_signed_t,
591    ) -> c_int;
592}