use super::super::MatQ;
use crate::traits::MatrixDimensions;
use flint3_sys::fmpq_mat_neg;
use std::ops::Neg;
impl Neg for MatQ {
type Output = MatQ;
fn neg(mut self) -> Self::Output {
unsafe { fmpq_mat_neg(&mut self.matrix, &self.matrix) };
self
}
}
impl Neg for &MatQ {
type Output = MatQ;
fn neg(self) -> Self::Output {
let mut out = MatQ::new(self.get_num_rows(), self.get_num_columns());
unsafe { fmpq_mat_neg(&mut out.matrix, &self.matrix) };
out
}
}
#[cfg(test)]
mod test_neg {
use super::MatQ;
use std::str::FromStr;
#[test]
fn correct_small() {
let a = MatQ::from_str("[[1/2, -2, 0],[3, 4/7, -5]]").unwrap();
let b = MatQ::from_str("[[-1/2, 2, 0],[-3, -4/7, 5]]").unwrap();
let c = MatQ::new(2, 3);
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 = MatQ::from_str(&format!("[[{}, 1/{}],[1, 2]]", u64::MAX, i64::MAX)).unwrap();
let b = MatQ::from_str(&format!("[[-{}, -1/{}],[-1, -2]]", u64::MAX, i64::MAX)).unwrap();
assert_eq!(a, -(-&a));
assert_eq!(b, -&a);
assert_eq!(b, -a);
}
}