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}