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*/