diff --git a/math/src/modulus.rs b/math/src/modulus.rs index c7ae56c..f749945 100644 --- a/math/src/modulus.rs +++ b/math/src/modulus.rs @@ -114,6 +114,14 @@ pub trait ScalarOperations { c: &mut O, ); + // Assigns a * b + c to c. + fn sa_mul_sb_montgomery_add_sc_into_sc( + &self, + a: &O, + b: &montgomery::Montgomery, + c: &mut O, + ); + // Assigns a * b to b. fn sa_mul_sb_montgomery_into_sa( &self, @@ -288,6 +296,18 @@ pub trait VectorOperations { c: &mut [O], ); + // vec(c) <- vec(a) * vec(b) + vec(c). + fn va_mul_vb_montgomery_add_vc_into_vc< + const CHUNK: usize, + const REDUCE1: REDUCEMOD, + const REDUCE2: REDUCEMOD, + >( + &self, + a: &[O], + b: &[montgomery::Montgomery], + c: &mut [O], + ); + // vec(a) <- vec(a) * vec(b). fn va_mul_vb_montgomery_into_va( &self, diff --git a/math/src/modulus/impl_u64/operations.rs b/math/src/modulus/impl_u64/operations.rs index 1df16fe..4e0de63 100644 --- a/math/src/modulus/impl_u64/operations.rs +++ b/math/src/modulus/impl_u64/operations.rs @@ -4,8 +4,8 @@ use crate::modulus::prime::Prime; use crate::modulus::{ScalarOperations, VectorOperations}; use crate::modulus::{NONE, REDUCEMOD}; use crate::{ - apply_ssv, apply_sv, apply_v, apply_vsssvv, apply_vssv, apply_vsv, apply_vv, - apply_vvssv, apply_vvsv, apply_vvv, + apply_ssv, apply_sv, apply_v, apply_vsssvv, apply_vssv, apply_vsv, apply_vv, apply_vvssv, + apply_vvsv, apply_vvv, }; use itertools::izip; @@ -118,6 +118,17 @@ impl ScalarOperations for Prime { *c = self.montgomery.mul_external::(*a, *b); } + #[inline(always)] + fn sa_mul_sb_montgomery_add_sc_into_sc( + &self, + a: &u64, + b: &Montgomery, + c: &mut u64, + ) { + *c += self.montgomery.mul_external::(*a, *b); + self.sa_reduce_into_sa::(c); + } + #[inline(always)] fn sa_mul_sb_montgomery_into_sa( &self, @@ -418,6 +429,27 @@ impl VectorOperations for Prime { ); } + #[inline(always)] + fn va_mul_vb_montgomery_add_vc_into_vc< + const CHUNK: usize, + const REDUCE1: REDUCEMOD, + const REDUCE2: REDUCEMOD, + >( + &self, + a: &[Montgomery], + b: &[u64], + c: &mut [u64], + ) { + apply_vvv!( + self, + Self::sa_mul_sb_montgomery_add_sc_into_sc::, + a, + b, + c, + CHUNK + ); + } + #[inline(always)] fn va_mul_vb_montgomery_into_va( &self,