use crate::natural::Natural;
use crate::natural_polynomial::NaturalPolynomial;
use alloc::vec;
use alloc::vec::Vec;
use malachite_base::num::arithmetic::traits::{AddMulAssign, PowerOf2};
use malachite_base::num::basic::traits::Zero;
use malachite_base::polynomial::Polynomial;
pub fn naturals_mul_naive(xs: &[Natural], ys: &[Natural]) -> Vec<Natural> {
if xs.is_empty() || ys.is_empty() {
return Vec::new();
}
let mut out = vec![Natural::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: &NaturalPolynomial, q: &NaturalPolynomial) -> NaturalPolynomial {
NaturalPolynomial::from_coefficients_asc(naturals_mul_naive(
p.coefficients_asc(),
q.coefficients_asc(),
))
}
pub fn natural_generated_coefficients(len: usize, bits: u64) -> Vec<Natural> {
(0..len)
.map(|i| Natural::power_of_2(bits) - Natural::from(i + 1))
.collect()
}