flint_sys/
nmod_poly.rs

1#![allow(non_snake_case)]
2#![allow(non_camel_case_types)]
3
4//! *See the [FLINT documentation](http://flintlib.org/doc/nmod_poly.html).
5
6use crate::deps::*;
7use crate::flint::*;
8use crate::fmpz::fmpz;
9use crate::nmod_mat::nmod_mat_struct;
10use crate::nmod_vec::nmod_t;
11use libc::{c_char, c_int, c_void, FILE};
12
13#[repr(C)]
14#[derive(Debug, Copy, Clone, Hash)]
15pub struct nmod_poly_struct {
16    pub coeffs: mp_ptr,
17    pub alloc: mp_limb_signed_t,
18    pub length: mp_limb_signed_t,
19    pub mod_: nmod_t,
20}
21
22pub type nmod_poly_t = [nmod_poly_struct; 1usize];
23
24#[repr(C)]
25#[derive(Debug, Copy, Clone, Hash)]
26pub struct nmod_poly_res_struct {
27    pub res: mp_limb_t,
28    pub lc: mp_limb_t,
29    pub len0: mp_limb_signed_t,
30    pub len1: mp_limb_signed_t,
31    pub off: mp_limb_signed_t,
32}
33
34pub type nmod_poly_res_t = [nmod_poly_res_struct; 1usize];
35
36#[repr(C)]
37#[derive(Debug, Copy, Clone)]
38pub struct nmod_poly_matrix_precompute_arg_t {
39    pub A: *mut nmod_mat_struct,
40    pub poly1: *mut nmod_poly_struct,
41    pub poly2: *mut nmod_poly_struct,
42    pub poly2inv: *mut nmod_poly_struct,
43}
44
45#[repr(C)]
46#[derive(Debug, Copy, Clone)]
47pub struct nmod_poly_compose_mod_precomp_preinv_arg_t {
48    pub A: *mut nmod_mat_struct,
49    pub res: *mut nmod_poly_struct,
50    pub poly1: *mut nmod_poly_struct,
51    pub poly3: *mut nmod_poly_struct,
52    pub poly3inv: *mut nmod_poly_struct,
53}
54
55#[repr(C)]
56#[derive(Debug, Copy, Clone)]
57pub struct _nmod_poly_multi_crt_prog_instr {
58    pub a_idx: mp_limb_signed_t,
59    pub b_idx: mp_limb_signed_t,
60    pub c_idx: mp_limb_signed_t,
61    pub idem: nmod_poly_t,
62    pub modulus: nmod_poly_t,
63}
64
65#[repr(C)]
66#[derive(Debug, Copy, Clone)]
67pub struct nmod_poly_multi_crt_struct {
68    pub prog: *mut _nmod_poly_multi_crt_prog_instr,
69    pub length: mp_limb_signed_t,
70    pub alloc: mp_limb_signed_t,
71    pub localsize: mp_limb_signed_t,
72    pub temp1loc: mp_limb_signed_t,
73    pub temp2loc: mp_limb_signed_t,
74    pub good: c_int,
75}
76
77pub type nmod_poly_multi_crt_t = [nmod_poly_multi_crt_struct; 1usize];
78
79#[repr(C)]
80#[derive(Debug, Copy, Clone)]
81pub struct nmod_berlekamp_massey_struct {
82    pub npoints: mp_limb_signed_t,
83    pub R0: nmod_poly_t,
84    pub R1: nmod_poly_t,
85    pub V0: nmod_poly_t,
86    pub V1: nmod_poly_t,
87    pub qt: nmod_poly_t,
88    pub rt: nmod_poly_t,
89    pub points: nmod_poly_t,
90}
91
92pub type nmod_berlekamp_massey_t = [nmod_berlekamp_massey_struct; 1usize];
93
94extern "C" {
95    pub fn signed_mpn_sub_n(
96        res: mp_ptr,
97        op1: mp_srcptr,
98        op2: mp_srcptr,
99        n: mp_limb_signed_t,
100    ) -> c_int;
101    pub fn nmod_poly_init(poly: *mut nmod_poly_struct, n: mp_limb_t);
102    pub fn nmod_poly_init_preinv(poly: *mut nmod_poly_struct, n: mp_limb_t, ninv: mp_limb_t);
103    pub fn nmod_poly_init2(poly: *mut nmod_poly_struct, n: mp_limb_t, alloc: mp_limb_signed_t);
104    pub fn nmod_poly_init2_preinv(
105        poly: *mut nmod_poly_struct,
106        n: mp_limb_t,
107        ninv: mp_limb_t,
108        alloc: mp_limb_signed_t,
109    );
110    pub fn nmod_poly_realloc(poly: *mut nmod_poly_struct, alloc: mp_limb_signed_t);
111    pub fn nmod_poly_clear(poly: *mut nmod_poly_struct);
112    pub fn nmod_poly_fit_length(poly: *mut nmod_poly_struct, alloc: mp_limb_signed_t);
113    pub fn nmod_poly_init_mod(poly: *mut nmod_poly_struct, mod_: nmod_t);
114    pub fn nmod_poly_set_mod(poly: *mut nmod_poly_struct, mod_: nmod_t);
115    pub fn _nmod_poly_set_length(poly: *mut nmod_poly_struct, len: mp_limb_signed_t);
116    pub fn _nmod_poly_normalise(poly: *mut nmod_poly_struct);
117    pub fn nmod_poly_length(poly: *mut nmod_poly_struct) -> mp_limb_signed_t;
118    pub fn nmod_poly_degree(poly: *mut nmod_poly_struct) -> mp_limb_signed_t;
119    pub fn nmod_poly_modulus(poly: *mut nmod_poly_struct) -> mp_limb_t;
120    pub fn nmod_poly_max_bits(poly: *mut nmod_poly_struct) -> mp_limb_t;
121    pub fn nmod_poly_lead(poly: *mut nmod_poly_struct) -> mp_ptr;
122    pub fn nmod_poly_set(a: *mut nmod_poly_struct, b: *mut nmod_poly_struct);
123    pub fn nmod_poly_swap(poly1: *mut nmod_poly_struct, poly2: *mut nmod_poly_struct);
124    pub fn nmod_poly_zero(res: *mut nmod_poly_struct);
125    pub fn nmod_poly_one(res: *mut nmod_poly_struct);
126    pub fn nmod_poly_truncate(poly: *mut nmod_poly_struct, len: mp_limb_signed_t);
127    pub fn nmod_poly_set_trunc(
128        res: *mut nmod_poly_struct,
129        poly: *mut nmod_poly_struct,
130        n: mp_limb_signed_t,
131    );
132    pub fn _nmod_poly_reverse(
133        output: mp_ptr,
134        input: mp_srcptr,
135        len: mp_limb_signed_t,
136        m: mp_limb_signed_t,
137    );
138    pub fn nmod_poly_reverse(
139        output: *mut nmod_poly_struct,
140        input: *mut nmod_poly_struct,
141        m: mp_limb_signed_t,
142    );
143    pub fn nmod_poly_equal(a: *mut nmod_poly_struct, b: *mut nmod_poly_struct) -> c_int;
144    pub fn nmod_poly_equal_trunc(
145        poly1: *mut nmod_poly_struct,
146        poly2: *mut nmod_poly_struct,
147        n: mp_limb_signed_t,
148    ) -> c_int;
149    pub fn nmod_poly_is_zero(poly: *mut nmod_poly_struct) -> c_int;
150    pub fn nmod_poly_is_one(poly: *mut nmod_poly_struct) -> c_int;
151    pub fn nmod_poly_randtest(
152        poly: *mut nmod_poly_struct,
153        state: *mut flint_rand_s,
154        len: mp_limb_signed_t,
155    );
156    pub fn nmod_poly_randtest_not_zero(
157        poly: *mut nmod_poly_struct,
158        state: *mut flint_rand_s,
159        len: mp_limb_signed_t,
160    );
161    pub fn nmod_poly_randtest_irreducible(
162        poly: *mut nmod_poly_struct,
163        state: *mut flint_rand_s,
164        len: mp_limb_signed_t,
165    );
166    pub fn nmod_poly_randtest_monic(
167        poly: *mut nmod_poly_struct,
168        state: *mut flint_rand_s,
169        len: mp_limb_signed_t,
170    );
171    pub fn nmod_poly_randtest_monic_irreducible(
172        poly: *mut nmod_poly_struct,
173        state: *mut flint_rand_s,
174        len: mp_limb_signed_t,
175    );
176    pub fn nmod_poly_randtest_monic_primitive(
177        poly: *mut nmod_poly_struct,
178        state: *mut flint_rand_s,
179        len: mp_limb_signed_t,
180    );
181    pub fn nmod_poly_randtest_trinomial(
182        poly: *mut nmod_poly_struct,
183        state: *mut flint_rand_s,
184        len: mp_limb_signed_t,
185    );
186    pub fn nmod_poly_randtest_trinomial_irreducible(
187        poly: *mut nmod_poly_struct,
188        state: *mut flint_rand_s,
189        len: mp_limb_signed_t,
190        max_attempts: mp_limb_signed_t,
191    ) -> c_int;
192    pub fn nmod_poly_randtest_pentomial(
193        poly: *mut nmod_poly_struct,
194        state: *mut flint_rand_s,
195        len: mp_limb_signed_t,
196    );
197    pub fn nmod_poly_randtest_pentomial_irreducible(
198        poly: *mut nmod_poly_struct,
199        state: *mut flint_rand_s,
200        len: mp_limb_signed_t,
201        max_attempts: mp_limb_signed_t,
202    ) -> c_int;
203    pub fn nmod_poly_randtest_sparse_irreducible(
204        poly: *mut nmod_poly_struct,
205        state: *mut flint_rand_s,
206        len: mp_limb_signed_t,
207    );
208    pub fn nmod_poly_get_coeff_ui(poly: *mut nmod_poly_struct, j: mp_limb_signed_t) -> mp_limb_t;
209    pub fn nmod_poly_set_coeff_ui(poly: *mut nmod_poly_struct, j: mp_limb_signed_t, c: mp_limb_t);
210    pub fn nmod_poly_get_str(poly: *mut nmod_poly_struct) -> *mut c_char;
211    pub fn nmod_poly_get_str_pretty(poly: *mut nmod_poly_struct, x: *const c_char) -> *mut c_char;
212    pub fn nmod_poly_set_str(poly: *mut nmod_poly_struct, s: *const c_char) -> c_int;
213    pub fn nmod_poly_fread(f: *mut FILE, poly: *mut nmod_poly_struct) -> c_int;
214    pub fn nmod_poly_fprint(f: *mut FILE, poly: *mut nmod_poly_struct) -> c_int;
215    pub fn nmod_poly_fprint_pretty(
216        f: *mut FILE,
217        a: *mut nmod_poly_struct,
218        x: *const c_char,
219    ) -> c_int;
220    pub fn nmod_poly_print(a: *mut nmod_poly_struct) -> c_int;
221    pub fn nmod_poly_print_pretty(a: *mut nmod_poly_struct, x: *const c_char) -> c_int;
222    pub fn nmod_poly_read(poly: *mut nmod_poly_struct) -> c_int;
223    pub fn _nmod_poly_shift_left(
224        res: mp_ptr,
225        poly: mp_srcptr,
226        len: mp_limb_signed_t,
227        k: mp_limb_signed_t,
228    );
229    pub fn nmod_poly_shift_left(
230        res: *mut nmod_poly_struct,
231        poly: *mut nmod_poly_struct,
232        k: mp_limb_signed_t,
233    );
234    pub fn _nmod_poly_shift_right(
235        res: mp_ptr,
236        poly: mp_srcptr,
237        len: mp_limb_signed_t,
238        k: mp_limb_signed_t,
239    );
240    pub fn nmod_poly_shift_right(
241        res: *mut nmod_poly_struct,
242        poly: *mut nmod_poly_struct,
243        k: mp_limb_signed_t,
244    );
245    pub fn _nmod_poly_add(
246        res: mp_ptr,
247        poly1: mp_srcptr,
248        len1: mp_limb_signed_t,
249        poly2: mp_srcptr,
250        len2: mp_limb_signed_t,
251        mod_: nmod_t,
252    );
253    pub fn nmod_poly_add(
254        res: *mut nmod_poly_struct,
255        poly1: *mut nmod_poly_struct,
256        poly2: *mut nmod_poly_struct,
257    );
258    pub fn nmod_poly_add_ui(res: *mut nmod_poly_struct, poly: *mut nmod_poly_struct, c: mp_limb_t);
259    pub fn nmod_poly_add_series(
260        res: *mut nmod_poly_struct,
261        poly1: *mut nmod_poly_struct,
262        poly2: *mut nmod_poly_struct,
263        n: mp_limb_signed_t,
264    );
265    pub fn _nmod_poly_sub(
266        res: mp_ptr,
267        poly1: mp_srcptr,
268        len1: mp_limb_signed_t,
269        poly2: mp_srcptr,
270        len2: mp_limb_signed_t,
271        mod_: nmod_t,
272    );
273    pub fn nmod_poly_sub(
274        res: *mut nmod_poly_struct,
275        poly1: *mut nmod_poly_struct,
276        poly2: *mut nmod_poly_struct,
277    );
278    pub fn nmod_poly_sub_series(
279        res: *mut nmod_poly_struct,
280        poly1: *mut nmod_poly_struct,
281        poly2: *mut nmod_poly_struct,
282        n: mp_limb_signed_t,
283    );
284    pub fn nmod_poly_sub_ui(res: *mut nmod_poly_struct, poly: *mut nmod_poly_struct, c: mp_limb_t);
285    pub fn nmod_poly_neg(res: *mut nmod_poly_struct, poly1: *mut nmod_poly_struct);
286    pub fn nmod_poly_scalar_mul_nmod(
287        res: *mut nmod_poly_struct,
288        poly1: *mut nmod_poly_struct,
289        c: mp_limb_t,
290    );
291    pub fn _nmod_poly_make_monic(
292        output: mp_ptr,
293        input: mp_srcptr,
294        len: mp_limb_signed_t,
295        mod_: nmod_t,
296    );
297    pub fn nmod_poly_make_monic(output: *mut nmod_poly_struct, input: *mut nmod_poly_struct);
298    pub fn _nmod_poly_KS2_pack1(
299        res: mp_ptr,
300        op: mp_srcptr,
301        n: mp_limb_signed_t,
302        s: mp_limb_signed_t,
303        b: mp_limb_t,
304        k: mp_limb_t,
305        r: mp_limb_signed_t,
306    );
307    pub fn _nmod_poly_KS2_pack(
308        res: mp_ptr,
309        op: mp_srcptr,
310        n: mp_limb_signed_t,
311        s: mp_limb_signed_t,
312        b: mp_limb_t,
313        k: mp_limb_t,
314        r: mp_limb_signed_t,
315    );
316    pub fn _nmod_poly_KS2_unpack1(
317        res: mp_ptr,
318        op: mp_srcptr,
319        n: mp_limb_signed_t,
320        b: mp_limb_t,
321        k: mp_limb_t,
322    );
323    pub fn _nmod_poly_KS2_unpack2(
324        res: mp_ptr,
325        op: mp_srcptr,
326        n: mp_limb_signed_t,
327        b: mp_limb_t,
328        k: mp_limb_t,
329    );
330    pub fn _nmod_poly_KS2_unpack3(
331        res: mp_ptr,
332        op: mp_srcptr,
333        n: mp_limb_signed_t,
334        b: mp_limb_t,
335        k: mp_limb_t,
336    );
337    pub fn _nmod_poly_KS2_unpack(
338        res: mp_ptr,
339        op: mp_srcptr,
340        n: mp_limb_signed_t,
341        b: mp_limb_t,
342        k: mp_limb_t,
343    );
344    pub fn _nmod_poly_KS2_reduce(
345        res: mp_ptr,
346        s: mp_limb_signed_t,
347        op: mp_srcptr,
348        n: mp_limb_signed_t,
349        w: mp_limb_t,
350        mod_: nmod_t,
351    );
352    pub fn _nmod_poly_KS2_recover_reduce1(
353        res: mp_ptr,
354        s: mp_limb_signed_t,
355        op1: mp_srcptr,
356        op2: mp_srcptr,
357        n: mp_limb_signed_t,
358        b: mp_limb_t,
359        mod_: nmod_t,
360    );
361    pub fn _nmod_poly_KS2_recover_reduce2(
362        res: mp_ptr,
363        s: mp_limb_signed_t,
364        op1: mp_srcptr,
365        op2: mp_srcptr,
366        n: mp_limb_signed_t,
367        b: mp_limb_t,
368        mod_: nmod_t,
369    );
370    pub fn _nmod_poly_KS2_recover_reduce2b(
371        res: mp_ptr,
372        s: mp_limb_signed_t,
373        op1: mp_srcptr,
374        op2: mp_srcptr,
375        n: mp_limb_signed_t,
376        b: mp_limb_t,
377        mod_: nmod_t,
378    );
379    pub fn _nmod_poly_KS2_recover_reduce3(
380        res: mp_ptr,
381        s: mp_limb_signed_t,
382        op1: mp_srcptr,
383        op2: mp_srcptr,
384        n: mp_limb_signed_t,
385        b: mp_limb_t,
386        mod_: nmod_t,
387    );
388    pub fn _nmod_poly_KS2_recover_reduce(
389        res: mp_ptr,
390        s: mp_limb_signed_t,
391        op1: mp_srcptr,
392        op2: mp_srcptr,
393        n: mp_limb_signed_t,
394        b: mp_limb_t,
395        mod_: nmod_t,
396    );
397    pub fn _nmod_poly_bit_pack(
398        res: mp_ptr,
399        poly: mp_srcptr,
400        len: mp_limb_signed_t,
401        bits: mp_limb_t,
402    );
403    pub fn _nmod_poly_bit_unpack(
404        res: mp_ptr,
405        len: mp_limb_signed_t,
406        mpn: mp_srcptr,
407        bits: mp_limb_t,
408        mod_: nmod_t,
409    );
410    pub fn nmod_poly_bit_pack(f: *mut fmpz, poly: *mut nmod_poly_struct, bit_size: mp_limb_t);
411    pub fn nmod_poly_bit_unpack(poly: *mut nmod_poly_struct, f: *mut fmpz, bit_size: mp_limb_t);
412    pub fn _nmod_poly_mul_classical(
413        res: mp_ptr,
414        poly1: mp_srcptr,
415        len1: mp_limb_signed_t,
416        poly2: mp_srcptr,
417        len2: mp_limb_signed_t,
418        mod_: nmod_t,
419    );
420    pub fn nmod_poly_mul_classical(
421        res: *mut nmod_poly_struct,
422        poly1: *mut nmod_poly_struct,
423        poly2: *mut nmod_poly_struct,
424    );
425    pub fn _nmod_poly_mullow_classical(
426        res: mp_ptr,
427        poly1: mp_srcptr,
428        len1: mp_limb_signed_t,
429        poly2: mp_srcptr,
430        len2: mp_limb_signed_t,
431        trunc: mp_limb_signed_t,
432        mod_: nmod_t,
433    );
434    pub fn nmod_poly_mullow_classical(
435        res: *mut nmod_poly_struct,
436        poly1: *mut nmod_poly_struct,
437        poly2: *mut nmod_poly_struct,
438        trunc: mp_limb_signed_t,
439    );
440    pub fn _nmod_poly_mulhigh_classical(
441        res: mp_ptr,
442        poly1: mp_srcptr,
443        len1: mp_limb_signed_t,
444        poly2: mp_srcptr,
445        len2: mp_limb_signed_t,
446        start: mp_limb_signed_t,
447        mod_: nmod_t,
448    );
449    pub fn nmod_poly_mulhigh_classical(
450        res: *mut nmod_poly_struct,
451        poly1: *mut nmod_poly_struct,
452        poly2: *mut nmod_poly_struct,
453        start: mp_limb_signed_t,
454    );
455    pub fn _nmod_poly_mul_KS(
456        out: mp_ptr,
457        in1: mp_srcptr,
458        len1: mp_limb_signed_t,
459        in2: mp_srcptr,
460        len2: mp_limb_signed_t,
461        bits: mp_limb_t,
462        mod_: nmod_t,
463    );
464    pub fn nmod_poly_mul_KS(
465        res: *mut nmod_poly_struct,
466        poly1: *mut nmod_poly_struct,
467        poly2: *mut nmod_poly_struct,
468        bits: mp_limb_t,
469    );
470    pub fn _nmod_poly_mul_KS2(
471        res: mp_ptr,
472        op1: mp_srcptr,
473        n1: mp_limb_signed_t,
474        op2: mp_srcptr,
475        n2: mp_limb_signed_t,
476        mod_: nmod_t,
477    );
478    pub fn nmod_poly_mul_KS2(
479        res: *mut nmod_poly_struct,
480        poly1: *mut nmod_poly_struct,
481        poly2: *mut nmod_poly_struct,
482    );
483    pub fn _nmod_poly_mul_KS4(
484        res: mp_ptr,
485        op1: mp_srcptr,
486        n1: mp_limb_signed_t,
487        op2: mp_srcptr,
488        n2: mp_limb_signed_t,
489        mod_: nmod_t,
490    );
491    pub fn nmod_poly_mul_KS4(
492        res: *mut nmod_poly_struct,
493        poly1: *mut nmod_poly_struct,
494        poly2: *mut nmod_poly_struct,
495    );
496    pub fn _nmod_poly_mullow_KS(
497        out: mp_ptr,
498        in1: mp_srcptr,
499        len1: mp_limb_signed_t,
500        in2: mp_srcptr,
501        len2: mp_limb_signed_t,
502        bits: mp_limb_t,
503        n: mp_limb_signed_t,
504        mod_: nmod_t,
505    );
506    pub fn nmod_poly_mullow_KS(
507        res: *mut nmod_poly_struct,
508        poly1: *mut nmod_poly_struct,
509        poly2: *mut nmod_poly_struct,
510        bits: mp_limb_t,
511        n: mp_limb_signed_t,
512    );
513    pub fn _nmod_poly_mul(
514        res: mp_ptr,
515        poly1: mp_srcptr,
516        len1: mp_limb_signed_t,
517        poly2: mp_srcptr,
518        len2: mp_limb_signed_t,
519        mod_: nmod_t,
520    );
521    pub fn nmod_poly_mul(
522        res: *mut nmod_poly_struct,
523        poly1: *mut nmod_poly_struct,
524        poly2: *mut nmod_poly_struct,
525    );
526    pub fn _nmod_poly_mullow(
527        res: mp_ptr,
528        poly1: mp_srcptr,
529        len1: mp_limb_signed_t,
530        poly2: mp_srcptr,
531        len2: mp_limb_signed_t,
532        trunc: mp_limb_signed_t,
533        mod_: nmod_t,
534    );
535    pub fn nmod_poly_mullow(
536        res: *mut nmod_poly_struct,
537        poly1: *mut nmod_poly_struct,
538        poly2: *mut nmod_poly_struct,
539        trunc: mp_limb_signed_t,
540    );
541    pub fn _nmod_poly_mulhigh(
542        res: mp_ptr,
543        poly1: mp_srcptr,
544        len1: mp_limb_signed_t,
545        poly2: mp_srcptr,
546        len2: mp_limb_signed_t,
547        n: mp_limb_signed_t,
548        mod_: nmod_t,
549    );
550    pub fn nmod_poly_mulhigh(
551        res: *mut nmod_poly_struct,
552        poly1: *mut nmod_poly_struct,
553        poly2: *mut nmod_poly_struct,
554        n: mp_limb_signed_t,
555    );
556    pub fn _nmod_poly_mulmod(
557        res: mp_ptr,
558        poly1: mp_srcptr,
559        len1: mp_limb_signed_t,
560        poly2: mp_srcptr,
561        len2: mp_limb_signed_t,
562        f: mp_srcptr,
563        lenf: mp_limb_signed_t,
564        mod_: nmod_t,
565    );
566    pub fn nmod_poly_mulmod(
567        res: *mut nmod_poly_struct,
568        poly1: *mut nmod_poly_struct,
569        poly2: *mut nmod_poly_struct,
570        f: *mut nmod_poly_struct,
571    );
572    pub fn _nmod_poly_mulmod_preinv(
573        res: mp_ptr,
574        poly1: mp_srcptr,
575        len1: mp_limb_signed_t,
576        poly2: mp_srcptr,
577        len2: mp_limb_signed_t,
578        f: mp_srcptr,
579        lenf: mp_limb_signed_t,
580        finv: mp_srcptr,
581        lenfinv: mp_limb_signed_t,
582        mod_: nmod_t,
583    );
584    pub fn nmod_poly_mulmod_preinv(
585        res: *mut nmod_poly_struct,
586        poly1: *mut nmod_poly_struct,
587        poly2: *mut nmod_poly_struct,
588        f: *mut nmod_poly_struct,
589        finv: *mut nmod_poly_struct,
590    );
591    pub fn _nmod_poly_invmod(
592        A: *mut mp_limb_t,
593        B: *const mp_limb_t,
594        lenB: mp_limb_signed_t,
595        P: *const mp_limb_t,
596        lenP: mp_limb_signed_t,
597        mod_: nmod_t,
598    ) -> c_int;
599    pub fn nmod_poly_invmod(
600        A: *mut nmod_poly_struct,
601        B: *mut nmod_poly_struct,
602        P: *mut nmod_poly_struct,
603    ) -> c_int;
604    pub fn _nmod_poly_pow_binexp(
605        res: mp_ptr,
606        poly: mp_srcptr,
607        len: mp_limb_signed_t,
608        e: mp_limb_t,
609        mod_: nmod_t,
610    );
611    pub fn nmod_poly_pow_binexp(
612        res: *mut nmod_poly_struct,
613        poly: *mut nmod_poly_struct,
614        e: mp_limb_t,
615    );
616    pub fn _nmod_poly_pow(
617        res: mp_ptr,
618        poly: mp_srcptr,
619        len: mp_limb_signed_t,
620        e: mp_limb_t,
621        mod_: nmod_t,
622    );
623    pub fn nmod_poly_pow(res: *mut nmod_poly_struct, poly: *mut nmod_poly_struct, e: mp_limb_t);
624    pub fn _nmod_poly_pow_trunc_binexp(
625        res: mp_ptr,
626        poly: mp_srcptr,
627        e: mp_limb_t,
628        trunc: mp_limb_signed_t,
629        mod_: nmod_t,
630    );
631    pub fn nmod_poly_pow_trunc_binexp(
632        res: *mut nmod_poly_struct,
633        poly: *mut nmod_poly_struct,
634        e: mp_limb_t,
635        trunc: mp_limb_signed_t,
636    );
637    pub fn _nmod_poly_pow_trunc(
638        res: mp_ptr,
639        poly: mp_srcptr,
640        e: mp_limb_t,
641        trunc: mp_limb_signed_t,
642        mod_: nmod_t,
643    );
644    pub fn nmod_poly_pow_trunc(
645        res: *mut nmod_poly_struct,
646        poly: *mut nmod_poly_struct,
647        e: mp_limb_t,
648        trunc: mp_limb_signed_t,
649    );
650    pub fn nmod_poly_powmod_ui_binexp(
651        res: *mut nmod_poly_struct,
652        poly: *mut nmod_poly_struct,
653        e: mp_limb_t,
654        f: *mut nmod_poly_struct,
655    );
656    pub fn _nmod_poly_powmod_ui_binexp(
657        res: mp_ptr,
658        poly: mp_srcptr,
659        e: mp_limb_t,
660        f: mp_srcptr,
661        lenf: mp_limb_signed_t,
662        mod_: nmod_t,
663    );
664    pub fn nmod_poly_powmod_fmpz_binexp(
665        res: *mut nmod_poly_struct,
666        poly: *mut nmod_poly_struct,
667        e: *mut fmpz,
668        f: *mut nmod_poly_struct,
669    );
670    pub fn _nmod_poly_powmod_fmpz_binexp(
671        res: mp_ptr,
672        poly: mp_srcptr,
673        e: *mut fmpz,
674        f: mp_srcptr,
675        lenf: mp_limb_signed_t,
676        mod_: nmod_t,
677    );
678    pub fn _nmod_poly_powmod_mpz_binexp(
679        res: mp_ptr,
680        poly: mp_srcptr,
681        e: mpz_srcptr,
682        f: mp_srcptr,
683        lenf: mp_limb_signed_t,
684        mod_: nmod_t,
685    );
686    pub fn nmod_poly_powmod_mpz_binexp(
687        res: *mut nmod_poly_struct,
688        poly: *mut nmod_poly_struct,
689        e: mpz_srcptr,
690        f: *mut nmod_poly_struct,
691    );
692    pub fn _nmod_poly_powmod_ui_binexp_preinv(
693        res: mp_ptr,
694        poly: mp_srcptr,
695        e: mp_limb_t,
696        f: mp_srcptr,
697        lenf: mp_limb_signed_t,
698        finv: mp_srcptr,
699        lenfinv: mp_limb_signed_t,
700        mod_: nmod_t,
701    );
702    pub fn nmod_poly_powmod_ui_binexp_preinv(
703        res: *mut nmod_poly_struct,
704        poly: *mut nmod_poly_struct,
705        e: mp_limb_t,
706        f: *mut nmod_poly_struct,
707        finv: *mut nmod_poly_struct,
708    );
709    pub fn _nmod_poly_powmod_fmpz_binexp_preinv(
710        res: mp_ptr,
711        poly: mp_srcptr,
712        e: *mut fmpz,
713        f: mp_srcptr,
714        lenf: mp_limb_signed_t,
715        finv: mp_srcptr,
716        lenfinv: mp_limb_signed_t,
717        mod_: nmod_t,
718    );
719    pub fn nmod_poly_powmod_fmpz_binexp_preinv(
720        res: *mut nmod_poly_struct,
721        poly: *mut nmod_poly_struct,
722        e: *mut fmpz,
723        f: *mut nmod_poly_struct,
724        finv: *mut nmod_poly_struct,
725    );
726    pub fn _nmod_poly_powmod_x_ui_preinv(
727        res: mp_ptr,
728        e: mp_limb_t,
729        f: mp_srcptr,
730        lenf: mp_limb_signed_t,
731        finv: mp_srcptr,
732        lenfinv: mp_limb_signed_t,
733        mod_: nmod_t,
734    );
735    pub fn nmod_poly_powmod_x_ui_preinv(
736        res: *mut nmod_poly_struct,
737        e: mp_limb_t,
738        f: *mut nmod_poly_struct,
739        finv: *mut nmod_poly_struct,
740    );
741    pub fn _nmod_poly_powmod_mpz_binexp_preinv(
742        res: mp_ptr,
743        poly: mp_srcptr,
744        e: mpz_srcptr,
745        f: mp_srcptr,
746        lenf: mp_limb_signed_t,
747        finv: mp_srcptr,
748        lenfinv: mp_limb_signed_t,
749        mod_: nmod_t,
750    );
751    pub fn nmod_poly_powmod_mpz_binexp_preinv(
752        res: *mut nmod_poly_struct,
753        poly: *mut nmod_poly_struct,
754        e: mpz_srcptr,
755        f: *mut nmod_poly_struct,
756        finv: *mut nmod_poly_struct,
757    );
758    pub fn _nmod_poly_powmod_x_fmpz_preinv(
759        res: mp_ptr,
760        e: *mut fmpz,
761        f: mp_srcptr,
762        lenf: mp_limb_signed_t,
763        finv: mp_srcptr,
764        lenfinv: mp_limb_signed_t,
765        mod_: nmod_t,
766    );
767    pub fn nmod_poly_powmod_x_fmpz_preinv(
768        res: *mut nmod_poly_struct,
769        e: *mut fmpz,
770        f: *mut nmod_poly_struct,
771        finv: *mut nmod_poly_struct,
772    );
773    pub fn _nmod_poly_powers_mod_preinv_naive(
774        res: *mut mp_ptr,
775        f: mp_srcptr,
776        flen: mp_limb_signed_t,
777        n: mp_limb_signed_t,
778        g: mp_srcptr,
779        glen: mp_limb_signed_t,
780        ginv: mp_srcptr,
781        ginvlen: mp_limb_signed_t,
782        mod_: nmod_t,
783    );
784    pub fn nmod_poly_powers_mod_naive(
785        res: *mut nmod_poly_struct,
786        f: *mut nmod_poly_struct,
787        n: mp_limb_signed_t,
788        g: *mut nmod_poly_struct,
789    );
790    pub fn _nmod_poly_powers_mod_preinv_threaded_pool(
791        res: *mut mp_ptr,
792        f: mp_srcptr,
793        flen: mp_limb_signed_t,
794        n: mp_limb_signed_t,
795        g: mp_srcptr,
796        glen: mp_limb_signed_t,
797        ginv: mp_srcptr,
798        ginvlen: mp_limb_signed_t,
799        mod_: nmod_t,
800        threads: *mut thread_pool_handle,
801        num_threads: mp_limb_signed_t,
802    );
803    pub fn _nmod_poly_powers_mod_preinv_threaded(
804        res: *mut mp_ptr,
805        f: mp_srcptr,
806        flen: mp_limb_signed_t,
807        n: mp_limb_signed_t,
808        g: mp_srcptr,
809        glen: mp_limb_signed_t,
810        ginv: mp_srcptr,
811        ginvlen: mp_limb_signed_t,
812        mod_: nmod_t,
813    );
814    pub fn nmod_poly_powers_mod_bsgs(
815        res: *mut nmod_poly_struct,
816        f: *mut nmod_poly_struct,
817        n: mp_limb_signed_t,
818        g: *mut nmod_poly_struct,
819    );
820    pub fn _nmod_poly_divrem_basecase(
821        Q: mp_ptr,
822        R: mp_ptr,
823        W: mp_ptr,
824        A: mp_srcptr,
825        A_len: mp_limb_signed_t,
826        B: mp_srcptr,
827        B_len: mp_limb_signed_t,
828        mod_: nmod_t,
829    );
830    pub fn nmod_poly_divrem_basecase(
831        Q: *mut nmod_poly_struct,
832        R: *mut nmod_poly_struct,
833        A: *mut nmod_poly_struct,
834        B: *mut nmod_poly_struct,
835    );
836    pub fn _nmod_poly_divrem_divconquer_recursive(
837        Q: mp_ptr,
838        BQ: mp_ptr,
839        W: mp_ptr,
840        V: mp_ptr,
841        A: mp_srcptr,
842        B: mp_srcptr,
843        lenB: mp_limb_signed_t,
844        mod_: nmod_t,
845    );
846    pub fn _nmod_poly_divrem_divconquer(
847        Q: mp_ptr,
848        R: mp_ptr,
849        A: mp_srcptr,
850        lenA: mp_limb_signed_t,
851        B: mp_srcptr,
852        lenB: mp_limb_signed_t,
853        mod_: nmod_t,
854    );
855    pub fn nmod_poly_divrem_divconquer(
856        Q: *mut nmod_poly_struct,
857        R: *mut nmod_poly_struct,
858        A: *mut nmod_poly_struct,
859        B: *mut nmod_poly_struct,
860    );
861    pub fn _nmod_poly_divrem_q0(
862        Q: mp_ptr,
863        R: mp_ptr,
864        A: mp_srcptr,
865        B: mp_srcptr,
866        lenA: mp_limb_signed_t,
867        mod_: nmod_t,
868    );
869    pub fn _nmod_poly_divrem_q1(
870        Q: mp_ptr,
871        R: mp_ptr,
872        A: mp_srcptr,
873        lenA: mp_limb_signed_t,
874        B: mp_srcptr,
875        lenB: mp_limb_signed_t,
876        mod_: nmod_t,
877    );
878    pub fn _nmod_poly_divrem(
879        Q: mp_ptr,
880        R: mp_ptr,
881        A: mp_srcptr,
882        lenA: mp_limb_signed_t,
883        B: mp_srcptr,
884        lenB: mp_limb_signed_t,
885        mod_: nmod_t,
886    );
887    pub fn nmod_poly_divrem(
888        Q: *mut nmod_poly_struct,
889        R: *mut nmod_poly_struct,
890        A: *mut nmod_poly_struct,
891        B: *mut nmod_poly_struct,
892    );
893    pub fn _nmod_poly_div_basecase(
894        Q: mp_ptr,
895        W: mp_ptr,
896        A: mp_srcptr,
897        A_len: mp_limb_signed_t,
898        B: mp_srcptr,
899        B_len: mp_limb_signed_t,
900        mod_: nmod_t,
901    );
902    pub fn nmod_poly_div_basecase(
903        Q: *mut nmod_poly_struct,
904        A: *mut nmod_poly_struct,
905        B: *mut nmod_poly_struct,
906    );
907    pub fn _nmod_poly_div_divconquer_recursive(
908        Q: mp_ptr,
909        W: mp_ptr,
910        V: mp_ptr,
911        A: mp_srcptr,
912        B: mp_srcptr,
913        lenB: mp_limb_signed_t,
914        mod_: nmod_t,
915    );
916    pub fn _nmod_poly_div_divconquer(
917        Q: mp_ptr,
918        A: mp_srcptr,
919        lenA: mp_limb_signed_t,
920        B: mp_srcptr,
921        lenB: mp_limb_signed_t,
922        mod_: nmod_t,
923    );
924    pub fn nmod_poly_div_divconquer(
925        Q: *mut nmod_poly_struct,
926        A: *mut nmod_poly_struct,
927        B: *mut nmod_poly_struct,
928    );
929    pub fn _nmod_poly_div(
930        Q: mp_ptr,
931        A: mp_srcptr,
932        lenA: mp_limb_signed_t,
933        B: mp_srcptr,
934        lenB: mp_limb_signed_t,
935        mod_: nmod_t,
936    );
937    pub fn nmod_poly_div(
938        Q: *mut nmod_poly_struct,
939        A: *mut nmod_poly_struct,
940        B: *mut nmod_poly_struct,
941    );
942    pub fn _nmod_poly_rem_basecase(
943        R: mp_ptr,
944        W: mp_ptr,
945        A: mp_srcptr,
946        lenA: mp_limb_signed_t,
947        B: mp_srcptr,
948        lenB: mp_limb_signed_t,
949        mod_: nmod_t,
950    );
951    pub fn nmod_poly_rem_basecase(
952        R: *mut nmod_poly_struct,
953        A: *mut nmod_poly_struct,
954        B: *mut nmod_poly_struct,
955    );
956    pub fn _nmod_poly_rem_q1(
957        R: mp_ptr,
958        A: mp_srcptr,
959        lenA: mp_limb_signed_t,
960        B: mp_srcptr,
961        lenB: mp_limb_signed_t,
962        mod_: nmod_t,
963    );
964    pub fn _nmod_poly_rem(
965        R: mp_ptr,
966        A: mp_srcptr,
967        lenA: mp_limb_signed_t,
968        B: mp_srcptr,
969        lenB: mp_limb_signed_t,
970        mod_: nmod_t,
971    );
972    pub fn nmod_poly_rem(
973        R: *mut nmod_poly_struct,
974        A: *mut nmod_poly_struct,
975        B: *mut nmod_poly_struct,
976    );
977    pub fn _nmod_poly_inv_series_basecase(
978        Qinv: mp_ptr,
979        Q: mp_srcptr,
980        Qlen: mp_limb_signed_t,
981        n: mp_limb_signed_t,
982        mod_: nmod_t,
983    );
984    pub fn nmod_poly_inv_series_basecase(
985        Qinv: *mut nmod_poly_struct,
986        Q: *mut nmod_poly_struct,
987        n: mp_limb_signed_t,
988    );
989    pub fn _nmod_poly_inv_series_newton(
990        Qinv: mp_ptr,
991        Q: mp_srcptr,
992        Qlen: mp_limb_signed_t,
993        n: mp_limb_signed_t,
994        mod_: nmod_t,
995    );
996    pub fn nmod_poly_inv_series_newton(
997        Qinv: *mut nmod_poly_struct,
998        Q: *mut nmod_poly_struct,
999        n: mp_limb_signed_t,
1000    );
1001    pub fn _nmod_poly_inv_series(
1002        Qinv: mp_ptr,
1003        Q: mp_srcptr,
1004        Qlen: mp_limb_signed_t,
1005        n: mp_limb_signed_t,
1006        mod_: nmod_t,
1007    );
1008    pub fn nmod_poly_inv_series(
1009        Qinv: *mut nmod_poly_struct,
1010        Q: *mut nmod_poly_struct,
1011        n: mp_limb_signed_t,
1012    );
1013    pub fn _nmod_poly_div_series_basecase(
1014        Q: mp_ptr,
1015        A: mp_srcptr,
1016        Alen: mp_limb_signed_t,
1017        B: mp_srcptr,
1018        Blen: mp_limb_signed_t,
1019        n: mp_limb_signed_t,
1020        mod_: nmod_t,
1021    );
1022    pub fn nmod_poly_div_series_basecase(
1023        Q: *mut nmod_poly_struct,
1024        A: *mut nmod_poly_struct,
1025        B: *mut nmod_poly_struct,
1026        n: mp_limb_signed_t,
1027    );
1028    pub fn _nmod_poly_div_series(
1029        Q: mp_ptr,
1030        A: mp_srcptr,
1031        Alen: mp_limb_signed_t,
1032        B: mp_srcptr,
1033        Blen: mp_limb_signed_t,
1034        n: mp_limb_signed_t,
1035        mod_: nmod_t,
1036    );
1037    pub fn nmod_poly_div_series(
1038        Q: *mut nmod_poly_struct,
1039        A: *mut nmod_poly_struct,
1040        B: *mut nmod_poly_struct,
1041        n: mp_limb_signed_t,
1042    );
1043    pub fn _nmod_poly_div_newton(
1044        Q: mp_ptr,
1045        A: mp_srcptr,
1046        Alen: mp_limb_signed_t,
1047        B: mp_srcptr,
1048        Blen: mp_limb_signed_t,
1049        mod_: nmod_t,
1050    );
1051    pub fn nmod_poly_div_newton(
1052        Q: *mut nmod_poly_struct,
1053        A: *mut nmod_poly_struct,
1054        B: *mut nmod_poly_struct,
1055    );
1056    pub fn _nmod_poly_divrem_newton(
1057        Q: mp_ptr,
1058        R: mp_ptr,
1059        A: mp_srcptr,
1060        Alen: mp_limb_signed_t,
1061        B: mp_srcptr,
1062        Blen: mp_limb_signed_t,
1063        mod_: nmod_t,
1064    );
1065    pub fn nmod_poly_divrem_newton(
1066        Q: *mut nmod_poly_struct,
1067        R: *mut nmod_poly_struct,
1068        A: *mut nmod_poly_struct,
1069        B: *mut nmod_poly_struct,
1070    );
1071    pub fn _nmod_poly_div_newton_n_preinv(
1072        Q: mp_ptr,
1073        A: mp_srcptr,
1074        lenA: mp_limb_signed_t,
1075        B: mp_srcptr,
1076        lenB: mp_limb_signed_t,
1077        Binv: mp_srcptr,
1078        lenBinv: mp_limb_signed_t,
1079        mod_: nmod_t,
1080    );
1081    pub fn nmod_poly_div_newton_n_preinv(
1082        Q: *mut nmod_poly_struct,
1083        A: *mut nmod_poly_struct,
1084        B: *mut nmod_poly_struct,
1085        Binv: *mut nmod_poly_struct,
1086    );
1087    pub fn _nmod_poly_divrem_newton_n_preinv(
1088        Q: mp_ptr,
1089        R: mp_ptr,
1090        A: mp_srcptr,
1091        lenA: mp_limb_signed_t,
1092        B: mp_srcptr,
1093        lenB: mp_limb_signed_t,
1094        Binv: mp_srcptr,
1095        lenBinv: mp_limb_signed_t,
1096        mod_: nmod_t,
1097    );
1098    pub fn nmod_poly_divrem_newton_n_preinv(
1099        Q: *mut nmod_poly_struct,
1100        R: *mut nmod_poly_struct,
1101        A: *mut nmod_poly_struct,
1102        B: *mut nmod_poly_struct,
1103        Binv: *mut nmod_poly_struct,
1104    );
1105    pub fn _nmod_poly_div_root(
1106        Q: mp_ptr,
1107        A: mp_srcptr,
1108        len: mp_limb_signed_t,
1109        c: mp_limb_t,
1110        mod_: nmod_t,
1111    ) -> mp_limb_t;
1112    pub fn nmod_poly_div_root(
1113        Q: *mut nmod_poly_struct,
1114        A: *mut nmod_poly_struct,
1115        c: mp_limb_t,
1116    ) -> mp_limb_t;
1117    pub fn _nmod_poly_derivative(
1118        x_prime: mp_ptr,
1119        x: mp_srcptr,
1120        len: mp_limb_signed_t,
1121        mod_: nmod_t,
1122    );
1123    pub fn nmod_poly_derivative(x_prime: *mut nmod_poly_struct, x: *mut nmod_poly_struct);
1124    pub fn _nmod_poly_integral(x_int: mp_ptr, x: mp_srcptr, len: mp_limb_signed_t, mod_: nmod_t);
1125    pub fn nmod_poly_integral(x_int: *mut nmod_poly_struct, x: *mut nmod_poly_struct);
1126    pub fn _nmod_poly_evaluate_fmpz(
1127        rop: *mut fmpz,
1128        poly: mp_srcptr,
1129        len: mp_limb_signed_t,
1130        c: *mut fmpz,
1131    );
1132    pub fn nmod_poly_evaluate_fmpz(rop: *mut fmpz, poly: *mut nmod_poly_struct, c: *mut fmpz);
1133    pub fn _nmod_poly_evaluate_nmod(
1134        poly: mp_srcptr,
1135        len: mp_limb_signed_t,
1136        c: mp_limb_t,
1137        mod_: nmod_t,
1138    ) -> mp_limb_t;
1139    pub fn nmod_poly_evaluate_nmod(poly: *mut nmod_poly_struct, c: mp_limb_t) -> mp_limb_t;
1140    pub fn _nmod_poly_evaluate_nmod_vec(
1141        ys: mp_ptr,
1142        coeffs: mp_srcptr,
1143        len: mp_limb_signed_t,
1144        xs: mp_srcptr,
1145        n: mp_limb_signed_t,
1146        mod_: nmod_t,
1147    );
1148    pub fn nmod_poly_evaluate_nmod_vec(
1149        ys: mp_ptr,
1150        poly: *mut nmod_poly_struct,
1151        xs: mp_srcptr,
1152        n: mp_limb_signed_t,
1153    );
1154    pub fn _nmod_poly_evaluate_nmod_vec_iter(
1155        ys: mp_ptr,
1156        coeffs: mp_srcptr,
1157        len: mp_limb_signed_t,
1158        xs: mp_srcptr,
1159        n: mp_limb_signed_t,
1160        mod_: nmod_t,
1161    );
1162    pub fn nmod_poly_evaluate_nmod_vec_iter(
1163        ys: mp_ptr,
1164        poly: *mut nmod_poly_struct,
1165        xs: mp_srcptr,
1166        n: mp_limb_signed_t,
1167    );
1168    pub fn _nmod_poly_evaluate_nmod_vec_fast_precomp(
1169        vs: mp_ptr,
1170        poly: mp_srcptr,
1171        plen: mp_limb_signed_t,
1172        tree: *const mp_ptr,
1173        len: mp_limb_signed_t,
1174        mod_: nmod_t,
1175    );
1176    pub fn _nmod_poly_evaluate_nmod_vec_fast(
1177        ys: mp_ptr,
1178        coeffs: mp_srcptr,
1179        len: mp_limb_signed_t,
1180        xs: mp_srcptr,
1181        n: mp_limb_signed_t,
1182        mod_: nmod_t,
1183    );
1184    pub fn nmod_poly_evaluate_nmod_vec_fast(
1185        ys: mp_ptr,
1186        poly: *mut nmod_poly_struct,
1187        xs: mp_srcptr,
1188        n: mp_limb_signed_t,
1189    );
1190    pub fn nmod_mat_one_addmul(dest: *mut nmod_mat_struct, mat: *mut nmod_mat_struct, c: mp_limb_t);
1191    pub fn nmod_poly_evaluate_mat_horner(
1192        dest: *mut nmod_mat_struct,
1193        poly: *mut nmod_poly_struct,
1194        c: *mut nmod_mat_struct,
1195    );
1196    pub fn nmod_poly_evaluate_mat_paterson_stockmeyer(
1197        dest: *mut nmod_mat_struct,
1198        poly: *mut nmod_poly_struct,
1199        c: *mut nmod_mat_struct,
1200    );
1201    pub fn nmod_poly_evaluate_mat(
1202        dest: *mut nmod_mat_struct,
1203        poly: *mut nmod_poly_struct,
1204        c: *mut nmod_mat_struct,
1205    );
1206    pub fn _nmod_poly_tree_alloc(len: mp_limb_signed_t) -> *mut mp_ptr;
1207    pub fn _nmod_poly_tree_free(tree: *mut mp_ptr, len: mp_limb_signed_t);
1208    pub fn _nmod_poly_tree_build(
1209        tree: *mut mp_ptr,
1210        roots: mp_srcptr,
1211        len: mp_limb_signed_t,
1212        mod_: nmod_t,
1213    );
1214    pub fn _nmod_poly_interpolate_nmod_vec_newton(
1215        poly: mp_ptr,
1216        xs: mp_srcptr,
1217        ys: mp_srcptr,
1218        n: mp_limb_signed_t,
1219        mod_: nmod_t,
1220    );
1221    pub fn nmod_poly_interpolate_nmod_vec_newton(
1222        poly: *mut nmod_poly_struct,
1223        xs: mp_srcptr,
1224        ys: mp_srcptr,
1225        n: mp_limb_signed_t,
1226    );
1227    pub fn _nmod_poly_interpolate_nmod_vec_barycentric(
1228        poly: mp_ptr,
1229        xs: mp_srcptr,
1230        ys: mp_srcptr,
1231        n: mp_limb_signed_t,
1232        mod_: nmod_t,
1233    );
1234    pub fn nmod_poly_interpolate_nmod_vec_barycentric(
1235        poly: *mut nmod_poly_struct,
1236        xs: mp_srcptr,
1237        ys: mp_srcptr,
1238        n: mp_limb_signed_t,
1239    );
1240    pub fn _nmod_poly_interpolate_nmod_vec(
1241        poly: mp_ptr,
1242        xs: mp_srcptr,
1243        ys: mp_srcptr,
1244        n: mp_limb_signed_t,
1245        mod_: nmod_t,
1246    );
1247    pub fn nmod_poly_interpolate_nmod_vec(
1248        poly: *mut nmod_poly_struct,
1249        xs: mp_srcptr,
1250        ys: mp_srcptr,
1251        n: mp_limb_signed_t,
1252    );
1253    pub fn nmod_poly_interpolate_nmod_vec_fast(
1254        poly: *mut nmod_poly_struct,
1255        xs: mp_srcptr,
1256        ys: mp_srcptr,
1257        n: mp_limb_signed_t,
1258    );
1259    pub fn _nmod_poly_interpolate_nmod_vec_fast(
1260        poly: mp_ptr,
1261        xs: mp_srcptr,
1262        ys: mp_srcptr,
1263        len: mp_limb_signed_t,
1264        mod_: nmod_t,
1265    );
1266    pub fn _nmod_poly_interpolate_nmod_vec_fast_precomp(
1267        poly: mp_ptr,
1268        ys: mp_srcptr,
1269        tree: *const mp_ptr,
1270        weights: mp_srcptr,
1271        len: mp_limb_signed_t,
1272        mod_: nmod_t,
1273    );
1274    pub fn _nmod_poly_interpolation_weights(
1275        w: mp_ptr,
1276        tree: *const mp_ptr,
1277        len: mp_limb_signed_t,
1278        mod_: nmod_t,
1279    );
1280    pub fn _nmod_poly_compose_horner(
1281        res: mp_ptr,
1282        poly1: mp_srcptr,
1283        len1: mp_limb_signed_t,
1284        poly2: mp_srcptr,
1285        len2: mp_limb_signed_t,
1286        mod_: nmod_t,
1287    );
1288    pub fn nmod_poly_compose_horner(
1289        res: *mut nmod_poly_struct,
1290        poly1: *mut nmod_poly_struct,
1291        poly2: *mut nmod_poly_struct,
1292    );
1293    pub fn _nmod_poly_compose_divconquer(
1294        res: mp_ptr,
1295        poly1: mp_srcptr,
1296        len1: mp_limb_signed_t,
1297        poly2: mp_srcptr,
1298        len2: mp_limb_signed_t,
1299        mod_: nmod_t,
1300    );
1301    pub fn nmod_poly_compose_divconquer(
1302        res: *mut nmod_poly_struct,
1303        poly1: *mut nmod_poly_struct,
1304        poly2: *mut nmod_poly_struct,
1305    );
1306    pub fn _nmod_poly_compose(
1307        res: mp_ptr,
1308        poly1: mp_srcptr,
1309        len1: mp_limb_signed_t,
1310        poly2: mp_srcptr,
1311        len2: mp_limb_signed_t,
1312        mod_: nmod_t,
1313    );
1314    pub fn nmod_poly_compose(
1315        res: *mut nmod_poly_struct,
1316        poly1: *mut nmod_poly_struct,
1317        poly2: *mut nmod_poly_struct,
1318    );
1319    pub fn _nmod_poly_taylor_shift_horner(
1320        poly: mp_ptr,
1321        c: mp_limb_t,
1322        len: mp_limb_signed_t,
1323        mod_: nmod_t,
1324    );
1325    pub fn nmod_poly_taylor_shift_horner(
1326        g: *mut nmod_poly_struct,
1327        f: *mut nmod_poly_struct,
1328        c: mp_limb_t,
1329    );
1330    pub fn _nmod_poly_taylor_shift_convolution(
1331        poly: mp_ptr,
1332        c: mp_limb_t,
1333        len: mp_limb_signed_t,
1334        mod_: nmod_t,
1335    );
1336    pub fn nmod_poly_taylor_shift_convolution(
1337        g: *mut nmod_poly_struct,
1338        f: *mut nmod_poly_struct,
1339        c: mp_limb_t,
1340    );
1341    pub fn _nmod_poly_taylor_shift(poly: mp_ptr, c: mp_limb_t, len: mp_limb_signed_t, mod_: nmod_t);
1342    pub fn nmod_poly_taylor_shift(g: *mut nmod_poly_struct, f: *mut nmod_poly_struct, c: mp_limb_t);
1343    pub fn _nmod_poly_compose_mod_brent_kung(
1344        res: mp_ptr,
1345        f: mp_srcptr,
1346        lenf: mp_limb_signed_t,
1347        g: mp_srcptr,
1348        h: mp_srcptr,
1349        lenh: mp_limb_signed_t,
1350        mod_: nmod_t,
1351    );
1352    pub fn nmod_poly_compose_mod_brent_kung(
1353        res: *mut nmod_poly_struct,
1354        f: *mut nmod_poly_struct,
1355        g: *mut nmod_poly_struct,
1356        h: *mut nmod_poly_struct,
1357    );
1358    pub fn _nmod_poly_reduce_matrix_mod_poly(
1359        A: *mut nmod_mat_struct,
1360        B: *mut nmod_mat_struct,
1361        f: *mut nmod_poly_struct,
1362    );
1363    pub fn _nmod_poly_precompute_matrix(
1364        A: *mut nmod_mat_struct,
1365        poly1: mp_srcptr,
1366        poly2: mp_srcptr,
1367        len2: mp_limb_signed_t,
1368        poly2inv: mp_srcptr,
1369        len2inv: mp_limb_signed_t,
1370        mod_: nmod_t,
1371    );
1372    pub fn _nmod_poly_precompute_matrix_worker(arg_ptr: *mut c_void);
1373    pub fn nmod_poly_precompute_matrix(
1374        A: *mut nmod_mat_struct,
1375        poly1: *mut nmod_poly_struct,
1376        poly2: *mut nmod_poly_struct,
1377        poly2inv: *mut nmod_poly_struct,
1378    );
1379    pub fn _nmod_poly_compose_mod_brent_kung_precomp_preinv(
1380        res: mp_ptr,
1381        poly1: mp_srcptr,
1382        len1: mp_limb_signed_t,
1383        A: *mut nmod_mat_struct,
1384        poly3: mp_srcptr,
1385        len3: mp_limb_signed_t,
1386        poly3inv: mp_srcptr,
1387        len3inv: mp_limb_signed_t,
1388        mod_: nmod_t,
1389    );
1390    pub fn _nmod_poly_compose_mod_brent_kung_precomp_preinv_worker(arg_ptr: *mut c_void);
1391    pub fn nmod_poly_compose_mod_brent_kung_precomp_preinv(
1392        res: *mut nmod_poly_struct,
1393        poly1: *mut nmod_poly_struct,
1394        A: *mut nmod_mat_struct,
1395        poly3: *mut nmod_poly_struct,
1396        poly3inv: *mut nmod_poly_struct,
1397    );
1398    pub fn _nmod_poly_compose_mod_brent_kung_preinv(
1399        res: mp_ptr,
1400        poly1: mp_srcptr,
1401        len1: mp_limb_signed_t,
1402        poly2: mp_srcptr,
1403        poly3: mp_srcptr,
1404        len3: mp_limb_signed_t,
1405        poly3inv: mp_srcptr,
1406        len3inv: mp_limb_signed_t,
1407        mod_: nmod_t,
1408    );
1409    pub fn nmod_poly_compose_mod_brent_kung_preinv(
1410        res: *mut nmod_poly_struct,
1411        poly1: *mut nmod_poly_struct,
1412        poly2: *mut nmod_poly_struct,
1413        poly3: *mut nmod_poly_struct,
1414        poly3inv: *mut nmod_poly_struct,
1415    );
1416    pub fn _nmod_poly_compose_mod_brent_kung_vec_preinv(
1417        res: *mut nmod_poly_struct,
1418        polys: *const nmod_poly_struct,
1419        len1: mp_limb_signed_t,
1420        l: mp_limb_signed_t,
1421        g: mp_srcptr,
1422        glen: mp_limb_signed_t,
1423        poly: mp_srcptr,
1424        len: mp_limb_signed_t,
1425        polyinv: mp_srcptr,
1426        leninv: mp_limb_signed_t,
1427        mod_: nmod_t,
1428    );
1429    pub fn nmod_poly_compose_mod_brent_kung_vec_preinv(
1430        res: *mut nmod_poly_struct,
1431        polys: *const nmod_poly_struct,
1432        len1: mp_limb_signed_t,
1433        n: mp_limb_signed_t,
1434        g: *mut nmod_poly_struct,
1435        poly: *mut nmod_poly_struct,
1436        polyinv: *mut nmod_poly_struct,
1437    );
1438    pub fn _nmod_poly_compose_mod_brent_kung_vec_preinv_worker(arg_ptr: *mut c_void);
1439    pub fn nmod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(
1440        res: *mut nmod_poly_struct,
1441        polys: *const nmod_poly_struct,
1442        len1: mp_limb_signed_t,
1443        n: mp_limb_signed_t,
1444        g: *mut nmod_poly_struct,
1445        poly: *mut nmod_poly_struct,
1446        polyinv: *mut nmod_poly_struct,
1447        threads: *mut thread_pool_handle,
1448        num_threads: mp_limb_signed_t,
1449    );
1450    pub fn _nmod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(
1451        res: *mut nmod_poly_struct,
1452        polys: *const nmod_poly_struct,
1453        lenpolys: mp_limb_signed_t,
1454        l: mp_limb_signed_t,
1455        g: mp_srcptr,
1456        glen: mp_limb_signed_t,
1457        poly: mp_srcptr,
1458        len: mp_limb_signed_t,
1459        polyinv: mp_srcptr,
1460        leninv: mp_limb_signed_t,
1461        mod_: nmod_t,
1462        threads: *mut thread_pool_handle,
1463        num_threads: mp_limb_signed_t,
1464    );
1465    pub fn nmod_poly_compose_mod_brent_kung_vec_preinv_threaded(
1466        res: *mut nmod_poly_struct,
1467        polys: *const nmod_poly_struct,
1468        len1: mp_limb_signed_t,
1469        n: mp_limb_signed_t,
1470        g: *mut nmod_poly_struct,
1471        poly: *mut nmod_poly_struct,
1472        polyinv: *mut nmod_poly_struct,
1473    );
1474    pub fn _nmod_poly_compose_mod_horner(
1475        res: mp_ptr,
1476        f: mp_srcptr,
1477        lenf: mp_limb_signed_t,
1478        g: mp_srcptr,
1479        h: mp_srcptr,
1480        lenh: mp_limb_signed_t,
1481        mod_: nmod_t,
1482    );
1483    pub fn nmod_poly_compose_mod_horner(
1484        res: *mut nmod_poly_struct,
1485        f: *mut nmod_poly_struct,
1486        g: *mut nmod_poly_struct,
1487        h: *mut nmod_poly_struct,
1488    );
1489    pub fn _nmod_poly_compose_mod(
1490        res: mp_ptr,
1491        f: mp_srcptr,
1492        lenf: mp_limb_signed_t,
1493        g: mp_srcptr,
1494        h: mp_srcptr,
1495        lenh: mp_limb_signed_t,
1496        mod_: nmod_t,
1497    );
1498    pub fn nmod_poly_compose_mod(
1499        res: *mut nmod_poly_struct,
1500        f: *mut nmod_poly_struct,
1501        g: *mut nmod_poly_struct,
1502        h: *mut nmod_poly_struct,
1503    );
1504    pub fn _nmod_poly_compose_series_horner(
1505        res: mp_ptr,
1506        poly1: mp_srcptr,
1507        len1: mp_limb_signed_t,
1508        poly2: mp_srcptr,
1509        len2: mp_limb_signed_t,
1510        n: mp_limb_signed_t,
1511        mod_: nmod_t,
1512    );
1513    pub fn nmod_poly_compose_series_horner(
1514        res: *mut nmod_poly_struct,
1515        poly1: *mut nmod_poly_struct,
1516        poly2: *mut nmod_poly_struct,
1517        n: mp_limb_signed_t,
1518    );
1519    pub fn _nmod_poly_compose_series_brent_kung(
1520        res: mp_ptr,
1521        poly1: mp_srcptr,
1522        len1: mp_limb_signed_t,
1523        poly2: mp_srcptr,
1524        len2: mp_limb_signed_t,
1525        n: mp_limb_signed_t,
1526        mod_: nmod_t,
1527    );
1528    pub fn nmod_poly_compose_series_brent_kung(
1529        res: *mut nmod_poly_struct,
1530        poly1: *mut nmod_poly_struct,
1531        poly2: *mut nmod_poly_struct,
1532        n: mp_limb_signed_t,
1533    );
1534    pub fn _nmod_poly_compose_series(
1535        res: mp_ptr,
1536        poly1: mp_srcptr,
1537        len1: mp_limb_signed_t,
1538        poly2: mp_srcptr,
1539        len2: mp_limb_signed_t,
1540        n: mp_limb_signed_t,
1541        mod_: nmod_t,
1542    );
1543    pub fn nmod_poly_compose_series(
1544        res: *mut nmod_poly_struct,
1545        poly1: *mut nmod_poly_struct,
1546        poly2: *mut nmod_poly_struct,
1547        n: mp_limb_signed_t,
1548    );
1549    pub fn _nmod_poly_revert_series_lagrange(
1550        Qinv: mp_ptr,
1551        Q: mp_srcptr,
1552        n: mp_limb_signed_t,
1553        mod_: nmod_t,
1554    );
1555    pub fn nmod_poly_revert_series_lagrange(
1556        Qinv: *mut nmod_poly_struct,
1557        Q: *mut nmod_poly_struct,
1558        n: mp_limb_signed_t,
1559    );
1560    pub fn _nmod_poly_revert_series_lagrange_fast(
1561        Qinv: mp_ptr,
1562        Q: mp_srcptr,
1563        n: mp_limb_signed_t,
1564        mod_: nmod_t,
1565    );
1566    pub fn nmod_poly_revert_series_lagrange_fast(
1567        Qinv: *mut nmod_poly_struct,
1568        Q: *mut nmod_poly_struct,
1569        n: mp_limb_signed_t,
1570    );
1571    pub fn _nmod_poly_revert_series_newton(
1572        Qinv: mp_ptr,
1573        Q: mp_srcptr,
1574        n: mp_limb_signed_t,
1575        mod_: nmod_t,
1576    );
1577    pub fn nmod_poly_revert_series_newton(
1578        Qinv: *mut nmod_poly_struct,
1579        Q: *mut nmod_poly_struct,
1580        n: mp_limb_signed_t,
1581    );
1582    pub fn _nmod_poly_revert_series(Qinv: mp_ptr, Q: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1583    pub fn nmod_poly_revert_series(
1584        Qinv: *mut nmod_poly_struct,
1585        Q: *mut nmod_poly_struct,
1586        n: mp_limb_signed_t,
1587    );
1588    pub fn _nmod_poly_compose_series_divconquer(
1589        res: mp_ptr,
1590        poly1: mp_srcptr,
1591        len1: mp_limb_signed_t,
1592        poly2: mp_srcptr,
1593        len2: mp_limb_signed_t,
1594        N: mp_limb_signed_t,
1595        mod_: nmod_t,
1596    );
1597    pub fn nmod_poly_compose_series_divconquer(
1598        res: *mut nmod_poly_struct,
1599        poly1: *mut nmod_poly_struct,
1600        poly2: *mut nmod_poly_struct,
1601        N: mp_limb_signed_t,
1602    );
1603    pub fn _nmod_poly_gcd_euclidean(
1604        G: mp_ptr,
1605        A: mp_srcptr,
1606        lenA: mp_limb_signed_t,
1607        B: mp_srcptr,
1608        lenB: mp_limb_signed_t,
1609        mod_: nmod_t,
1610    ) -> mp_limb_signed_t;
1611    pub fn nmod_poly_gcd_euclidean(
1612        G: *mut nmod_poly_struct,
1613        A: *mut nmod_poly_struct,
1614        B: *mut nmod_poly_struct,
1615    );
1616    pub fn _nmod_poly_hgcd_recursive(
1617        M: *mut mp_ptr,
1618        lenM: *mut mp_limb_signed_t,
1619        A: mp_ptr,
1620        lenA: *mut mp_limb_signed_t,
1621        B: mp_ptr,
1622        lenB: *mut mp_limb_signed_t,
1623        a: mp_srcptr,
1624        lena: mp_limb_signed_t,
1625        b: mp_srcptr,
1626        lenb: mp_limb_signed_t,
1627        P: mp_ptr,
1628        mod_: nmod_t,
1629        flag: c_int,
1630        res: *mut nmod_poly_res_struct,
1631    ) -> mp_limb_signed_t;
1632    pub fn _nmod_poly_hgcd(
1633        M: *mut mp_ptr,
1634        lenM: *mut mp_limb_signed_t,
1635        A: mp_ptr,
1636        lenA: *mut mp_limb_signed_t,
1637        B: mp_ptr,
1638        lenB: *mut mp_limb_signed_t,
1639        a: mp_srcptr,
1640        lena: mp_limb_signed_t,
1641        b: mp_srcptr,
1642        lenb: mp_limb_signed_t,
1643        mod_: nmod_t,
1644    ) -> mp_limb_signed_t;
1645    pub fn nmod_poly_hgcd_ref(
1646        m11: *mut nmod_poly_struct,
1647        m12: *mut nmod_poly_struct,
1648        m21: *mut nmod_poly_struct,
1649        m22: *mut nmod_poly_struct,
1650        A: *mut nmod_poly_struct,
1651        B: *mut nmod_poly_struct,
1652        a: *mut nmod_poly_struct,
1653        b: *mut nmod_poly_struct,
1654    ) -> mp_limb_signed_t;
1655    pub fn nmod_poly_hgcd(
1656        m11: *mut nmod_poly_struct,
1657        m12: *mut nmod_poly_struct,
1658        m21: *mut nmod_poly_struct,
1659        m22: *mut nmod_poly_struct,
1660        A: *mut nmod_poly_struct,
1661        B: *mut nmod_poly_struct,
1662        a: *mut nmod_poly_struct,
1663        b: *mut nmod_poly_struct,
1664    ) -> mp_limb_signed_t;
1665    pub fn _nmod_poly_gcd_hgcd(
1666        G: mp_ptr,
1667        A: mp_srcptr,
1668        lenA: mp_limb_signed_t,
1669        B: mp_srcptr,
1670        lenB: mp_limb_signed_t,
1671        mod_: nmod_t,
1672    ) -> mp_limb_signed_t;
1673    pub fn nmod_poly_gcd_hgcd(
1674        G: *mut nmod_poly_struct,
1675        A: *mut nmod_poly_struct,
1676        B: *mut nmod_poly_struct,
1677    );
1678    pub fn _nmod_poly_gcd(
1679        G: mp_ptr,
1680        A: mp_srcptr,
1681        lenA: mp_limb_signed_t,
1682        B: mp_srcptr,
1683        lenB: mp_limb_signed_t,
1684        mod_: nmod_t,
1685    ) -> mp_limb_signed_t;
1686    pub fn nmod_poly_gcd(
1687        G: *mut nmod_poly_struct,
1688        A: *mut nmod_poly_struct,
1689        B: *mut nmod_poly_struct,
1690    );
1691    pub fn _nmod_poly_xgcd_euclidean(
1692        res: mp_ptr,
1693        s: mp_ptr,
1694        t: mp_ptr,
1695        poly1: mp_srcptr,
1696        len1: mp_limb_signed_t,
1697        poly2: mp_srcptr,
1698        len2: mp_limb_signed_t,
1699        mod_: nmod_t,
1700    ) -> mp_limb_signed_t;
1701    pub fn nmod_poly_xgcd_euclidean(
1702        G: *mut nmod_poly_struct,
1703        S: *mut nmod_poly_struct,
1704        T: *mut nmod_poly_struct,
1705        A: *mut nmod_poly_struct,
1706        B: *mut nmod_poly_struct,
1707    );
1708    pub fn _nmod_poly_xgcd_hgcd(
1709        G: mp_ptr,
1710        S: mp_ptr,
1711        T: mp_ptr,
1712        A: mp_srcptr,
1713        lenA: mp_limb_signed_t,
1714        B: mp_srcptr,
1715        lenB: mp_limb_signed_t,
1716        mod_: nmod_t,
1717    ) -> mp_limb_signed_t;
1718    pub fn nmod_poly_xgcd_hgcd(
1719        G: *mut nmod_poly_struct,
1720        S: *mut nmod_poly_struct,
1721        T: *mut nmod_poly_struct,
1722        A: *mut nmod_poly_struct,
1723        B: *mut nmod_poly_struct,
1724    );
1725    pub fn _nmod_poly_xgcd(
1726        G: mp_ptr,
1727        S: mp_ptr,
1728        T: mp_ptr,
1729        A: mp_srcptr,
1730        lenA: mp_limb_signed_t,
1731        B: mp_srcptr,
1732        lenB: mp_limb_signed_t,
1733        mod_: nmod_t,
1734    ) -> mp_limb_signed_t;
1735    pub fn nmod_poly_xgcd(
1736        G: *mut nmod_poly_struct,
1737        S: *mut nmod_poly_struct,
1738        T: *mut nmod_poly_struct,
1739        A: *mut nmod_poly_struct,
1740        B: *mut nmod_poly_struct,
1741    );
1742    pub fn _nmod_poly_resultant_euclidean(
1743        poly1: mp_srcptr,
1744        len1: mp_limb_signed_t,
1745        poly2: mp_srcptr,
1746        len2: mp_limb_signed_t,
1747        mod_: nmod_t,
1748    ) -> mp_limb_t;
1749    pub fn nmod_poly_resultant_euclidean(
1750        f: *mut nmod_poly_struct,
1751        g: *mut nmod_poly_struct,
1752    ) -> mp_limb_t;
1753    pub fn _nmod_poly_resultant_hgcd(
1754        A: mp_srcptr,
1755        lenA: mp_limb_signed_t,
1756        B: mp_srcptr,
1757        lenB: mp_limb_signed_t,
1758        mod_: nmod_t,
1759    ) -> mp_limb_t;
1760    pub fn nmod_poly_resultant_hgcd(
1761        A: *mut nmod_poly_struct,
1762        B: *mut nmod_poly_struct,
1763    ) -> mp_limb_t;
1764    pub fn _nmod_poly_resultant(
1765        poly1: mp_srcptr,
1766        len1: mp_limb_signed_t,
1767        poly2: mp_srcptr,
1768        len2: mp_limb_signed_t,
1769        mod_: nmod_t,
1770    ) -> mp_limb_t;
1771    pub fn nmod_poly_resultant(f: *mut nmod_poly_struct, g: *mut nmod_poly_struct) -> mp_limb_t;
1772    pub fn _nmod_poly_gcdinv(
1773        G: *mut mp_limb_t,
1774        S: *mut mp_limb_t,
1775        A: *const mp_limb_t,
1776        lenA: mp_limb_signed_t,
1777        B: *const mp_limb_t,
1778        lenB: mp_limb_signed_t,
1779        mod_: nmod_t,
1780    ) -> mp_limb_signed_t;
1781    pub fn nmod_poly_gcdinv(
1782        G: *mut nmod_poly_struct,
1783        S: *mut nmod_poly_struct,
1784        A: *mut nmod_poly_struct,
1785        B: *mut nmod_poly_struct,
1786    );
1787    pub fn _nmod_poly_discriminant(
1788        poly: mp_srcptr,
1789        len: mp_limb_signed_t,
1790        mod_: nmod_t,
1791    ) -> mp_limb_t;
1792    pub fn nmod_poly_discriminant(f: *mut nmod_poly_struct) -> mp_limb_t;
1793    pub fn _nmod_poly_invsqrt_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1794    pub fn nmod_poly_invsqrt_series(
1795        g: *mut nmod_poly_struct,
1796        h: *mut nmod_poly_struct,
1797        n: mp_limb_signed_t,
1798    );
1799    pub fn _nmod_poly_sqrt_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1800    pub fn nmod_poly_sqrt_series(
1801        g: *mut nmod_poly_struct,
1802        h: *mut nmod_poly_struct,
1803        n: mp_limb_signed_t,
1804    );
1805    pub fn _nmod_poly_sqrt(s: mp_ptr, p: mp_srcptr, len: mp_limb_signed_t, mod_: nmod_t) -> c_int;
1806    pub fn nmod_poly_sqrt(b: *mut nmod_poly_struct, a: *mut nmod_poly_struct) -> c_int;
1807    pub fn _nmod_poly_power_sums_naive(
1808        res: mp_ptr,
1809        poly: mp_srcptr,
1810        len: mp_limb_signed_t,
1811        n: mp_limb_signed_t,
1812        mod_: nmod_t,
1813    );
1814    pub fn nmod_poly_power_sums_naive(
1815        res: *mut nmod_poly_struct,
1816        poly: *mut nmod_poly_struct,
1817        n: mp_limb_signed_t,
1818    );
1819    pub fn _nmod_poly_power_sums_schoenhage(
1820        res: mp_ptr,
1821        poly: mp_srcptr,
1822        len: mp_limb_signed_t,
1823        n: mp_limb_signed_t,
1824        mod_: nmod_t,
1825    );
1826    pub fn nmod_poly_power_sums_schoenhage(
1827        res: *mut nmod_poly_struct,
1828        poly: *mut nmod_poly_struct,
1829        n: mp_limb_signed_t,
1830    );
1831    pub fn _nmod_poly_power_sums(
1832        res: mp_ptr,
1833        poly: mp_srcptr,
1834        len: mp_limb_signed_t,
1835        n: mp_limb_signed_t,
1836        mod_: nmod_t,
1837    );
1838    pub fn nmod_poly_power_sums(
1839        res: *mut nmod_poly_struct,
1840        poly: *mut nmod_poly_struct,
1841        n: mp_limb_signed_t,
1842    );
1843    pub fn _nmod_poly_power_sums_to_poly_naive(
1844        res: mp_ptr,
1845        poly: mp_srcptr,
1846        len: mp_limb_signed_t,
1847        mod_: nmod_t,
1848    );
1849    pub fn nmod_poly_power_sums_to_poly_naive(res: *mut nmod_poly_struct, Q: *mut nmod_poly_struct);
1850    pub fn _nmod_poly_power_sums_to_poly_schoenhage(
1851        res: mp_ptr,
1852        poly: mp_srcptr,
1853        len: mp_limb_signed_t,
1854        mod_: nmod_t,
1855    );
1856    pub fn nmod_poly_power_sums_to_poly_schoenhage(
1857        res: *mut nmod_poly_struct,
1858        Q: *mut nmod_poly_struct,
1859    );
1860    pub fn _nmod_poly_power_sums_to_poly(
1861        res: mp_ptr,
1862        poly: mp_srcptr,
1863        len: mp_limb_signed_t,
1864        mod_: nmod_t,
1865    );
1866    pub fn nmod_poly_power_sums_to_poly(res: *mut nmod_poly_struct, Q: *mut nmod_poly_struct);
1867    pub fn _nmod_poly_atan_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1868    pub fn nmod_poly_atan_series(
1869        g: *mut nmod_poly_struct,
1870        h: *mut nmod_poly_struct,
1871        n: mp_limb_signed_t,
1872    );
1873    pub fn _nmod_poly_tan_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1874    pub fn nmod_poly_tan_series(
1875        g: *mut nmod_poly_struct,
1876        h: *mut nmod_poly_struct,
1877        n: mp_limb_signed_t,
1878    );
1879    pub fn _nmod_poly_asin_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1880    pub fn nmod_poly_asin_series(
1881        g: *mut nmod_poly_struct,
1882        h: *mut nmod_poly_struct,
1883        n: mp_limb_signed_t,
1884    );
1885    pub fn _nmod_poly_sin_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1886    pub fn nmod_poly_sin_series(
1887        g: *mut nmod_poly_struct,
1888        h: *mut nmod_poly_struct,
1889        n: mp_limb_signed_t,
1890    );
1891    pub fn _nmod_poly_cos_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1892    pub fn nmod_poly_cos_series(
1893        g: *mut nmod_poly_struct,
1894        h: *mut nmod_poly_struct,
1895        n: mp_limb_signed_t,
1896    );
1897    pub fn _nmod_poly_asinh_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1898    pub fn nmod_poly_asinh_series(
1899        g: *mut nmod_poly_struct,
1900        h: *mut nmod_poly_struct,
1901        n: mp_limb_signed_t,
1902    );
1903    pub fn _nmod_poly_atanh_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1904    pub fn nmod_poly_atanh_series(
1905        g: *mut nmod_poly_struct,
1906        h: *mut nmod_poly_struct,
1907        n: mp_limb_signed_t,
1908    );
1909    pub fn _nmod_poly_sinh_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1910    pub fn nmod_poly_sinh_series(
1911        g: *mut nmod_poly_struct,
1912        h: *mut nmod_poly_struct,
1913        n: mp_limb_signed_t,
1914    );
1915    pub fn _nmod_poly_cosh_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1916    pub fn nmod_poly_cosh_series(
1917        g: *mut nmod_poly_struct,
1918        h: *mut nmod_poly_struct,
1919        n: mp_limb_signed_t,
1920    );
1921    pub fn _nmod_poly_tanh_series(g: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1922    pub fn nmod_poly_tanh_series(
1923        g: *mut nmod_poly_struct,
1924        h: *mut nmod_poly_struct,
1925        n: mp_limb_signed_t,
1926    );
1927    pub fn _nmod_poly_log_series_monomial_ui(
1928        res: mp_ptr,
1929        coeff: mp_limb_t,
1930        power: mp_limb_t,
1931        n: mp_limb_signed_t,
1932        mod_: nmod_t,
1933    );
1934    pub fn nmod_poly_log_series_monomial_ui(
1935        res: *mut nmod_poly_struct,
1936        coeff: mp_limb_t,
1937        power: mp_limb_t,
1938        n: mp_limb_signed_t,
1939    );
1940    pub fn _nmod_poly_log_series(
1941        res: mp_ptr,
1942        f: mp_srcptr,
1943        flen: mp_limb_signed_t,
1944        n: mp_limb_signed_t,
1945        mod_: nmod_t,
1946    );
1947    pub fn nmod_poly_log_series(
1948        res: *mut nmod_poly_struct,
1949        f: *mut nmod_poly_struct,
1950        n: mp_limb_signed_t,
1951    );
1952    pub fn _nmod_poly_exp_series_monomial_ui(
1953        res: mp_ptr,
1954        coeff: mp_limb_t,
1955        power: mp_limb_t,
1956        n: mp_limb_signed_t,
1957        mod_: nmod_t,
1958    );
1959    pub fn nmod_poly_exp_series_monomial_ui(
1960        res: *mut nmod_poly_struct,
1961        coeff: mp_limb_t,
1962        power: mp_limb_t,
1963        n: mp_limb_signed_t,
1964    );
1965    pub fn _nmod_poly_exp_series_basecase(
1966        f: mp_ptr,
1967        h: mp_srcptr,
1968        hlen: mp_limb_signed_t,
1969        n: mp_limb_signed_t,
1970        mod_: nmod_t,
1971    );
1972    pub fn nmod_poly_exp_series_basecase(
1973        f: *mut nmod_poly_struct,
1974        h: *mut nmod_poly_struct,
1975        n: mp_limb_signed_t,
1976    );
1977    pub fn _nmod_poly_exp_expinv_series(
1978        f: mp_ptr,
1979        g: mp_ptr,
1980        h: mp_srcptr,
1981        n: mp_limb_signed_t,
1982        mod_: nmod_t,
1983    );
1984    pub fn _nmod_poly_exp_series(f: mp_ptr, h: mp_srcptr, n: mp_limb_signed_t, mod_: nmod_t);
1985    pub fn _nmod_poly_exp_series2(
1986        f: mp_ptr,
1987        h: mp_srcptr,
1988        hlen: mp_limb_signed_t,
1989        n: mp_limb_signed_t,
1990        mod_: nmod_t,
1991    );
1992    pub fn nmod_poly_exp_series(
1993        f: *mut nmod_poly_struct,
1994        h: *mut nmod_poly_struct,
1995        n: mp_limb_signed_t,
1996    );
1997    pub fn nmod_poly_product_roots_nmod_vec(
1998        poly: *mut nmod_poly_struct,
1999        xs: mp_srcptr,
2000        n: mp_limb_signed_t,
2001    );
2002    pub fn _nmod_poly_product_roots_nmod_vec(
2003        poly: mp_ptr,
2004        xs: mp_srcptr,
2005        n: mp_limb_signed_t,
2006        mod_: nmod_t,
2007    );
2008    pub fn _nmod_poly_split_rabin(
2009        a: *mut nmod_poly_struct,
2010        b: *mut nmod_poly_struct,
2011        f: *mut nmod_poly_struct,
2012        t: *mut nmod_poly_struct,
2013        t2: *mut nmod_poly_struct,
2014        randstate: *mut flint_rand_s,
2015    );
2016    pub fn nmod_poly_find_distinct_nonzero_roots(
2017        roots: *mut mp_limb_t,
2018        P: *mut nmod_poly_struct,
2019    ) -> c_int;
2020    pub fn nmod_poly_multi_crt_init(CRT: *mut nmod_poly_multi_crt_struct);
2021    pub fn nmod_poly_multi_crt_precompute(
2022        CRT: *mut nmod_poly_multi_crt_struct,
2023        moduli: *const nmod_poly_struct,
2024        len: mp_limb_signed_t,
2025    ) -> c_int;
2026    pub fn nmod_poly_multi_crt_precompute_p(
2027        CRT: *mut nmod_poly_multi_crt_struct,
2028        moduli: *const *const nmod_poly_struct,
2029        len: mp_limb_signed_t,
2030    ) -> c_int;
2031    pub fn nmod_poly_multi_crt_precomp(
2032        output: *mut nmod_poly_struct,
2033        CRT: *mut nmod_poly_multi_crt_struct,
2034        values: *const nmod_poly_struct,
2035    );
2036    pub fn nmod_poly_multi_crt_precomp_p(
2037        output: *mut nmod_poly_struct,
2038        CRT: *mut nmod_poly_multi_crt_struct,
2039        values: *const *const nmod_poly_struct,
2040    );
2041    pub fn nmod_poly_multi_crt(
2042        output: *mut nmod_poly_struct,
2043        moduli: *const nmod_poly_struct,
2044        values: *const nmod_poly_struct,
2045        len: mp_limb_signed_t,
2046    ) -> c_int;
2047    pub fn nmod_poly_multi_crt_clear(CRT: *mut nmod_poly_multi_crt_struct);
2048    pub fn _nmod_poly_multi_crt_local_size(
2049        CRT: *mut nmod_poly_multi_crt_struct,
2050    ) -> mp_limb_signed_t;
2051    pub fn _nmod_poly_multi_crt_run(
2052        outputs: *mut nmod_poly_struct,
2053        CRT: *mut nmod_poly_multi_crt_struct,
2054        inputs: *const nmod_poly_struct,
2055    );
2056    pub fn _nmod_poly_multi_crt_run_p(
2057        outputs: *mut nmod_poly_struct,
2058        CRT: *mut nmod_poly_multi_crt_struct,
2059        inputs: *const *const nmod_poly_struct,
2060    );
2061    pub fn nmod_poly_deflation(input: *mut nmod_poly_struct) -> mp_limb_t;
2062    pub fn nmod_poly_deflate(
2063        result: *mut nmod_poly_struct,
2064        input: *mut nmod_poly_struct,
2065        deflation: mp_limb_t,
2066    );
2067    pub fn nmod_poly_inflate(
2068        result: *mut nmod_poly_struct,
2069        input: *mut nmod_poly_struct,
2070        inflation: mp_limb_t,
2071    );
2072    pub fn nmod_mat_charpoly_danilevsky(p: *mut nmod_poly_struct, M: *mut nmod_mat_struct);
2073    pub fn nmod_mat_charpoly(p: *mut nmod_poly_struct, M: *mut nmod_mat_struct);
2074    pub fn nmod_mat_minpoly_with_gens(
2075        p: *mut nmod_poly_struct,
2076        X: *mut nmod_mat_struct,
2077        P: *mut mp_limb_t,
2078    );
2079    pub fn nmod_mat_minpoly(p: *mut nmod_poly_struct, M: *mut nmod_mat_struct);
2080    pub fn nmod_berlekamp_massey_init(B: *mut nmod_berlekamp_massey_struct, p: mp_limb_t);
2081    pub fn nmod_berlekamp_massey_start_over(B: *mut nmod_berlekamp_massey_struct);
2082    pub fn nmod_berlekamp_massey_clear(B: *mut nmod_berlekamp_massey_struct);
2083    pub fn nmod_berlekamp_massey_set_prime(B: *mut nmod_berlekamp_massey_struct, p: mp_limb_t);
2084    pub fn nmod_berlekamp_massey_print(B: *mut nmod_berlekamp_massey_struct);
2085    pub fn nmod_berlekamp_massey_add_points(
2086        B: *mut nmod_berlekamp_massey_struct,
2087        a: *const mp_limb_t,
2088        count: mp_limb_signed_t,
2089    );
2090    pub fn nmod_berlekamp_massey_add_zeros(
2091        B: *mut nmod_berlekamp_massey_struct,
2092        count: mp_limb_signed_t,
2093    );
2094    pub fn nmod_berlekamp_massey_add_point(B: *mut nmod_berlekamp_massey_struct, a: mp_limb_t);
2095    pub fn nmod_berlekamp_massey_reduce(B: *mut nmod_berlekamp_massey_struct) -> c_int;
2096    pub fn nmod_berlekamp_massey_points(B: *mut nmod_berlekamp_massey_struct) -> *const mp_limb_t;
2097    pub fn nmod_berlekamp_massey_point_count(
2098        B: *mut nmod_berlekamp_massey_struct,
2099    ) -> mp_limb_signed_t;
2100    pub fn nmod_berlekamp_massey_V_poly(
2101        B: *mut nmod_berlekamp_massey_struct,
2102    ) -> *const nmod_poly_struct;
2103    pub fn nmod_berlekamp_massey_R_poly(
2104        B: *mut nmod_berlekamp_massey_struct,
2105    ) -> *const nmod_poly_struct;
2106}