arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/spqlios/src/scalar_vector_product.rs
spqlios/src/scalar_vector_product.rsRaw
 1use crate::bindings::{new_svp_ppol, svp_apply_dft, svp_prepare};
 2use crate::module::{Module, SVPPOL, VECZNXDFT};
 3use crate::scalar::Scalar;
 4use crate::vector::Vector;
 5
 6impl Module {
 7    // Prepares a scalar polynomial (1 limb) for a scalar x vector product.
 8    // Method will panic if a.limbs() != 1.
 9    pub fn svp_prepare(&self, svp_ppol: &mut SVPPOL, a: &Scalar) {
10        unsafe { svp_prepare(self.0, svp_ppol.0, a.as_ptr()) }
11    }
12
13    // Allocates a scalar-vector-product prepared-poly (SVPPOL).
14    pub fn svp_new_ppol(&self) -> SVPPOL {
15        unsafe { SVPPOL(new_svp_ppol(self.0)) }
16    }
17
18    // Applies a scalar x vector product: res <- a (ppol) x b
19    pub fn svp_apply_dft(&self, c: &mut VECZNXDFT, a: &SVPPOL, b: &Vector) {
20        let limbs: u64 = b.limbs() as u64;
21        assert!(
22            c.limbs() as u64 >= limbs,
23            "invalid c_vector: c_vector.limbs()={} < b.limbs()={}",
24            c.limbs(),
25            limbs
26        );
27        unsafe { svp_apply_dft(self.0, c.0, limbs, a.0, b.as_ptr(), limbs, b.n() as u64) }
28    }
29}