poulpy/base2k/src/scalar_vector_product.rs
base2k/src/scalar_vector_product.rsRaw
1use crate::ffi::svp::{delete_svp_ppol, new_svp_ppol, svp_apply_dft, svp_ppol_t, svp_prepare};
2use crate::scalar::Scalar;
3use crate::{Module, VecZnx, VecZnxDft};
4
5pub struct SvpPPol(pub *mut svp_ppol_t, pub usize);
6
7impl SvpPPol {
8 pub fn n(&self) -> usize {
9 self.1
10 }
11
12 pub fn delete(self) {
13 unsafe { delete_svp_ppol(self.0) };
14 let _ = drop(self);
15 }
16}
17
18impl Module {
19 // Prepares a scalar polynomial (1 limb) for a scalar x vector product.
20 // Method will panic if a.limbs() != 1.
21 pub fn svp_prepare(&self, svp_ppol: &mut SvpPPol, a: &Scalar) {
22 unsafe { svp_prepare(self.0, svp_ppol.0, a.as_ptr()) }
23 }
24
25 // Allocates a scalar-vector-product prepared-poly (VecZnxBig).
26 pub fn svp_new_ppol(&self) -> SvpPPol {
27 unsafe { SvpPPol(new_svp_ppol(self.0), self.n()) }
28 }
29
30 // Applies a scalar x vector product: res <- a (ppol) x b
31 pub fn svp_apply_dft(&self, c: &mut VecZnxDft, a: &SvpPPol, b: &VecZnx) {
32 let limbs: u64 = b.limbs() as u64;
33 assert!(
34 c.limbs() as u64 >= limbs,
35 "invalid c_vector: c_vector.limbs()={} < b.limbs()={}",
36 c.limbs(),
37 limbs
38 );
39 unsafe { svp_apply_dft(self.0, c.0, limbs, a.0, b.as_ptr(), limbs, b.n() as u64) }
40 }
41}