use crate::legendre::LEGENDRE_TABLES;
use malachite::base::num::arithmetic::traits::{CeilingSqrt, FloorSqrt, Square};
use malachite::base::num::conversion::traits::WrappingFrom;
use malachite::Integer;
pub fn sqrt_exact(n: &Integer) -> (bool, Integer) {
let root = n.floor_sqrt();
let is_square = root.clone().square() == *n;
(is_square, root)
}
pub fn sqrt_ceil(n: &Integer) -> Integer {
n.ceiling_sqrt()
}
pub fn is_probably_square(n: &Integer) -> bool {
for &(p, table) in LEGENDRE_TABLES {
let r = u64::wrapping_from(&(n % Integer::from(p))) as usize;
if table[r] == -1 {
return false;
}
}
true
}