arnaucube
arnaucube/poulpyPublic Self-hosted repository
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::modulus::montgomery::Montgomery;
 6use crate::modulus::{REDUCEMOD, NONE, ONCE, BARRETT, BARRETTLAZY};
 7use crate::{apply_unary, apply_binary, apply_ternary};
 8use itertools::izip;
 9
10impl Operations<u64> for Prime<u64>{
11
12    #[inline(always)]
13    fn add_binary_assign<const REDUCE:REDUCEMOD>(&self, a: &u64, b: &u64, c: &mut u64){
14        *c = a.wrapping_add(*b);
15        self.montgomery.reduce_assign::<REDUCE>(c);
16    }
17
18    #[inline(always)]
19    fn add_unary_assign<const REDUCE:REDUCEMOD>(&self, a: &u64, b: &mut u64){
20        *b = a.wrapping_add(*b);
21        self.montgomery.reduce_assign::<REDUCE>(b);
22    }
23
24    #[inline(always)]
25    fn add_vec_binary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[u64], b:&[u64], c:&mut [u64]){
26        apply_ternary!(self, Self::add_binary_assign::<REDUCE>, a, b, c, CHUNK);
27    }
28
29    #[inline(always)]
30    fn add_vec_unary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[u64], b:&mut [u64]){
31        apply_binary!(self, Self::add_unary_assign::<REDUCE>, a, b, CHUNK);
32    }
33
34    #[inline(always)]
35    fn sub_binary_assign<const REDUCE:REDUCEMOD>(&self, a: &u64, b: &u64, c: &mut u64){
36        *c = a.wrapping_add(self.q.wrapping_sub(*b)).reduce_once(self.q);
37    }
38
39    #[inline(always)]
40    fn sub_unary_assign<const REDUCE:REDUCEMOD>(&self, a: &u64, b: &mut u64){
41        *b = a.wrapping_add(self.q.wrapping_sub(*b)).reduce_once(self.q);
42    }
43
44    #[inline(always)]
45    fn sub_vec_binary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[u64], b:&[u64], c:&mut [u64]){
46        apply_ternary!(self, Self::sub_binary_assign::<REDUCE>, a, b, c, CHUNK);
47    }
48
49    #[inline(always)]
50    fn sub_vec_unary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[u64], b:&mut [u64]){
51        apply_binary!(self, Self::sub_unary_assign::<REDUCE>, a, b, CHUNK);
52    }
53
54    #[inline(always)]
55    fn neg_assign<const REDUCE:REDUCEMOD>(&self, a: &mut u64){
56        *a = self.q.wrapping_sub(*a);
57        self.montgomery.reduce_assign::<REDUCE>(a)
58    }
59
60    #[inline(always)]
61    fn neg_vec_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &mut [u64]){
62        apply_unary!(self, Self::neg_assign::<REDUCE>, a, CHUNK);
63    }
64
65    #[inline(always)]
66    fn mul_montgomery_external_binary_assign<const REDUCE:REDUCEMOD>(&self, a:& Montgomery<u64>, b:&u64, c: &mut u64){
67        *c = self.montgomery.mul_external::<REDUCE>(*a, *b);
68    }
69
70    #[inline(always)]
71    fn mul_montgomery_external_unary_assign<const REDUCE:REDUCEMOD>(&self, lhs:&Montgomery<u64>, rhs:&mut u64){
72        *rhs = self.montgomery.mul_external::<REDUCE>(*lhs, *rhs);
73    }
74
75    #[inline(always)]
76    fn mul_vec_montgomery_external_binary_assign<const CHUNK:usize,const REDUCE:REDUCEMOD>(&self, a:& [Montgomery<u64>], b:&[u64], c: &mut [u64]){
77        apply_ternary!(self, Self::mul_montgomery_external_binary_assign::<REDUCE>, a, b, c, CHUNK);
78    }
79
80    #[inline(always)]
81    fn mul_vec_montgomery_external_unary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a:&[Montgomery<u64>], b:&mut [u64]){
82        apply_binary!(self, Self::mul_montgomery_external_unary_assign::<REDUCE>, a, b, CHUNK);
83    }
84}