Skip to main content

flint_sys/
lib.rs

1#![allow(non_camel_case_types)]
2#![allow(non_snake_case)]
3#![allow(non_upper_case_globals)]
4//#![allow(unused_imports)] // remove
5
6//! Bindings for the [FLINT](https://flintlib.org/doc/#) library.
7
8pub mod bindgen;
9pub mod deps;
10
11include!("__mod_statements.rs");
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16    use std::mem::MaybeUninit;
17    
18    #[test]
19    fn test_fmpz() { 
20        let mut p: flint::fmpz = flint::fmpz::default();
21        unsafe{
22            fmpz::fmpz_init(&mut p);
23            fmpz::fmpz_set_ui(&mut p, 17);
24            debug_assert!(fmpz::fmpz_print(&mut p) > 0);            
25            fmpz::fmpz_clear(&mut p);
26        }
27    }
28
29    // Checks the norm of the element 2*x^2 - 1 of Q(x)/f where f = x^4 + 1
30    #[test]
31    fn test_antic() {
32        let mut a = MaybeUninit::uninit();
33        let mut b = MaybeUninit::uninit();
34        let mut res = MaybeUninit::uninit();
35        let mut pol = MaybeUninit::uninit();
36
37        let mut x = MaybeUninit::uninit();
38        let mut nf = MaybeUninit::uninit();
39        
40        unsafe {
41            fmpz::fmpz_init_set_si(a.as_mut_ptr(), -1);
42            let mut a = a.assume_init();
43            fmpz::fmpz_init_set_si(b.as_mut_ptr(), 2);
44            let mut b = b.assume_init();
45
46            fmpq_poly::fmpq_poly_init(pol.as_mut_ptr());
47            let mut pol = pol.assume_init();
48
49            fmpq_poly::fmpq_poly_set_coeff_ui(&mut pol, 0, 1);
50            fmpq_poly::fmpq_poly_set_coeff_ui(&mut pol, 4, 1);
51
52            nf::nf_init(nf.as_mut_ptr(), &pol);
53            let mut nf = nf.assume_init();
54
55            nf_elem::nf_elem_init(x.as_mut_ptr(), &nf);
56            let mut x = x.assume_init();
57        
58            nf_elem::_nf_elem_set_coeff_num_fmpz(&mut x, 0, &a, &nf);
59            nf_elem::_nf_elem_set_coeff_num_fmpz(&mut x, 2, &b, &nf);
60
61            fmpq::fmpq_init(res.as_mut_ptr());
62            let mut res = res.assume_init();
63            nf_elem::nf_elem_norm(&mut res, &x, &nf);
64
65            assert!(fmpq::fmpq_equal_ui(&mut res, 25) != 0);
66            println!("Success!");
67
68            fmpz::fmpz_clear(&mut a);
69            fmpz::fmpz_clear(&mut b);
70            fmpq::fmpq_clear(&mut res);
71            fmpq_poly::fmpq_poly_clear(&mut pol);
72            nf_elem::nf_elem_clear(&mut x, &nf);
73            nf::nf_clear(&mut nf);
74        }
75    }
76}
77
78/*
79#[cfg(test)]
80mod tests {
81    use super::*;
82    use std::mem::MaybeUninit;
83    
84    #[test]
85    fn test_fmpz() {
86        let mut p: fmpz::fmpz = fmpz::fmpz::default();
87        unsafe{
88            fmpz::fmpz_init(&mut p);
89            fmpz::fmpz_set_ui(&mut p, 17);
90            debug_assert!(fmpz::fmpz_print(&mut p) > 0);            
91            fmpz::fmpz_clear(&mut p);
92        }
93    }
94
95    /*
96    #[test]
97    fn test_fmpz_mod_poly() {
98        let mut p: fmpz::fmpz = fmpz::fmpz::default();
99        let mut ctx = MaybeUninit::uninit();
100        unsafe {
101            fmpz::fmpz_init(&mut p);
102            fmpz::fmpz_set_ui(&mut p, 17);
103            debug_assert!(fmpz::fmpz_print(&mut p) > 0);
104            let mut f = MaybeUninit::uninit();
105            fmpz_mod::fmpz_mod_ctx_init(ctx.as_mut_ptr(), &p);
106            let mut ctx = ctx.assume_init();
107            fmpz_mod_poly::fmpz_mod_poly_init(f.as_mut_ptr(), &mut ctx);
108            let mut f = f.assume_init();
109            fmpz_mod_poly::fmpz_mod_poly_set_coeff_ui(&mut f, 1, 5, &mut ctx);
110            fmpz_mod_poly::fmpz_mod_poly_set_coeff_ui(&mut f, 0, 5, &mut ctx);
111            let x = std::ffi::CString::new("x").unwrap();
112            debug_assert!(
113                fmpz_mod_poly::fmpz_mod_poly_print_pretty(&mut f, x.as_ptr(), &mut ctx) > 0
114            );
115            fmpz_mod_poly::fmpz_mod_poly_clear(&mut f, &mut ctx);
116            fmpz_mod::fmpz_mod_ctx_clear(&mut ctx);
117            fmpz::fmpz_clear(&mut p);
118        }
119    }*/
120
121    
122
123    /*
124    mod random {
125        use crate::*;
126        use gmp_mpfr_sys::gmp;
127        use quickcheck_macros;
128        use std::mem::MaybeUninit;
129
130        #[quickcheck_macros::quickcheck]
131        fn mult_same_as_gmp(v: u64, u: u64) -> bool {
132            unsafe {
133                let mut g_v = MaybeUninit::uninit();
134                gmp::mpz_init(g_v.as_mut_ptr());
135                let mut g_v = g_v.assume_init();
136                gmp::mpz_set_ui(&mut g_v, v);
137
138                let mut g_u = MaybeUninit::uninit();
139                gmp::mpz_init(g_u.as_mut_ptr());
140                let mut g_u = g_u.assume_init();
141                gmp::mpz_set_ui(&mut g_u, u);
142
143                let mut f_u = fmpz::fmpz::default();
144                fmpz::fmpz_init(&mut f_u);
145                fmpz::fmpz_set_ui(&mut f_u, u);
146
147                let mut f_v = fmpz::fmpz::default();
148                fmpz::fmpz_init(&mut f_v);
149                fmpz::fmpz_set_ui(&mut f_v, v);
150
151                gmp::mpz_mul(&mut g_v, &g_v, &g_u);
152                fmpz::fmpz_mul(&mut f_v, &f_v, &f_u);
153                let f_as_g = fmpz::_fmpz_promote_val(&mut f_v);
154                let eq = gmp::mpz_cmp(flint_to_gmp::mpz_srcptr(f_as_g), &g_v) == 0;
155
156                gmp::mpz_clear(&mut g_v);
157                gmp::mpz_clear(&mut g_u);
158                gmp::mpz_clear(flint_to_gmp::mpz_ptr(f_as_g));
159                fmpz::_fmpz_demote_val(&mut f_v);
160                fmpz::fmpz_clear(&mut f_u);
161                fmpz::fmpz_clear(&mut f_v);
162                eq
163            }
164        }
165        pub mod flint_to_gmp {
166            /// Safe because [gmp_mpfr_sys::gmp::mpz_t] and [flint_sys::deps::__mpz_struct] have identical
167            /// layouts.
168            pub fn mpz_srcptr(
169                p: *const super::deps::__mpz_struct
170            ) ->
171                *const gmp_mpfr_sys::gmp::mpz_t
172            {
173                unsafe { &std::mem::transmute(*p) }
174            }
175
176            /// Safe because [gmp_mpfr_sys::gmp::mpz_t] and [flint_sys::deps::mp_srcptr] have identical
177            /// layouts.
178            pub fn mpz_ptr(
179                p: *mut super::deps::__mpz_struct
180                ) ->
181                *mut gmp_mpfr_sys::gmp::mpz_t
182            {
183                unsafe { &mut std::mem::transmute(*p) }
184            }
185        }
186    }*/
187}
188*/