1#![allow(non_camel_case_types)]
2
3use crate::deps::*;
6use crate::flint::*;
7use crate::fmpz_poly::fmpz_poly_struct;
8use crate::fq::{fq_ctx_struct, fq_struct};
9use crate::fq_nmod::fq_nmod_ctx_struct;
10use crate::nmod_mat::nmod_mat_struct;
11use crate::nmod_poly::nmod_poly_struct;
12use libc::{c_int, FILE};
13
14#[repr(C)]
15#[derive(Debug, Copy, Clone, Hash)]
16pub struct fq_mat_struct {
17 pub entries: *mut fq_struct,
18 pub r: mp_limb_signed_t,
19 pub c: mp_limb_signed_t,
20 pub rows: *mut *mut fq_struct,
21}
22
23pub type fq_mat_t = [fq_mat_struct; 1usize];
24
25extern "C" {
26 pub fn FQ_MAT_MUL_KS_CUTOFF(
27 r: mp_limb_signed_t,
28 c: mp_limb_signed_t,
29 ctx: *mut fq_ctx_struct,
30 ) -> c_int;
31 pub fn fq_mat_init(
32 mat: *mut fq_mat_struct,
33 rows: mp_limb_signed_t,
34 cols: mp_limb_signed_t,
35 ctx: *mut fq_ctx_struct,
36 );
37 pub fn fq_mat_init_set(
38 mat: *mut fq_mat_struct,
39 src: *mut fq_mat_struct,
40 ctx: *mut fq_ctx_struct,
41 );
42 pub fn fq_mat_swap(mat1: *mut fq_mat_struct, mat2: *mut fq_mat_struct, ctx: *mut fq_ctx_struct);
43 pub fn fq_mat_set(mat1: *mut fq_mat_struct, mat2: *mut fq_mat_struct, ctx: *mut fq_ctx_struct);
44 pub fn fq_mat_clear(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct);
45 pub fn fq_mat_equal(
46 mat1: *mut fq_mat_struct,
47 mat2: *mut fq_mat_struct,
48 ctx: *mut fq_ctx_struct,
49 ) -> c_int;
50 pub fn fq_mat_is_zero(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> c_int;
51 pub fn fq_mat_is_empty(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> c_int;
52 pub fn fq_mat_is_square(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> c_int;
53 pub fn fq_mat_entry(
54 mat: *mut fq_mat_struct,
55 i: mp_limb_signed_t,
56 j: mp_limb_signed_t,
57 ) -> *mut fq_struct;
58 pub fn fq_mat_entry_set(
59 mat: *mut fq_mat_struct,
60 i: mp_limb_signed_t,
61 j: mp_limb_signed_t,
62 x: *mut fmpz_poly_struct,
63 ctx: *mut fq_ctx_struct,
64 );
65 pub fn fq_mat_nrows(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> mp_limb_signed_t;
66 pub fn fq_mat_ncols(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> mp_limb_signed_t;
67 pub fn fq_mat_swap_rows(
68 mat: *mut fq_mat_struct,
69 perm: *mut mp_limb_signed_t,
70 r: mp_limb_signed_t,
71 s: mp_limb_signed_t,
72 ctx: *mut fq_ctx_struct,
73 );
74 pub fn fq_mat_invert_rows(
75 mat: *mut fq_mat_struct,
76 perm: *mut mp_limb_signed_t,
77 ctx: *mut fq_ctx_struct,
78 );
79 pub fn fq_mat_swap_cols(
80 mat: *mut fq_mat_struct,
81 perm: *mut mp_limb_signed_t,
82 r: mp_limb_signed_t,
83 s: mp_limb_signed_t,
84 ctx: *mut fq_ctx_struct,
85 );
86 pub fn fq_mat_invert_cols(
87 mat: *mut fq_mat_struct,
88 perm: *mut mp_limb_signed_t,
89 ctx: *mut fq_ctx_struct,
90 );
91 pub fn fq_mat_zero(A: *mut fq_mat_struct, ctx: *mut fq_ctx_struct);
92 pub fn fq_mat_window_init(
93 window: *mut fq_mat_struct,
94 mat: *mut fq_mat_struct,
95 r1: mp_limb_signed_t,
96 c1: mp_limb_signed_t,
97 r2: mp_limb_signed_t,
98 c2: mp_limb_signed_t,
99 ctx: *mut fq_ctx_struct,
100 );
101 pub fn fq_mat_window_clear(window: *mut fq_mat_struct, ctx: *mut fq_ctx_struct);
102 pub fn fq_mat_concat_horizontal(
103 res: *mut fq_mat_struct,
104 mat1: *mut fq_mat_struct,
105 mat2: *mut fq_mat_struct,
106 ctx: *mut fq_ctx_struct,
107 );
108 pub fn fq_mat_concat_vertical(
109 res: *mut fq_mat_struct,
110 mat1: *mut fq_mat_struct,
111 mat2: *mut fq_mat_struct,
112 ctx: *mut fq_ctx_struct,
113 );
114 pub fn fq_mat_fprint(
115 file: *mut FILE,
116 mat: *mut fq_mat_struct,
117 ctx: *mut fq_ctx_struct,
118 ) -> c_int;
119 pub fn fq_mat_fprint_pretty(
120 file: *mut FILE,
121 mat: *mut fq_mat_struct,
122 ctx: *mut fq_ctx_struct,
123 ) -> c_int;
124 pub fn fq_mat_print(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> c_int;
125 pub fn fq_mat_print_pretty(mat: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> c_int;
126 pub fn fq_mat_randtest(
127 mat: *mut fq_mat_struct,
128 state: *mut flint_rand_s,
129 ctx: *mut fq_ctx_struct,
130 );
131 pub fn fq_mat_randrank(
132 mat: *mut fq_mat_struct,
133 state: *mut flint_rand_s,
134 rank: mp_limb_signed_t,
135 ctx: *mut fq_ctx_struct,
136 );
137 pub fn fq_mat_randpermdiag(
138 mat: *mut fq_mat_struct,
139 state: *mut flint_rand_s,
140 diag: *mut fq_struct,
141 n: mp_limb_signed_t,
142 ctx: *mut fq_ctx_struct,
143 ) -> c_int;
144 pub fn fq_mat_randops(
145 mat: *mut fq_mat_struct,
146 count: mp_limb_signed_t,
147 state: *mut flint_rand_s,
148 ctx: *mut fq_ctx_struct,
149 );
150 pub fn fq_mat_randtril(
151 mat: *mut fq_mat_struct,
152 state: *mut flint_rand_s,
153 unit: c_int,
154 ctx: *mut fq_ctx_struct,
155 );
156 pub fn fq_mat_randtriu(
157 mat: *mut fq_mat_struct,
158 state: *mut flint_rand_s,
159 unit: c_int,
160 ctx: *mut fq_ctx_struct,
161 );
162 pub fn fq_mat_add(
163 C: *mut fq_mat_struct,
164 A: *mut fq_mat_struct,
165 B: *mut fq_mat_struct,
166 ctx: *mut fq_ctx_struct,
167 );
168 pub fn fq_mat_sub(
169 C: *mut fq_mat_struct,
170 A: *mut fq_mat_struct,
171 B: *mut fq_mat_struct,
172 ctx: *mut fq_ctx_struct,
173 );
174 pub fn fq_mat_neg(B: *mut fq_mat_struct, A: *mut fq_mat_struct, ctx: *mut fq_ctx_struct);
175 pub fn fq_mat_submul(
176 D: *mut fq_mat_struct,
177 C: *mut fq_mat_struct,
178 A: *mut fq_mat_struct,
179 B: *mut fq_mat_struct,
180 ctx: *mut fq_ctx_struct,
181 );
182 pub fn fq_mat_mul(
183 C: *mut fq_mat_struct,
184 A: *mut fq_mat_struct,
185 B: *mut fq_mat_struct,
186 ctx: *mut fq_ctx_struct,
187 );
188 pub fn fq_mat_mul_classical(
189 C: *mut fq_mat_struct,
190 A: *mut fq_mat_struct,
191 B: *mut fq_mat_struct,
192 ctx: *mut fq_ctx_struct,
193 );
194 pub fn fq_mat_mul_KS(
195 C: *mut fq_mat_struct,
196 A: *mut fq_mat_struct,
197 B: *mut fq_mat_struct,
198 ctx: *mut fq_ctx_struct,
199 );
200 pub fn fq_mat_lu(
201 P: *mut mp_limb_signed_t,
202 A: *mut fq_mat_struct,
203 rank_check: c_int,
204 ctx: *mut fq_ctx_struct,
205 ) -> mp_limb_signed_t;
206 pub fn fq_mat_lu_recursive(
207 P: *mut mp_limb_signed_t,
208 A: *mut fq_mat_struct,
209 rank_check: c_int,
210 ctx: *mut fq_ctx_struct,
211 ) -> mp_limb_signed_t;
212 pub fn fq_mat_lu_classical(
213 P: *mut mp_limb_signed_t,
214 A: *mut fq_mat_struct,
215 rank_check: c_int,
216 ctx: *mut fq_ctx_struct,
217 ) -> mp_limb_signed_t;
218 pub fn fq_mat_inv(
219 B: *mut fq_mat_struct,
220 A: *mut fq_mat_struct,
221 ctx: *mut fq_ctx_struct,
222 ) -> c_int;
223 pub fn fq_mat_rref(A: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> mp_limb_signed_t;
224 pub fn fq_mat_reduce_row(
225 A: *mut fq_mat_struct,
226 P: *mut mp_limb_signed_t,
227 L: *mut mp_limb_signed_t,
228 m: mp_limb_signed_t,
229 ctx: *mut fq_ctx_struct,
230 ) -> mp_limb_signed_t;
231 pub fn fq_mat_nullspace(
232 X: *mut fq_mat_struct,
233 A: *mut fq_mat_struct,
234 ctx: *mut fq_ctx_struct,
235 ) -> mp_limb_signed_t;
236 pub fn fq_mat_rank(A: *mut fq_mat_struct, ctx: *mut fq_ctx_struct) -> mp_limb_signed_t;
237 pub fn fq_mat_solve_tril(
238 X: *mut fq_mat_struct,
239 L: *mut fq_mat_struct,
240 B: *mut fq_mat_struct,
241 unit: c_int,
242 ctx: *mut fq_ctx_struct,
243 );
244 pub fn fq_mat_solve_tril_classical(
245 X: *mut fq_mat_struct,
246 L: *mut fq_mat_struct,
247 B: *mut fq_mat_struct,
248 unit: c_int,
249 ctx: *mut fq_ctx_struct,
250 );
251 pub fn fq_mat_solve_tril_recursive(
252 X: *mut fq_mat_struct,
253 L: *mut fq_mat_struct,
254 B: *mut fq_mat_struct,
255 unit: c_int,
256 ctx: *mut fq_ctx_struct,
257 );
258 pub fn fq_mat_solve_triu(
259 X: *mut fq_mat_struct,
260 U: *mut fq_mat_struct,
261 B: *mut fq_mat_struct,
262 unit: c_int,
263 ctx: *mut fq_ctx_struct,
264 );
265 pub fn fq_mat_solve_triu_classical(
266 X: *mut fq_mat_struct,
267 U: *mut fq_mat_struct,
268 B: *mut fq_mat_struct,
269 unit: c_int,
270 ctx: *mut fq_ctx_struct,
271 );
272 pub fn fq_mat_solve_triu_recursive(
273 X: *mut fq_mat_struct,
274 U: *mut fq_mat_struct,
275 B: *mut fq_mat_struct,
276 unit: c_int,
277 ctx: *mut fq_ctx_struct,
278 );
279 pub fn fq_mat_solve(
280 X: *mut fq_mat_struct,
281 A: *mut fq_mat_struct,
282 C: *mut fq_mat_struct,
283 ctx: *mut fq_ctx_struct,
284 ) -> c_int;
285 pub fn fq_mat_can_solve(
286 X: *mut fq_mat_struct,
287 A: *mut fq_mat_struct,
288 B: *mut fq_mat_struct,
289 ctx: *mut fq_ctx_struct,
290 ) -> c_int;
291 pub fn fq_mat_similarity(
292 A: *mut fq_mat_struct,
293 r: mp_limb_signed_t,
294 d: *mut fmpz_poly_struct,
295 ctx: *mut fq_ctx_struct,
296 );
297 pub fn fq_nmod_embed_gens(
298 gen_sub: *mut nmod_poly_struct,
299 gen_sup: *mut nmod_poly_struct,
300 minpoly: *mut nmod_poly_struct,
301 sub_ctx: *mut fq_nmod_ctx_struct,
302 sup_ctx: *mut fq_nmod_ctx_struct,
303 );
304 pub fn _fq_nmod_embed_gens_naive(
305 gen_sub: *mut nmod_poly_struct,
306 gen_sup: *mut nmod_poly_struct,
307 minpoly: *mut nmod_poly_struct,
308 sub_ctx: *mut fq_nmod_ctx_struct,
309 sup_ctx: *mut fq_nmod_ctx_struct,
310 );
311 pub fn _fq_nmod_embed_gens_allombert(
312 gen_sub: *mut nmod_poly_struct,
313 gen_sup: *mut nmod_poly_struct,
314 minpoly: *mut nmod_poly_struct,
315 sub_ctx: *mut fq_nmod_ctx_struct,
316 sup_ctx: *mut fq_nmod_ctx_struct,
317 );
318 pub fn fq_nmod_embed_matrices(
319 embed: *mut nmod_mat_struct,
320 project: *mut nmod_mat_struct,
321 gen_sub: *mut nmod_poly_struct,
322 sub_ctx: *mut fq_nmod_ctx_struct,
323 gen_sup: *mut nmod_poly_struct,
324 sup_ctx: *mut fq_nmod_ctx_struct,
325 gen_minpoly: *mut nmod_poly_struct,
326 );
327 pub fn fq_nmod_embed_trace_matrix(
328 res: *mut nmod_mat_struct,
329 basis: *mut nmod_mat_struct,
330 sub_ctx: *mut fq_nmod_ctx_struct,
331 sup_ctx: *mut fq_nmod_ctx_struct,
332 );
333 pub fn fq_nmod_embed_composition_matrix_sub(
334 matrix: *mut nmod_mat_struct,
335 gen: *mut nmod_poly_struct,
336 ctx: *mut fq_nmod_ctx_struct,
337 trunc: mp_limb_signed_t,
338 );
339 pub fn fq_nmod_embed_mul_matrix(
340 matrix: *mut nmod_mat_struct,
341 gen: *mut nmod_poly_struct,
342 ctx: *mut fq_nmod_ctx_struct,
343 );
344 pub fn fq_nmod_embed_mono_to_dual_matrix(
345 res: *mut nmod_mat_struct,
346 ctx: *mut fq_nmod_ctx_struct,
347 );
348 pub fn fq_nmod_embed_dual_to_mono_matrix(
349 res: *mut nmod_mat_struct,
350 ctx: *mut fq_nmod_ctx_struct,
351 );
352}