use super::Factorization;
use flint_sys::fmpz_factor::fmpz_factor_refine;
impl Factorization {
pub fn refine(&mut self) {
unsafe { fmpz_factor_refine(&mut self.factors, &self.factors) }
}
}
#[cfg(test)]
mod test_refine {
use super::Factorization;
#[test]
fn refine_correct() {
let mut fac = Factorization::from((3, 6));
fac.refine();
assert_eq!("[(2, 1), (3, 2)]", fac.to_string());
}
#[test]
fn refine_correct_large() {
let mut fac = Factorization::from((i64::MAX - 1, 2));
fac.refine();
assert_eq!(
format!("[(2, 2), ({}, 1)]", (i64::MAX - 1) / 2),
fac.to_string()
);
}
#[test]
fn refine_correct_negative() {
let mut fac = Factorization::from((-1200, 20));
fac.refine();
assert_eq!("[(-1, 1), (3, 1), (20, 3)]", fac.to_string());
}
#[test]
fn refine_correct_order() {
let mut fac_1 = Factorization::from((8, 3));
let mut fac_2 = Factorization::from((i64::MAX - 1, 2));
fac_1.refine();
fac_2.refine();
assert_eq!("[(3, 1), (8, 1)]", fac_1.to_string());
assert_eq!(
format!("[(2, 2), ({}, 1)]", (i64::MAX - 1) / 2),
fac_2.to_string()
);
}
#[test]
fn refine_correct_one() {
let mut fac = Factorization::from(1);
fac.refine();
assert_eq!("[(1, 1)]", fac.to_string());
}
#[test]
fn refine_correct_minus_one() {
let mut fac = Factorization::from(-1);
fac.refine();
assert_eq!("[(-1, 1)]", fac.to_string());
}
#[test]
fn refine_correct_zero() {
let mut fac = Factorization::from(0);
fac.refine();
assert_eq!("[]", fac.to_string());
}
}