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