use crate::integer::Integer;
use crate::integer_polynomial::IntegerPolynomial;
use alloc::vec;
use alloc::vec::Vec;
use malachite_base::num::arithmetic::traits::{AddMulAssign, Parity, PowerOf2};
use malachite_base::num::basic::traits::Zero;
use malachite_base::polynomial::Polynomial;
pub fn integers_mul_naive(xs: &[Integer], ys: &[Integer]) -> Vec<Integer> {
if xs.is_empty() || ys.is_empty() {
return Vec::new();
}
let mut out = vec![Integer::ZERO; xs.len() + ys.len() - 1];
for (i, x) in xs.iter().enumerate() {
for (o, y) in out[i..].iter_mut().zip(ys) {
o.add_mul_assign(x, y);
}
}
out
}
pub fn mul_naive(p: &IntegerPolynomial, q: &IntegerPolynomial) -> IntegerPolynomial {
IntegerPolynomial::from_coefficients_asc(integers_mul_naive(
p.coefficients_asc(),
q.coefficients_asc(),
))
}
pub fn generated_coefficients(len: usize, bits: u64) -> Vec<Integer> {
(0..len)
.map(|i| {
let x = Integer::power_of_2(bits) - Integer::from(i + 1);
if i.odd() { -x } else { x }
})
.collect()
}