poulpy/src/modulus/impl_u64/operations.rs
src/modulus/impl_u64/operations.rsRaw
1
2use crate::modulus::Operations;
3use crate::modulus::prime::Prime;
4use crate::modulus::ReduceOnce;
5use crate::{apply_unary, apply_binary, apply_ternary};
6use itertools::izip;
7
8impl Operations<u64> for Prime<u64>{
9
10 #[inline(always)]
11 fn add_binary_assign(&self, a: &u64, b: &u64, c: &mut u64){
12 *c = a.wrapping_add(*b).reduce_once(self.q);
13 }
14
15 #[inline(always)]
16 fn add_unary_assign(&self, a: &u64, b: &mut u64){
17 *b = a.wrapping_add(*b).reduce_once(self.q);
18 }
19
20 #[inline(always)]
21 fn add_vec_binary_assign<const CHUNK:usize>(&self, a: &[u64], b:&[u64], c:&mut [u64]){
22 apply_ternary!(self, Self::add_binary_assign, a, b, c, CHUNK);
23 }
24
25 #[inline(always)]
26 fn add_vec_unary_assign<const CHUNK:usize>(&self, a: &[u64], b:&mut [u64]){
27 apply_binary!(self, Self::add_unary_assign, a, b, CHUNK);
28 }
29
30 #[inline(always)]
31 fn sub_binary_assign(&self, a: &u64, b: &u64, c: &mut u64){
32 *c = a.wrapping_add(self.q.wrapping_sub(*b)).reduce_once(self.q);
33 }
34
35 #[inline(always)]
36 fn sub_unary_assign(&self, a: &u64, b: &mut u64){
37 *b = a.wrapping_add(self.q.wrapping_sub(*b)).reduce_once(self.q);
38 }
39
40 #[inline(always)]
41 fn sub_vec_binary_assign<const CHUNK:usize>(&self, a: &[u64], b:&[u64], c:&mut [u64]){
42 apply_ternary!(self, Self::sub_binary_assign, a, b, c, CHUNK);
43 }
44
45 #[inline(always)]
46 fn sub_vec_unary_assign<const CHUNK:usize>(&self, a: &[u64], b:&mut [u64]){
47 apply_binary!(self, Self::sub_unary_assign, a, b, CHUNK);
48 }
49
50 #[inline(always)]
51 fn neg_assign(&self, a: &mut u64){
52 *a = self.q.wrapping_sub(*a);
53 }
54
55 #[inline(always)]
56 fn neg_vec_assign<const CHUNK:usize>(&self, a: &mut [u64]){
57 apply_unary!(self, Self::neg_assign, a, CHUNK);
58 }
59}
60