poulpy/math/src/modulus.rs
math/src/modulus.rsRaw
1pub mod barrett;
2pub mod impl_u64;
3pub mod montgomery;
4pub mod prime;
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 fn mask(self) -> O;
19}
20
21impl WordOps<u64> for u64 {
22 #[inline(always)]
23 fn log2(self) -> u64 {
24 (u64::BITS - (self - 1).leading_zeros()) as _
25 }
26 #[inline(always)]
27 fn reverse_bits_msb(self, n: u32) -> u64 {
28 self.reverse_bits() >> (usize::BITS - n)
29 }
30 #[inline(always)]
31 fn mask(self) -> u64 {
32 (1 << self.log2()) - 1
33 }
34}
35
36impl WordOps<usize> for usize {
37 #[inline(always)]
38 fn log2(self) -> usize {
39 (usize::BITS - (self - 1).leading_zeros()) as _
40 }
41 #[inline(always)]
42 fn reverse_bits_msb(self, n: u32) -> usize {
43 self.reverse_bits() >> (usize::BITS - n)
44 }
45 #[inline(always)]
46 fn mask(self) -> usize {
47 (1 << self.log2()) - 1
48 }
49}
50
51pub trait ReduceOnce<O> {
52 /// Assigns self-q to self if self >= q in constant time.
53 /// User must ensure that 2q fits in O.
54 fn reduce_once_constant_time_assign(&mut self, q: O);
55 /// Returns self-q if self >= q else self in constant time.
56 /// /// User must ensure that 2q fits in O.
57 fn reduce_once_constant_time(&self, q: O) -> O;
58 /// Assigns self-q to self if self >= q.
59 /// /// User must ensure that 2q fits in O.
60 fn reduce_once_assign(&mut self, q: O);
61 /// Returns self-q if self >= q else self.
62 /// /// User must ensure that 2q fits in O.
63 fn reduce_once(&self, q: O) -> O;
64}
65
66pub trait ScalarOperations<O> {
67 // Applies a parameterized modular reduction.
68 fn sa_reduce_into_sa<const REDUCE: REDUCEMOD>(&self, x: &mut O);
69
70 // Assigns a + b to c.
71 fn sa_add_sb_into_sc<const REDUCE: REDUCEMOD>(&self, a: &O, b: &O, c: &mut O);
72
73 // Assigns a + b to b.
74 fn sa_add_sb_into_sb<const REDUCE: REDUCEMOD>(&self, a: &O, b: &mut O);
75
76 // Assigns a - b to c.
77 fn sa_sub_sb_into_sc<const REDUCE: REDUCEMOD>(&self, a: &O, b: &O, c: &mut O);
78
79 // Assigns b - a to b.
80 fn sa_sub_sb_into_sb<const REDUCE: REDUCEMOD>(&self, a: &O, b: &mut O);
81
82 // Assigns -a to a.
83 fn sa_neg_into_sa<const REDUCE: REDUCEMOD>(&self, a: &mut O);
84
85 // Assigns -a to b.
86 fn sa_neg_into_sb<const REDUCE: REDUCEMOD>(&self, a: &O, b: &mut O);
87
88 // Assigns a * 2^64 to b.
89 fn sa_prep_mont_into_sb<const REDUCE: REDUCEMOD>(
90 &self,
91 a: &O,
92 b: &mut montgomery::Montgomery<O>,
93 );
94
95 // Assigns a * b to c.
96 fn sa_mont_mul_sb_into_sc<const REDUCE: REDUCEMOD>(
97 &self,
98 a: &montgomery::Montgomery<O>,
99 b: &O,
100 c: &mut O,
101 );
102
103 // Assigns a * b to b.
104 fn sa_mont_mul_sb_into_sb<const REDUCE: REDUCEMOD>(
105 &self,
106 a: &montgomery::Montgomery<O>,
107 b: &mut O,
108 );
109
110 // Assigns a * b to c.
111 fn sa_barrett_mul_sb_into_sc<const REDUCE: REDUCEMOD>(
112 &self,
113 a: &barrett::Barrett<O>,
114 b: &O,
115 c: &mut O,
116 );
117
118 // Assigns a * b to b.
119 fn sa_barrett_mul_sb_into_sb<const REDUCE: REDUCEMOD>(
120 &self,
121 a: &barrett::Barrett<O>,
122 b: &mut O,
123 );
124
125 // Assigns (a + 2q - b) * c to d.
126 fn sa_sub_sb_mul_sc_into_sd<const REDUCE: REDUCEMOD>(
127 &self,
128 a: &O,
129 b: &O,
130 c: &barrett::Barrett<O>,
131 d: &mut O,
132 );
133
134 // Assigns (a + 2q - b) * c to b.
135 fn sa_sub_sb_mul_sc_into_sb<const REDUCE: REDUCEMOD>(
136 &self,
137 a: &u64,
138 c: &barrett::Barrett<u64>,
139 b: &mut u64,
140 );
141}
142
143pub trait VectorOperations<O> {
144 // Applies a parameterized modular reduction.
145 fn va_reduce_into_va<const CHUNK: usize, const REDUCE: REDUCEMOD>(&self, x: &mut [O]);
146
147 // ADD
148 // Assigns a[i] + b[i] to c[i]
149 fn va_add_vb_into_vc<const CHUNK: usize, const REDUCE: REDUCEMOD>(
150 &self,
151 a: &[O],
152 b: &[O],
153 c: &mut [O],
154 );
155
156 // Assigns a[i] + b[i] to b[i]
157 fn va_add_vb_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(&self, a: &[O], b: &mut [O]);
158
159 // Assigns a[i] + b to c[i]
160 fn va_add_sb_into_vc<const CHUNK: usize, const REDUCE: REDUCEMOD>(
161 &self,
162 a: &[O],
163 b: &O,
164 c: &mut [O],
165 );
166
167 // Assigns b[i] + a to b[i]
168 fn sa_add_vb_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(&self, a: &O, b: &mut [O]);
169
170 // SUB
171 // Assigns a[i] - b[i] to b[i]
172 fn va_sub_vb_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(&self, a: &[O], b: &mut [O]);
173
174 // Assigns a[i] - b[i] to c[i]
175 fn va_sub_vb_into_vc<const CHUNK: usize, const REDUCE: REDUCEMOD>(
176 &self,
177 a: &[O],
178 b: &[O],
179 c: &mut [O],
180 );
181
182 // NEG
183 // Assigns -a[i] to a[i].
184 fn va_neg_into_va<const CHUNK: usize, const REDUCE: REDUCEMOD>(&self, a: &mut [O]);
185
186 // Assigns -a[i] to a[i].
187 fn va_neg_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(&self, a: &[O], b: &mut [O]);
188
189 // MUL MONTGOMERY
190 // Assigns a * 2^64 to b.
191 fn va_prep_mont_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(
192 &self,
193 a: &[O],
194 b: &mut [montgomery::Montgomery<O>],
195 );
196
197 // Assigns a[i] * b[i] to c[i].
198 fn va_mont_mul_vb_into_vc<const CHUNK: usize, const REDUCE: REDUCEMOD>(
199 &self,
200 a: &[montgomery::Montgomery<O>],
201 b: &[O],
202 c: &mut [O],
203 );
204
205 // Assigns a[i] * b[i] to b[i].
206 fn va_mont_mul_vb_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(
207 &self,
208 a: &[montgomery::Montgomery<O>],
209 b: &mut [O],
210 );
211
212 // MUL BARRETT
213 // Assigns a * b[i] to b[i].
214 fn sa_barrett_mul_vb_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(
215 &self,
216 a: &barrett::Barrett<u64>,
217 b: &mut [u64],
218 );
219
220 // Assigns a * b[i] to c[i].
221 fn sa_barrett_mul_vb_into_vc<const CHUNK: usize, const REDUCE: REDUCEMOD>(
222 &self,
223 a: &barrett::Barrett<u64>,
224 b: &[u64],
225 c: &mut [u64],
226 );
227
228 // OTHERS
229 // Assigns (a[i] + 2q - b[i]) * c to d[i].
230 fn va_sub_vb_mul_sc_into_vd<const CHUNK: usize, const REDUCE: REDUCEMOD>(
231 &self,
232 a: &[u64],
233 b: &[u64],
234 c: &barrett::Barrett<u64>,
235 d: &mut [u64],
236 );
237
238 // Assigns (a[i] + 2q - b[i]) * c to b[i].
239 fn va_sub_vb_mul_sc_into_vb<const CHUNK: usize, const REDUCE: REDUCEMOD>(
240 &self,
241 a: &[u64],
242 c: &barrett::Barrett<u64>,
243 b: &mut [u64],
244 );
245}