flint_sys/
nmod_mat.rs

1#![allow(non_camel_case_types)]
2
3//! *See the [FLINT documentation](http://flintlib.org/doc/nmod_mat.html).
4
5use crate::deps::*;
6use crate::flint::*;
7use crate::fmpz::fmpz;
8use crate::nmod_vec::nmod_t;
9use libc::c_int;
10
11#[repr(C)]
12#[derive(Debug, Copy, Clone)]
13pub struct nmod_mat_struct {
14    pub entries: *mut mp_limb_t,
15    pub r: mp_limb_signed_t,
16    pub c: mp_limb_signed_t,
17    pub rows: *mut *mut mp_limb_t,
18    pub mod_: nmod_t,
19}
20
21pub type nmod_mat_t = [nmod_mat_struct; 1usize];
22
23extern "C" {
24    pub fn nmod_mat_get_entry(
25        mat: *mut nmod_mat_struct,
26        i: mp_limb_signed_t,
27        j: mp_limb_signed_t,
28    ) -> mp_limb_t;
29    pub fn nmod_mat_entry_ptr(
30        mat: *mut nmod_mat_struct,
31        i: mp_limb_signed_t,
32        j: mp_limb_signed_t,
33    ) -> *mut mp_limb_t;
34    pub fn nmod_mat_nrows(mat: *mut nmod_mat_struct) -> mp_limb_signed_t;
35    pub fn nmod_mat_ncols(mat: *mut nmod_mat_struct) -> mp_limb_signed_t;
36    pub fn _nmod_mat_set_mod(mat: *mut nmod_mat_struct, n: mp_limb_t);
37    pub fn nmod_mat_init(
38        mat: *mut nmod_mat_struct,
39        rows: mp_limb_signed_t,
40        cols: mp_limb_signed_t,
41        n: mp_limb_t,
42    );
43    pub fn nmod_mat_init_set(mat: *mut nmod_mat_struct, src: *mut nmod_mat_struct);
44    pub fn nmod_mat_clear(mat: *mut nmod_mat_struct);
45    pub fn nmod_mat_one(mat: *mut nmod_mat_struct);
46    pub fn nmod_mat_swap(mat1: *mut nmod_mat_struct, mat2: *mut nmod_mat_struct);
47    pub fn nmod_mat_window_init(
48        window: *mut nmod_mat_struct,
49        mat: *mut nmod_mat_struct,
50        r1: mp_limb_signed_t,
51        c1: mp_limb_signed_t,
52        r2: mp_limb_signed_t,
53        c2: mp_limb_signed_t,
54    );
55    pub fn nmod_mat_window_clear(window: *mut nmod_mat_struct);
56    pub fn nmod_mat_concat_horizontal(
57        res: *mut nmod_mat_struct,
58        mat1: *mut nmod_mat_struct,
59        mat2: *mut nmod_mat_struct,
60    );
61    pub fn nmod_mat_concat_vertical(
62        res: *mut nmod_mat_struct,
63        mat1: *mut nmod_mat_struct,
64        mat2: *mut nmod_mat_struct,
65    );
66    pub fn nmod_mat_randtest(mat: *mut nmod_mat_struct, state: *mut flint_rand_s);
67    pub fn nmod_mat_randfull(mat: *mut nmod_mat_struct, state: *mut flint_rand_s);
68    pub fn nmod_mat_randpermdiag(
69        mat: *mut nmod_mat_struct,
70        state: *mut flint_rand_s,
71        diag: mp_srcptr,
72        n: mp_limb_signed_t,
73    ) -> c_int;
74    pub fn nmod_mat_randrank(
75        arg1: *mut nmod_mat_struct,
76        state: *mut flint_rand_s,
77        rank: mp_limb_signed_t,
78    );
79    pub fn nmod_mat_randops(
80        mat: *mut nmod_mat_struct,
81        count: mp_limb_signed_t,
82        state: *mut flint_rand_s,
83    );
84    pub fn nmod_mat_randtril(mat: *mut nmod_mat_struct, state: *mut flint_rand_s, unit: c_int);
85    pub fn nmod_mat_randtriu(mat: *mut nmod_mat_struct, state: *mut flint_rand_s, unit: c_int);
86    pub fn nmod_mat_print_pretty(mat: *mut nmod_mat_struct);
87    pub fn nmod_mat_equal(mat1: *mut nmod_mat_struct, mat2: *mut nmod_mat_struct) -> c_int;
88    pub fn nmod_mat_zero(mat: *mut nmod_mat_struct);
89    pub fn nmod_mat_is_zero(mat: *mut nmod_mat_struct) -> c_int;
90    pub fn nmod_mat_is_zero_row(mat: *mut nmod_mat_struct, i: mp_limb_signed_t) -> c_int;
91    pub fn nmod_mat_is_empty(mat: *mut nmod_mat_struct) -> c_int;
92    pub fn nmod_mat_is_square(mat: *mut nmod_mat_struct) -> c_int;
93    pub fn nmod_mat_set(B: *mut nmod_mat_struct, A: *mut nmod_mat_struct);
94    pub fn nmod_mat_transpose(B: *mut nmod_mat_struct, A: *mut nmod_mat_struct);
95    pub fn nmod_mat_add(C: *mut nmod_mat_struct, A: *mut nmod_mat_struct, B: *mut nmod_mat_struct);
96    pub fn nmod_mat_sub(C: *mut nmod_mat_struct, A: *mut nmod_mat_struct, B: *mut nmod_mat_struct);
97    pub fn nmod_mat_neg(B: *mut nmod_mat_struct, A: *mut nmod_mat_struct);
98    pub fn nmod_mat_scalar_mul(B: *mut nmod_mat_struct, A: *mut nmod_mat_struct, c: mp_limb_t);
99    pub fn nmod_mat_scalar_addmul_ui(
100        dest: *mut nmod_mat_struct,
101        X: *mut nmod_mat_struct,
102        Y: *mut nmod_mat_struct,
103        b: mp_limb_t,
104    );
105    pub fn nmod_mat_scalar_mul_add(
106        dest: *mut nmod_mat_struct,
107        X: *mut nmod_mat_struct,
108        b: mp_limb_t,
109        Y: *mut nmod_mat_struct,
110    );
111    pub fn nmod_mat_scalar_mul_fmpz(
112        res: *mut nmod_mat_struct,
113        M: *mut nmod_mat_struct,
114        c: *mut fmpz,
115    );
116    pub fn nmod_mat_mul(C: *mut nmod_mat_struct, A: *mut nmod_mat_struct, B: *mut nmod_mat_struct);
117    pub fn nmod_mat_mul_blas(
118        C: *mut nmod_mat_struct,
119        A: *mut nmod_mat_struct,
120        B: *mut nmod_mat_struct,
121    ) -> c_int;
122    pub fn nmod_mat_mul_classical(
123        C: *mut nmod_mat_struct,
124        A: *mut nmod_mat_struct,
125        B: *mut nmod_mat_struct,
126    );
127    pub fn _nmod_mat_mul_classical_threaded_pool_op(
128        D: *mut nmod_mat_struct,
129        C: *mut nmod_mat_struct,
130        A: *mut nmod_mat_struct,
131        B: *mut nmod_mat_struct,
132        op: c_int,
133        threads: *mut thread_pool_handle,
134        num_threads: mp_limb_signed_t,
135    );
136    pub fn nmod_mat_mul_classical_threaded(
137        C: *mut nmod_mat_struct,
138        A: *mut nmod_mat_struct,
139        B: *mut nmod_mat_struct,
140    );
141    pub fn nmod_mat_mul_strassen(
142        C: *mut nmod_mat_struct,
143        A: *mut nmod_mat_struct,
144        B: *mut nmod_mat_struct,
145    );
146    pub fn _nmod_mat_mul_classical_op(
147        D: *mut nmod_mat_struct,
148        C: *mut nmod_mat_struct,
149        A: *mut nmod_mat_struct,
150        B: *mut nmod_mat_struct,
151        op: c_int,
152    );
153    pub fn nmod_mat_addmul(
154        D: *mut nmod_mat_struct,
155        C: *mut nmod_mat_struct,
156        A: *mut nmod_mat_struct,
157        B: *mut nmod_mat_struct,
158    );
159    pub fn nmod_mat_submul(
160        D: *mut nmod_mat_struct,
161        C: *mut nmod_mat_struct,
162        A: *mut nmod_mat_struct,
163        B: *mut nmod_mat_struct,
164    );
165    pub fn _nmod_mat_pow(dest: *mut nmod_mat_struct, mat: *mut nmod_mat_struct, pow: mp_limb_t);
166    pub fn nmod_mat_pow(dest: *mut nmod_mat_struct, mat: *mut nmod_mat_struct, pow: mp_limb_t);
167    pub fn nmod_mat_trace(mat: *mut nmod_mat_struct) -> mp_limb_t;
168    pub fn _nmod_mat_det(A: *mut nmod_mat_struct) -> mp_limb_t;
169    pub fn nmod_mat_det(A: *mut nmod_mat_struct) -> mp_limb_t;
170    pub fn nmod_mat_rank(A: *mut nmod_mat_struct) -> mp_limb_signed_t;
171    pub fn nmod_mat_inv(B: *mut nmod_mat_struct, A: *mut nmod_mat_struct) -> c_int;
172    pub fn nmod_mat_swap_rows(
173        mat: *mut nmod_mat_struct,
174        perm: *mut mp_limb_signed_t,
175        r: mp_limb_signed_t,
176        s: mp_limb_signed_t,
177    );
178    pub fn nmod_mat_invert_rows(mat: *mut nmod_mat_struct, perm: *mut mp_limb_signed_t);
179    pub fn nmod_mat_swap_cols(
180        mat: *mut nmod_mat_struct,
181        perm: *mut mp_limb_signed_t,
182        r: mp_limb_signed_t,
183        s: mp_limb_signed_t,
184    );
185    pub fn nmod_mat_invert_cols(mat: *mut nmod_mat_struct, perm: *mut mp_limb_signed_t);
186    pub fn nmod_mat_apply_permutation(
187        A: *mut nmod_mat_struct,
188        P: *mut mp_limb_signed_t,
189        n: mp_limb_signed_t,
190    );
191    pub fn nmod_mat_solve_tril(
192        X: *mut nmod_mat_struct,
193        L: *mut nmod_mat_struct,
194        B: *mut nmod_mat_struct,
195        unit: c_int,
196    );
197    pub fn nmod_mat_solve_tril_recursive(
198        X: *mut nmod_mat_struct,
199        L: *mut nmod_mat_struct,
200        B: *mut nmod_mat_struct,
201        unit: c_int,
202    );
203    pub fn nmod_mat_solve_tril_classical(
204        X: *mut nmod_mat_struct,
205        L: *mut nmod_mat_struct,
206        B: *mut nmod_mat_struct,
207        unit: c_int,
208    );
209    pub fn nmod_mat_solve_triu(
210        X: *mut nmod_mat_struct,
211        U: *mut nmod_mat_struct,
212        B: *mut nmod_mat_struct,
213        unit: c_int,
214    );
215    pub fn nmod_mat_solve_triu_recursive(
216        X: *mut nmod_mat_struct,
217        U: *mut nmod_mat_struct,
218        B: *mut nmod_mat_struct,
219        unit: c_int,
220    );
221    pub fn nmod_mat_solve_triu_classical(
222        X: *mut nmod_mat_struct,
223        U: *mut nmod_mat_struct,
224        B: *mut nmod_mat_struct,
225        unit: c_int,
226    );
227    pub fn nmod_mat_lu(
228        P: *mut mp_limb_signed_t,
229        A: *mut nmod_mat_struct,
230        rank_check: c_int,
231    ) -> mp_limb_signed_t;
232    pub fn nmod_mat_lu_classical(
233        P: *mut mp_limb_signed_t,
234        A: *mut nmod_mat_struct,
235        rank_check: c_int,
236    ) -> mp_limb_signed_t;
237    pub fn nmod_mat_lu_recursive(
238        P: *mut mp_limb_signed_t,
239        A: *mut nmod_mat_struct,
240        rank_check: c_int,
241    ) -> mp_limb_signed_t;
242    pub fn nmod_mat_solve(
243        X: *mut nmod_mat_struct,
244        A: *mut nmod_mat_struct,
245        B: *mut nmod_mat_struct,
246    ) -> c_int;
247    pub fn nmod_mat_solve_vec(x: mp_ptr, A: *mut nmod_mat_struct, b: mp_srcptr) -> c_int;
248    pub fn nmod_mat_can_solve_inner(
249        rank: *mut mp_limb_signed_t,
250        prm: *mut mp_limb_signed_t,
251        piv: *mut mp_limb_signed_t,
252        X: *mut nmod_mat_struct,
253        A: *mut nmod_mat_struct,
254        B: *mut nmod_mat_struct,
255    ) -> c_int;
256    pub fn nmod_mat_can_solve(
257        X: *mut nmod_mat_struct,
258        A: *mut nmod_mat_struct,
259        B: *mut nmod_mat_struct,
260    ) -> c_int;
261    pub fn nmod_mat_rref(A: *mut nmod_mat_struct) -> mp_limb_signed_t;
262    pub fn _nmod_mat_rref(
263        A: *mut nmod_mat_struct,
264        pivots_nonpivots: *mut mp_limb_signed_t,
265        P: *mut mp_limb_signed_t,
266    ) -> mp_limb_signed_t;
267    pub fn nmod_mat_rref_classical(A: *mut nmod_mat_struct) -> mp_limb_signed_t;
268    pub fn _nmod_mat_rref_classical(
269        A: *mut nmod_mat_struct,
270        pivots_nonpivots: *mut mp_limb_signed_t,
271    ) -> mp_limb_signed_t;
272    pub fn nmod_mat_rref_storjohann(A: *mut nmod_mat_struct) -> mp_limb_signed_t;
273    pub fn _nmod_mat_rref_storjohann(
274        A: *mut nmod_mat_struct,
275        pivots_nonpivots: *mut mp_limb_signed_t,
276    ) -> mp_limb_signed_t;
277    pub fn nmod_mat_reduce_row(
278        M: *mut nmod_mat_struct,
279        P: *mut mp_limb_signed_t,
280        L: *mut mp_limb_signed_t,
281        m: mp_limb_signed_t,
282    ) -> mp_limb_signed_t;
283    pub fn nmod_mat_nullspace(X: *mut nmod_mat_struct, A: *mut nmod_mat_struct)
284        -> mp_limb_signed_t;
285    pub fn nmod_mat_strong_echelon_form(A: *mut nmod_mat_struct);
286    pub fn nmod_mat_howell_form(A: *mut nmod_mat_struct) -> mp_limb_signed_t;
287    pub fn nmod_mat_similarity(M: *mut nmod_mat_struct, r: mp_limb_signed_t, d: mp_limb_t);
288    pub fn nmod_mat_set_entry(
289        mat: *mut nmod_mat_struct,
290        i: mp_limb_signed_t,
291        j: mp_limb_signed_t,
292        x: mp_limb_t,
293    );
294}