use crate::Rational;
use crate::gaussian_rational::GaussianRational;
use malachite_base::num::arithmetic::traits::{DivExact, Lcm, UnsignedAbs};
use malachite_base::num::basic::traits::Zero;
use malachite_nz::gaussian_integer::GaussianInteger;
use malachite_nz::integer::Integer;
use malachite_nz::test_util::gaussian_integer::arithmetic::sqrt::*;
pub fn gaussian_rational_checked_sqrt_naive(z: &GaussianRational) -> Option<GaussianRational> {
if *z == 0u32 {
return Some(GaussianRational::ZERO);
}
let l = Integer::from(z.real.denominator_ref().lcm(z.imaginary.denominator_ref()));
let l_squared = (&l) * (&l);
let scaled = GaussianInteger {
real: Integer::from_sign_and_abs(
z.real >= 0u32,
z.real.numerator_ref()
* (&l_squared)
.div_exact(Integer::from(z.real.denominator_ref()))
.unsigned_abs(),
),
imaginary: Integer::from_sign_and_abs(
z.imaginary >= 0u32,
z.imaginary.numerator_ref()
* (&l_squared)
.div_exact(Integer::from(z.imaginary.denominator_ref()))
.unsigned_abs(),
),
};
let root = gaussian_integer_checked_sqrt_naive(&scaled)?;
Some(GaussianRational {
real: Rational::from_integers_ref(&root.real, &l),
imaginary: Rational::from_integers(root.imaginary, l),
})
}