use super::ffi;
pub struct FlintNmodPoly {
inner: ffi::NmodPolyStruct,
}
unsafe impl Send for FlintNmodPoly {}
unsafe impl Sync for FlintNmodPoly {}
#[allow(dead_code)]
impl FlintNmodPoly {
pub fn new(modulus: u64) -> Self {
let mut inner: ffi::NmodPolyStruct = unsafe { std::mem::zeroed() };
unsafe { ffi::nmod_poly_init(&mut inner, modulus) };
Self { inner }
}
pub fn set_coeff(&mut self, i: usize, c: u64) {
unsafe { ffi::nmod_poly_set_coeff_ui(&mut self.inner, i as ffi::slong, c) };
}
pub fn degree(&self) -> i64 {
unsafe { ffi::nmod_poly_degree(&self.inner) }
}
pub fn get_coeff(&self, j: i64) -> u64 {
unsafe { ffi::nmod_poly_get_coeff_ui(&self.inner, j) }
}
pub fn modulus(&self) -> u64 {
self.inner.mod_.n
}
pub(super) fn as_ptr(&self) -> *const ffi::NmodPolyStruct {
&self.inner
}
pub(super) fn as_mut_ptr(&mut self) -> *mut ffi::NmodPolyStruct {
&mut self.inner
}
}
impl Drop for FlintNmodPoly {
fn drop(&mut self) {
unsafe { ffi::nmod_poly_clear(&mut self.inner) };
}
}
pub struct FlintNmodPolyFactor {
inner: ffi::NmodPolyFactorStruct,
}
unsafe impl Send for FlintNmodPolyFactor {}
unsafe impl Sync for FlintNmodPolyFactor {}
impl FlintNmodPolyFactor {
pub fn new() -> Self {
let mut inner = std::mem::MaybeUninit::<ffi::NmodPolyFactorStruct>::uninit();
unsafe { ffi::nmod_poly_factor_init(inner.as_mut_ptr()) };
Self {
inner: unsafe { inner.assume_init() },
}
}
pub fn factor(&mut self, poly: &FlintNmodPoly) -> u64 {
unsafe { ffi::nmod_poly_factor(&mut self.inner, poly.as_ptr()) }
}
pub fn len(&self) -> usize {
self.inner.num.max(0) as usize
}
pub fn exp_at(&self, i: usize) -> u32 {
debug_assert!(i < self.len());
unsafe { *self.inner.exp.add(i) as u32 }
}
pub fn poly_at(&self, modulus: u64, i: usize) -> FlintNmodPoly {
debug_assert!(i < self.len());
let mut z = FlintNmodPoly::new(modulus);
unsafe {
#[cfg(not(flint3))]
ffi::nmod_poly_factor_get_nmod_poly(
z.as_mut_ptr(),
&self.inner as *const ffi::NmodPolyFactorStruct as *mut _,
i as ffi::slong,
);
#[cfg(flint3)]
ffi::nmod_poly_factor_get_poly(z.as_mut_ptr(), &self.inner, i as ffi::slong);
}
z
}
}
impl Default for FlintNmodPolyFactor {
fn default() -> Self {
Self::new()
}
}
impl Drop for FlintNmodPolyFactor {
fn drop(&mut self) {
unsafe { ffi::nmod_poly_factor_clear(&mut self.inner) };
}
}