poulpy/src/modulus.rs
src/modulus.rsRaw
1pub mod prime;
2pub mod barrett;
3pub mod montgomery;
4pub mod impl_u64;
5
6pub type REDUCEMOD = u8;
7
8pub const NONE: REDUCEMOD = 0;
9pub const ONCE: REDUCEMOD = 1;
10pub const TWICE: REDUCEMOD = 2;
11pub const FOURTIMES: REDUCEMOD = 3;
12pub const BARRETT: REDUCEMOD = 4;
13pub const BARRETTLAZY: REDUCEMOD = 5;
14
15pub trait WordOps<O>{
16 fn log2(self) -> O;
17 fn reverse_bits_msb(self, n:u32) -> O;
18}
19
20impl WordOps<u64> for u64{
21 #[inline(always)]
22 fn log2(self) -> u64{
23 (u64::BITS - (self-1).leading_zeros()) as _
24 }
25 #[inline(always)]
26 fn reverse_bits_msb(self, n: u32) -> u64{
27 self.reverse_bits() >> (usize::BITS - n)
28 }
29}
30
31impl WordOps<usize> for usize{
32 #[inline(always)]
33 fn log2(self) -> usize{
34 (usize::BITS - (self-1).leading_zeros()) as _
35 }
36 #[inline(always)]
37 fn reverse_bits_msb(self, n: u32) -> usize{
38 self.reverse_bits() >> (usize::BITS - n)
39 }
40}
41
42pub trait ReduceOnce<O>{
43 /// Assigns self-q to self if self >= q in constant time.
44 /// User must ensure that 2q fits in O.
45 fn reduce_once_constant_time_assign(&mut self, q: O);
46 /// Returns self-q if self >= q else self in constant time.
47 /// /// User must ensure that 2q fits in O.
48 fn reduce_once_constant_time(&self, q:O) -> O;
49 /// Assigns self-q to self if self >= q.
50 /// /// User must ensure that 2q fits in O.
51 fn reduce_once_assign(&mut self, q: O);
52 /// Returns self-q if self >= q else self.
53 /// /// User must ensure that 2q fits in O.
54 fn reduce_once(&self, q:O) -> O;
55}
56
57pub trait WordOperations<O>{
58
59 // Applies a parameterized modular reduction.
60 fn word_reduce_assign<const REDUCE:REDUCEMOD>(&self, x: &mut O);
61
62 // Assigns a + b to c.
63 fn word_add_binary_assign<const REDUCE:REDUCEMOD>(&self, a: &O, b:&O, c: &mut O);
64
65 // Assigns a + b to b.
66 fn word_add_unary_assign<const REDUCE:REDUCEMOD>(&self, a: &O, b: &mut O);
67
68 // Assigns a - b to c.
69 fn word_sub_binary_assign<const REDUCE:REDUCEMOD>(&self, a: &O, b:&O, c: &mut O);
70
71 // Assigns b - a to b.
72 fn word_sub_unary_assign<const REDUCE:REDUCEMOD>(&self, a: &O, b: &mut O);
73
74 // Assigns -a to a.
75 fn word_neg_assign<const REDUCE:REDUCEMOD>(&self, a:&mut O);
76
77 // Assigns a * 2^64 to b.
78 fn word_prepare_montgomery_assign<const REDUCE:REDUCEMOD>(&self, a: &O, b: &mut montgomery::Montgomery<O>);
79
80 // Assigns a * b to c.
81 fn word_mul_montgomery_external_binary_assign<const REDUCE:REDUCEMOD>(&self, a:&montgomery::Montgomery<O>, b:&O, c: &mut O);
82
83 // Assigns a * b to b.
84 fn word_mul_montgomery_external_unary_assign<const REDUCE:REDUCEMOD>(&self, a:&montgomery::Montgomery<O>, b:&mut O);
85}
86
87pub trait VecOperations<O>{
88
89 // Applies a parameterized modular reduction.
90 fn vec_reduce_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, x: &mut [O]);
91
92 // Assigns a[i] + b[i] to c[i]
93 fn vec_add_binary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b:&[O], c: &mut [O]);
94
95 // Assigns a[i] + b[i] to b[i]
96 fn vec_add_unary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [O]);
97
98 // Assigns a[i] - b[i] to c[i]
99 fn vec_sub_binary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b:&[O], c: &mut [O]);
100
101 // Assigns a[i] - b[i] to b[i]
102 fn vec_sub_unary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [O]);
103
104 // Assigns -a[i] to a[i].
105 fn vec_neg_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &mut [O]);
106
107 // Assigns a * 2^64 to b.
108 fn vec_prepare_montgomery_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a: &[O], b: &mut [montgomery::Montgomery<O>]);
109
110 // Assigns a[i] * b[i] to c[i].
111 fn vec_mul_montgomery_external_binary_assign<const CHUNK:usize,const REDUCE:REDUCEMOD>(&self, a:&[montgomery::Montgomery<O>], b:&[O], c: &mut [O]);
112
113 // Assigns a[i] * b[i] to b[i].
114 fn vec_mul_montgomery_external_unary_assign<const CHUNK:usize, const REDUCE:REDUCEMOD>(&self, a:&[montgomery::Montgomery<O>], b:&mut [O]);
115}
116
117
118
119