|
| 1 | +use crate::fft::{fft_g1_inplace, fft_scalar_inplace, precompute_twiddle_factors}; |
1 | 2 | use crate::poly_coeff::PolyCoeff;
|
2 | 3 | use bls12_381::ff::{Field, PrimeField};
|
3 | 4 | use bls12_381::{
|
@@ -223,83 +224,6 @@ impl Domain {
|
223 | 224 | }
|
224 | 225 | }
|
225 | 226 |
|
226 |
| -use std::ops::{Add, Mul, Neg, Sub}; |
227 |
| - |
228 |
| -trait FFTElement: |
229 |
| - Sized |
230 |
| - + Copy |
231 |
| - + Add<Output = Self> |
232 |
| - + Sub<Output = Self> |
233 |
| - + Mul<Scalar, Output = Self> |
234 |
| - + Neg<Output = Self> |
235 |
| -{ |
236 |
| -} |
237 |
| - |
238 |
| -impl FFTElement for Scalar {} |
239 |
| - |
240 |
| -impl FFTElement for G1Projective {} |
241 |
| - |
242 |
| -fn fft_inplace<T: FFTElement>(twiddle_factors: &[Scalar], a: &mut [T]) { |
243 |
| - let n = a.len(); |
244 |
| - let log_n = log2_pow2(n); |
245 |
| - assert_eq!(n, 1 << log_n); |
246 |
| - |
247 |
| - for k in 0..n { |
248 |
| - let rk = bitreverse(k as u32, log_n) as usize; |
249 |
| - if k < rk { |
250 |
| - a.swap(rk, k); |
251 |
| - } |
252 |
| - } |
253 |
| - |
254 |
| - let mut m = 1; |
255 |
| - for s in 0..log_n { |
256 |
| - let w_m = twiddle_factors[s as usize]; |
257 |
| - for k in (0..n).step_by(2 * m) { |
258 |
| - let mut w = Scalar::ONE; |
259 |
| - for j in 0..m { |
260 |
| - let t = if w == Scalar::ONE { |
261 |
| - a[k + j + m] |
262 |
| - } else if w == -Scalar::ONE { |
263 |
| - -a[k + j + m] |
264 |
| - } else { |
265 |
| - a[k + j + m] * w |
266 |
| - }; |
267 |
| - let u = a[k + j]; |
268 |
| - a[k + j] = u + t; |
269 |
| - a[k + j + m] = u - t; |
270 |
| - w *= w_m; |
271 |
| - } |
272 |
| - } |
273 |
| - m *= 2; |
274 |
| - } |
275 |
| -} |
276 |
| - |
277 |
| -fn fft_scalar_inplace(twiddle_factors: &[Scalar], a: &mut [Scalar]) { |
278 |
| - fft_inplace(twiddle_factors, a); |
279 |
| -} |
280 |
| - |
281 |
| -fn fft_g1_inplace(twiddle_factors: &[Scalar], a: &mut [G1Projective]) { |
282 |
| - fft_inplace(twiddle_factors, a); |
283 |
| -} |
284 |
| - |
285 |
| -fn bitreverse(mut n: u32, l: u32) -> u32 { |
286 |
| - let mut r = 0; |
287 |
| - for _ in 0..l { |
288 |
| - r = (r << 1) | (n & 1); |
289 |
| - n >>= 1; |
290 |
| - } |
291 |
| - r |
292 |
| -} |
293 |
| -fn log2_pow2(n: usize) -> u32 { |
294 |
| - n.trailing_zeros() |
295 |
| -} |
296 |
| -fn precompute_twiddle_factors<F: Field>(omega: &F, n: usize) -> Vec<F> { |
297 |
| - let log_n = log2_pow2(n); |
298 |
| - (0..log_n) |
299 |
| - .map(|s| omega.pow(&[(n / (1 << (s + 1))) as u64])) |
300 |
| - .collect() |
301 |
| -} |
302 |
| - |
303 | 227 | #[cfg(test)]
|
304 | 228 | mod tests {
|
305 | 229 | use crate::poly_coeff::poly_eval;
|
|
0 commit comments