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}