use crate::integer::Integer;
use crate::integer_polynomial::IntegerPolynomial;
use crate::test_util::integer_polynomial::arithmetic::mul::mul_naive;
use malachite_base::num::arithmetic::traits::{AddMulAssign, DivExactAssign, Pow, SubMulAssign};
use malachite_base::num::basic::traits::Zero;
use malachite_base::num::conversion::traits::ExactFrom;
use malachite_base::polynomial::Polynomial;
pub fn pow_naive(p: &IntegerPolynomial, e: u64) -> IntegerPolynomial {
let mut power = IntegerPolynomial::one();
for _ in 0..e {
power = mul_naive(&power, p);
}
power
}
pub fn pow_to_out_multinomial_flint(out: &mut [Integer], xs: &[Integer], e: u64) {
let len = xs.len();
let mut d = Integer::ZERO;
out[0] = (&xs[0]).pow(e);
for k in 1..out.len() {
let mut sum = Integer::ZERO;
let mut u = -i128::exact_from(k);
for i in 1..=k.min(len - 1) {
let t = &xs[i] * &out[k - i];
u += i128::from(e) + 1;
if u >= 0 {
sum.add_mul_assign(&t, Integer::from(u));
} else {
sum.sub_mul_assign(&t, Integer::from(-u));
}
}
d += &xs[0];
sum.div_exact_assign(&d);
out[k] = sum;
}
}