use crate::integer::Integer;
use crate::natural::Natural;
use crate::test_util::natural::arithmetic::crt::crt_simple;
use malachite_base::num::arithmetic::traits::{Mod, UnsignedAbs};
use malachite_base::num::conversion::traits::ExactFrom;
pub fn balanced_crt_simple(r1: Integer, m1: Natural, r2: Natural, m2: Natural) -> Option<Integer> {
let m = &m1 * &m2;
let r1n = Natural::exact_from(r1.mod_op(Integer::from(&m1)));
let x = crt_simple(r1n, m1, r2, m2)?;
Some(if &x << 1u32 > m {
Integer::from(x) - Integer::from(m)
} else {
Integer::from(x)
})
}
pub fn balanced_to_canonical(x: &Integer, m: &Natural) -> Natural {
if *x < 0u32 {
m - x.unsigned_abs_ref()
} else {
x.unsigned_abs()
}
}