use super::super::PolyOverQ;
use flint3_sys::fmpq_poly_neg;
use std::ops::Neg;
impl Neg for PolyOverQ {
type Output = PolyOverQ;
fn neg(mut self) -> Self::Output {
unsafe { fmpq_poly_neg(&mut self.poly, &self.poly) };
self
}
}
impl Neg for &PolyOverQ {
type Output = PolyOverQ;
fn neg(self) -> Self::Output {
let mut out = PolyOverQ::default();
unsafe { fmpq_poly_neg(&mut out.poly, &self.poly) };
out
}
}
#[cfg(test)]
mod test_neg {
use super::PolyOverQ;
use std::str::FromStr;
#[test]
fn correct_small() {
let a = PolyOverQ::from_str("4 1/2 -2 0 3/7").unwrap();
let b = PolyOverQ::from_str("4 -1/2 2 0 -3/7").unwrap();
let c = PolyOverQ::default();
assert_eq!(a, -(-&a));
assert_eq!(a, -&b);
assert_eq!(b, -&a);
assert_eq!(a, -b.clone());
assert_eq!(b, -a);
assert_eq!(c, -&c);
assert_eq!(c.clone(), -c);
}
#[test]
fn correct_large() {
let a = PolyOverQ::from_str(&format!("3 {} 0 1/{}", u64::MAX, i64::MAX)).unwrap();
let b = PolyOverQ::from_str(&format!("3 -{} 0 -1/{}", u64::MAX, i64::MAX)).unwrap();
assert_eq!(a, -(-&a));
assert_eq!(b, -&a);
assert_eq!(b, -a);
}
}