use crate::{
integer::Z,
integer_mod_q::{MatZq, ModulusPolynomialRingZq, PolyOverZq},
traits::{FromCoefficientEmbedding, GetCoefficient, IntoCoefficientEmbedding, MatrixSetEntry},
};
impl IntoCoefficientEmbedding<MatZq> for &ModulusPolynomialRingZq {
fn into_coefficient_embedding(self, size: impl Into<i64>) -> MatZq {
let size = size.into();
let length = self.get_degree() + 1;
assert!(
size >= length,
"The polynomial can not be embedded in the vector, \
as the length of the polynomial ({length}) is larger than \
the provided size ({size})."
);
let mut out = MatZq::new(size, 1, self.get_q());
for j in 0..size {
let coeff: Z = unsafe { self.get_coeff_unchecked(j) };
unsafe { out.set_entry_unchecked(j, 0, coeff) };
}
out
}
}
impl FromCoefficientEmbedding<&MatZq> for ModulusPolynomialRingZq {
fn from_coefficient_embedding(embedding: &MatZq) -> Self {
ModulusPolynomialRingZq::from(PolyOverZq::from_coefficient_embedding(embedding))
}
}
#[cfg(test)]
mod test_into_coefficient_embedding {
use crate::{
integer_mod_q::{MatZq, ModulusPolynomialRingZq},
traits::IntoCoefficientEmbedding,
};
use std::str::FromStr;
#[test]
fn large_entries() {
let poly =
ModulusPolynomialRingZq::from_str(&format!("3 17 {} 1 mod {}", i64::MAX, u64::MAX))
.unwrap();
let vector = poly.into_coefficient_embedding(3);
let cmp_vector =
MatZq::from_str(&format!("[[17],[{}],[1]] mod {}", i64::MAX, u64::MAX)).unwrap();
assert_eq!(cmp_vector, vector);
}
#[test]
#[should_panic]
fn size_too_small() {
let poly = ModulusPolynomialRingZq::from_str("3 17 1 1 mod 19").unwrap();
let _ = poly.into_coefficient_embedding(2);
}
}
#[cfg(test)]
mod test_from_coefficient_embedding {
use crate::{
integer_mod_q::{MatZq, ModulusPolynomialRingZq},
traits::FromCoefficientEmbedding,
};
use std::str::FromStr;
#[test]
fn large_entries() {
let vector =
MatZq::from_str(&format!("[[17],[{}],[1]] mod {}", i64::MAX, u64::MAX)).unwrap();
let poly = ModulusPolynomialRingZq::from_coefficient_embedding(&vector);
let cmp_poly =
ModulusPolynomialRingZq::from_str(&format!("3 17 {} 1 mod {}", i64::MAX, u64::MAX))
.unwrap();
assert_eq!(cmp_poly, poly);
}
#[test]
#[should_panic]
fn not_column_vector() {
let vector = MatZq::from_str("[[17, 1],[-17, -1],[5, 9]] mod 42").unwrap();
let _ = ModulusPolynomialRingZq::from_coefficient_embedding(&vector);
}
}