use crate::integer::Integer;
use crate::integer_polynomial::IntegerPolynomial;
use core::cmp::Ordering::{self, *};
use malachite_base::num::basic::traits::Zero;
use malachite_base::num::logic::traits::SignificantBits;
pub fn integer_polynomial_evaluate(p: &IntegerPolynomial, x: &Integer) -> Integer {
let mut sum = Integer::ZERO;
for c in p.coefficients_asc().iter().rev() {
sum *= x;
sum += c;
}
sum
}
pub fn integer_polynomial_cmp_evaluated(p: &IntegerPolynomial, q: &IntegerPolynomial) -> Ordering {
let bound = Integer::from(4u32)
<< p.coefficients_asc()
.iter()
.chain(q.coefficients_asc().iter())
.map(SignificantBits::significant_bits)
.max()
.unwrap_or(0);
integer_polynomial_evaluate(p, &bound).cmp(&integer_polynomial_evaluate(q, &bound))
}
pub fn integer_polynomial_shortlex_cmp_naive(
p: &IntegerPolynomial,
q: &IntegerPolynomial,
) -> Ordering {
let xs = p.coefficients_asc();
let ys = q.coefficients_asc();
let c = xs.len().cmp(&ys.len());
if c != Equal {
return c;
}
for i in (0..xs.len()).rev() {
let c = xs[i].cmp(&ys[i]);
if c != Equal {
return c;
}
}
Equal
}