use crate::integer_polynomial::arithmetic::coefficient::PolynomialCoefficient;
use malachite_base::num::arithmetic::traits::Parity;
use malachite_base::num::conversion::traits::ExactFrom;
crate_test_fn! {pow_to_out_binomial<C: PolynomialCoefficient>(out: &mut [C], xs: &[C], e: u64) {
let mut a = C::ONE;
let mut b = C::ONE;
let mut c = C::ONE;
out[0] = C::ONE;
out[usize::exact_from(e)] = C::ONE;
let mut i = 1;
while i <= (e - 1) >> 1 {
let f = e - i;
a *= &xs[0];
b *= &xs[1];
c *= &C::from(f + 1);
c.div_exact_assign(&C::from(i));
out[usize::exact_from(i)] = b.mul_ref(&c);
out[usize::exact_from(f)] = a.mul_ref(&c);
i += 1;
}
if e.even() {
let f = e - i;
a *= &xs[0];
b *= &xs[1];
c *= &C::from(f + 1);
c.div_exact_assign(&C::from(i));
let middle = usize::exact_from(i);
out[middle] = b.mul_ref(&c);
out[middle] *= &a;
i += 1;
}
while i <= e {
let f = e - i;
a *= &xs[0];
b *= &xs[1];
out[usize::exact_from(i)] *= &b;
out[usize::exact_from(f)] *= &a;
i += 1;
}
}}