flint_sys/
lib.rs

1//! Bindings for the [FLINT](http://flintlib.org/sphinx/index.html) library.
2
3pub mod deps;
4pub mod flint;
5
6pub mod mpoly;
7pub mod perm;
8
9pub mod arith;
10pub mod fft;
11pub mod fmpz;
12pub mod fmpz_factor;
13pub mod fmpz_lll;
14pub mod fmpz_mat;
15pub mod fmpz_mpoly;
16pub mod fmpz_mpoly_factor;
17pub mod fmpz_poly;
18pub mod fmpz_poly_factor;
19pub mod fmpz_poly_mat;
20pub mod fmpz_vec;
21pub mod long_extras;
22pub mod qsieve;
23pub mod ulong_extras;
24
25pub mod fmpq;
26pub mod fmpq_mat;
27pub mod fmpq_mpoly;
28pub mod fmpq_mpoly_factor;
29pub mod fmpq_poly;
30pub mod fmpq_vec;
31pub mod fmpz_poly_q;
32
33pub mod fmpz_mod;
34pub mod fmpz_mod_mat;
35pub mod fmpz_mod_mpoly;
36pub mod fmpz_mod_mpoly_factor;
37pub mod fmpz_mod_poly;
38pub mod fmpz_mod_poly_factor;
39pub mod fmpz_mod_vec;
40pub mod n_poly;
41pub mod nmod_mat;
42pub mod nmod_mpoly;
43pub mod nmod_mpoly_factor;
44pub mod nmod_poly;
45pub mod nmod_poly_factor;
46pub mod nmod_poly_mat;
47pub mod nmod_vec;
48
49pub mod fq;
50pub mod fq_default;
51pub mod fq_default_mat;
52pub mod fq_default_poly;
53pub mod fq_default_poly_factor;
54pub mod fq_embed;
55pub mod fq_mat;
56pub mod fq_nmod;
57pub mod fq_nmod_embed;
58pub mod fq_nmod_mat;
59pub mod fq_nmod_mpoly;
60pub mod fq_nmod_mpoly_factor;
61pub mod fq_nmod_poly;
62pub mod fq_nmod_poly_factor;
63pub mod fq_nmod_vec;
64pub mod fq_poly;
65pub mod fq_poly_factor;
66pub mod fq_vec;
67pub mod fq_zech;
68pub mod fq_zech_embed;
69pub mod fq_zech_mat;
70pub mod fq_zech_mpoly;
71pub mod fq_zech_mpoly_factor;
72pub mod fq_zech_poly;
73pub mod fq_zech_poly_factor;
74pub mod fq_zech_vec;
75
76pub mod padic;
77pub mod padic_mat;
78pub mod padic_poly;
79pub mod qadic;
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84    use std::mem::MaybeUninit;
85
86    #[test]
87    fn try_it() {
88        let mut p: fmpz::fmpz = fmpz::fmpz::default();
89        let mut ctx = MaybeUninit::uninit();
90        unsafe {
91            fmpz::fmpz_init(&mut p);
92            fmpz::fmpz_set_ui(&mut p, 17);
93            debug_assert!(fmpz::fmpz_print(&mut p) > 0);
94            let mut f = MaybeUninit::uninit();
95            fmpz_mod::fmpz_mod_ctx_init(ctx.as_mut_ptr(), &p);
96            let mut ctx = ctx.assume_init();
97            fmpz_mod_poly::fmpz_mod_poly_init(f.as_mut_ptr(), &mut ctx);
98            let mut f = f.assume_init();
99            fmpz_mod_poly::fmpz_mod_poly_set_coeff_ui(&mut f, 1, 5, &mut ctx);
100            fmpz_mod_poly::fmpz_mod_poly_set_coeff_ui(&mut f, 0, 5, &mut ctx);
101            let x = std::ffi::CString::new("x").unwrap();
102            debug_assert!(
103                fmpz_mod_poly::fmpz_mod_poly_print_pretty(&mut f, x.as_ptr(), &mut ctx) > 0
104            );
105            fmpz_mod_poly::fmpz_mod_poly_clear(&mut f, &mut ctx);
106            fmpz_mod::fmpz_mod_ctx_clear(&mut ctx);
107            fmpz::fmpz_clear(&mut p);
108        }
109    }
110
111    /*
112    mod random {
113        use crate::*;
114        use gmp_mpfr_sys::gmp;
115        use quickcheck_macros;
116        use std::mem::MaybeUninit;
117
118        #[quickcheck_macros::quickcheck]
119        fn mult_same_as_gmp(v: u64, u: u64) -> bool {
120            unsafe {
121                let mut g_v = MaybeUninit::uninit();
122                gmp::mpz_init(g_v.as_mut_ptr());
123                let mut g_v = g_v.assume_init();
124                gmp::mpz_set_ui(&mut g_v, v);
125
126                let mut g_u = MaybeUninit::uninit();
127                gmp::mpz_init(g_u.as_mut_ptr());
128                let mut g_u = g_u.assume_init();
129                gmp::mpz_set_ui(&mut g_u, u);
130
131                let mut f_u = fmpz::fmpz::default();
132                fmpz::fmpz_init(&mut f_u);
133                fmpz::fmpz_set_ui(&mut f_u, u);
134
135                let mut f_v = fmpz::fmpz::default();
136                fmpz::fmpz_init(&mut f_v);
137                fmpz::fmpz_set_ui(&mut f_v, v);
138
139                gmp::mpz_mul(&mut g_v, &g_v, &g_u);
140                fmpz::fmpz_mul(&mut f_v, &f_v, &f_u);
141                let f_as_g = fmpz::_fmpz_promote_val(&mut f_v);
142                let eq = gmp::mpz_cmp(flint_to_gmp::mpz_srcptr(f_as_g), &g_v) == 0;
143
144                gmp::mpz_clear(&mut g_v);
145                gmp::mpz_clear(&mut g_u);
146                gmp::mpz_clear(flint_to_gmp::mpz_ptr(f_as_g));
147                fmpz::_fmpz_demote_val(&mut f_v);
148                fmpz::fmpz_clear(&mut f_u);
149                fmpz::fmpz_clear(&mut f_v);
150                eq
151            }
152        }
153        pub mod flint_to_gmp {
154            /// Safe because [gmp_mpfr_sys::gmp::mpz_t] and [flint_sys::deps::__mpz_struct] have identical
155            /// layouts.
156            pub fn mpz_srcptr(
157                p: *const super::deps::__mpz_struct
158            ) ->
159                *const gmp_mpfr_sys::gmp::mpz_t
160            {
161                unsafe { &std::mem::transmute(*p) }
162            }
163
164            /// Safe because [gmp_mpfr_sys::gmp::mpz_t] and [flint_sys::deps::mp_srcptr] have identical
165            /// layouts.
166            pub fn mpz_ptr(
167                p: *mut super::deps::__mpz_struct
168                ) ->
169                *mut gmp_mpfr_sys::gmp::mpz_t
170            {
171                unsafe { &mut std::mem::transmute(*p) }
172            }
173        }
174    }*/
175}