1#![allow(clippy::excessive_precision)]
47#![forbid(unsafe_code)]
48
49use num_complex::Complex;
50use num_traits::{Float, FloatConst};
51
52const SQRT_3: f64 = 1.7320508075688772;
53const SQRT_3_DIV_2: f64 = SQRT_3 / 2.0;
54
55monarch_derive::generate_switch!();
56monarch_derive::generate_powers_of_two!();
57monarch_derive::generate_coprimes!();
58monarch_derive::generate_mixed_radix!();
59monarch_derive::generate_primes!();
60monarch_derive::generate_iffts!();
61
62fn _compute_twiddle<T: Float + FloatConst>(index: usize, fft_len: usize) -> Complex<T> {
63 let constant = T::from(-2.0).unwrap() * T::PI() / T::from(fft_len).unwrap();
64 let angle = constant * T::from(index).unwrap();
66
67 Complex::new(angle.cos(), angle.sin())
68}
69
70#[doc = concat!("Inner FFT")]
71#[inline]
72pub fn fft3<T: Float + FloatConst, A: AsRef<[Complex<T>]>>(input: A) -> [Complex<T>; 3] {
73 let n = 3;
74 let x = input.as_ref();
75 assert_eq!(n, x.len());
76
77 let twiddle: Complex<T> = Complex::new(T::from(-0.5).unwrap(), -T::from(SQRT_3_DIV_2).unwrap());
78
79 let xp = x[1] + x[2];
80 let xn = x[1] - x[2];
81 let sum = x[0] + xp;
82
83 let temp_a = x[0]
84 + Complex {
85 re: twiddle.re * xp.re,
86 im: twiddle.re * xp.im,
87 };
88 let temp_b = Complex {
89 re: -twiddle.im * xn.im,
90 im: twiddle.im * xn.re,
91 };
92
93 [sum, temp_a + temp_b, temp_a - temp_b]
94}
95
96#[doc = concat!("Inner FFT")]
97#[inline]
98pub fn fft9<T: Float + FloatConst, A: AsRef<[Complex<T>]>>(input: A) -> [Complex<T>; 9] {
99 let n = 9;
100 let x = input.as_ref();
101 assert_eq!(n, x.len());
102
103 let twiddle1: Complex<T> = Complex::new(
104 T::from(0.76604444311897801).unwrap(),
105 T::from(-0.64278760968653925).unwrap(),
106 );
107 let twiddle2: Complex<T> = Complex::new(
108 T::from(0.17364817766693041).unwrap(),
109 T::from(-0.98480775301220802).unwrap(),
110 );
111 let twiddle4: Complex<T> = Complex::new(
112 T::from(-0.93969262078590832).unwrap(),
113 T::from(-0.34202014332566888).unwrap(),
114 );
115
116 let first = fft3([x[0], x[3], x[6]]);
117 let second = fft3([x[1], x[4], x[7]]);
118 let third = fft3([x[2], x[5], x[8]]);
119
120 let row0 = fft3([first[0], second[0], third[0]]);
121 let row1 = fft3([first[1], second[1] * twiddle1, third[1] * twiddle2]);
122 let row2 = fft3([first[2], second[2] * twiddle2, third[2] * twiddle4]);
123
124 [
125 row0[0], row1[0], row2[0], row0[1], row1[1], row2[1], row0[2], row1[2], row2[2],
126 ]
127}
128
129#[doc = concat!("Inner FFT")]
130#[inline]
131pub fn fft18<T: Float + FloatConst, A: AsRef<[Complex<T>]>>(input: A) -> [Complex<T>; 18] {
132 let n = 18;
133 let x = input.as_ref();
134 assert_eq!(n, x.len());
135
136 let twiddle0 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
137 let twiddle1 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
138 let twiddle2 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
139 let twiddle3 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
140 let twiddle4 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
141 let twiddle5 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
142 let twiddle6 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
143 let twiddle7 = Complex::new(
144 T::from(0.93969262078590842).unwrap(),
145 T::from(-0.34202014332566871).unwrap(),
146 );
147 let twiddle8 = Complex::new(
148 T::from(0.76604444311897801).unwrap(),
149 T::from(-0.64278760968653925).unwrap(),
150 );
151 let twiddle9 = Complex::new(T::from(0.5).unwrap(), T::from(-0.8660254037844386).unwrap());
152 let twiddle10 = Complex::new(
153 T::from(0.17364817766693041).unwrap(),
154 T::from(-0.98480775301220802).unwrap(),
155 );
156 let twiddle11 = Complex::new(
157 T::from(-0.1736481776669303).unwrap(),
158 T::from(-0.98480775301220802).unwrap(),
159 );
160 let twiddle12 = Complex::new(T::from(1.0).unwrap(), T::from(0.0).unwrap());
161 let twiddle13 = Complex::new(
162 T::from(0.76604444311897801).unwrap(),
163 T::from(-0.64278760968653925).unwrap(),
164 );
165 let twiddle14 = Complex::new(
166 T::from(0.17364817766693041).unwrap(),
167 T::from(-0.98480775301220802).unwrap(),
168 );
169 let twiddle15 = Complex::new(
170 T::from(-0.5).unwrap(),
171 T::from(-0.86602540378443881).unwrap(),
172 );
173 let twiddle16 = Complex::new(
174 T::from(-0.93969262078590832).unwrap(),
175 T::from(-0.34202014332566888).unwrap(),
176 );
177 let twiddle17 = Complex::new(
178 T::from(-0.93969262078590842).unwrap(),
179 T::from(0.34202014332566866).unwrap(),
180 );
181
182 let row0 = fft6([x[0], x[3], x[6], x[9], x[12], x[15]]);
183 let row1 = fft6([x[1], x[4], x[7], x[10], x[13], x[16]]);
184 let row2 = fft6([x[2], x[5], x[8], x[11], x[14], x[17]]);
185
186 let col0 = fft3([row0[0] * twiddle0, row1[0] * twiddle6, row2[0] * twiddle12]);
187 let col1 = fft3([row0[1] * twiddle1, row1[1] * twiddle7, row2[1] * twiddle13]);
188 let col2 = fft3([row0[2] * twiddle2, row1[2] * twiddle8, row2[2] * twiddle14]);
189 let col3 = fft3([row0[3] * twiddle3, row1[3] * twiddle9, row2[3] * twiddle15]);
190 let col4 = fft3([row0[4] * twiddle4, row1[4] * twiddle10, row2[4] * twiddle16]);
191 let col5 = fft3([row0[5] * twiddle5, row1[5] * twiddle11, row2[5] * twiddle17]);
192
193 [
194 col0[0], col1[0], col2[0], col3[0], col4[0], col5[0], col0[1], col1[1], col2[1], col3[1],
195 col4[1], col5[1], col0[2], col1[2], col2[2], col3[2], col4[2], col5[2],
196 ]
197}
198
199#[doc = concat!("Inner FFT")]
200#[inline]
201pub fn fft27<T: Float + FloatConst, A: AsRef<[Complex<T>]>>(input: A) -> [Complex<T>; 27] {
202 let n = 27;
203 let x = input.as_ref();
204 assert_eq!(n, x.len());
205
206 let row0 = fft9([x[0], x[3], x[6], x[9], x[12], x[15], x[18], x[21], x[24]]);
207 let row1 = fft9([x[1], x[4], x[7], x[10], x[13], x[16], x[19], x[22], x[25]]);
208 let row2 = fft9([x[2], x[5], x[8], x[11], x[14], x[17], x[20], x[23], x[26]]);
209
210 let twiddle0 = Complex::new(
211 T::from(0.97304487057982381).unwrap(),
212 T::from(-0.23061587074244017).unwrap(),
213 );
214 let twiddle1 = Complex::new(
215 T::from(0.89363264032341228).unwrap(),
216 T::from(-0.44879918020046217).unwrap(),
217 );
218 let twiddle2 = Complex::new(
219 T::from(0.76604444311897801).unwrap(),
220 T::from(-0.64278760968653925).unwrap(),
221 );
222 let twiddle3 = Complex::new(
223 T::from(0.59715859170278618).unwrap(),
224 T::from(-0.80212319275504373).unwrap(),
225 );
226 let twiddle4 = Complex::new(
227 T::from(0.3960797660391569).unwrap(),
228 T::from(-0.918216106880274).unwrap(),
229 );
230 let twiddle5 = Complex::new(
231 T::from(0.17364817766693041).unwrap(),
232 T::from(-0.98480775301220802).unwrap(),
233 );
234 let twiddle6 = Complex::new(
235 T::from(-0.058144828910475774).unwrap(),
236 T::from(-0.99830815827126817).unwrap(),
237 );
238 let twiddle7 = Complex::new(
239 T::from(-0.28680323271109021).unwrap(),
240 T::from(-0.9579895123154889).unwrap(),
241 );
242 let twiddle8 = Complex::new(
243 T::from(-0.68624163786873338).unwrap(),
244 T::from(-0.72737364157304896).unwrap(),
245 );
246 let twiddle9 = Complex::new(
247 T::from(-0.93969262078590832).unwrap(),
248 T::from(-0.34202014332566888).unwrap(),
249 );
250 let twiddle10 = Complex::new(
251 T::from(-0.99323835774194302).unwrap(),
252 T::from(0.11609291412523012).unwrap(),
253 );
254 let twiddle11 = Complex::new(
255 T::from(-0.83548781141293649).unwrap(),
256 T::from(0.54950897807080601).unwrap(),
257 );
258
259 let col0 = fft3([row0[0], row1[0], row2[0]]);
260 let col1 = fft3([row0[1], row1[1] * twiddle0, row2[1] * twiddle1]);
261 let col2 = fft3([row0[2], row1[2] * twiddle1, row2[2] * twiddle3]);
262 let col3 = fft3([row0[3], row1[3] * twiddle2, row2[3] * twiddle5]);
263 let col4 = fft3([row0[4], row1[4] * twiddle3, row2[4] * twiddle7]);
264 let col5 = fft3([row0[5], row1[5] * twiddle4, row2[5] * twiddle8]);
265 let col6 = fft3([row0[6], row1[6] * twiddle5, row2[6] * twiddle9]);
266 let col7 = fft3([row0[7], row1[7] * twiddle6, row2[7] * twiddle10]);
267 let col8 = fft3([row0[8], row1[8] * twiddle7, row2[8] * twiddle11]);
268
269 [
270 col0[0], col1[0], col2[0], col3[0], col4[0], col5[0], col6[0], col7[0], col8[0], col0[1],
271 col1[1], col2[1], col3[1], col4[1], col5[1], col6[1], col7[1], col8[1], col0[2], col1[2],
272 col2[2], col3[2], col4[2], col5[2], col6[2], col7[2], col8[2],
273 ]
274}
275
276#[doc = concat!("Inner FFT")]
277#[inline]
278pub fn fft125<T: Float + FloatConst, A: AsRef<[Complex<T>]>>(input: A) -> [Complex<T>; 125] {
279 let n = 125;
280 let x = input.as_ref();
281 assert_eq!(n, x.len());
282
283 let twiddle0 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
284 let twiddle1 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
285 let twiddle2 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
286 let twiddle3 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
287 let twiddle4 = Complex::new(
288 T::from(0.9685831611286311).unwrap(),
289 T::from(-0.2486898871648548).unwrap(),
290 );
291 let twiddle5 = Complex::new(
292 T::from(0.8763066800438636).unwrap(),
293 T::from(-0.4817536741017153).unwrap(),
294 );
295 let twiddle6 = Complex::new(
296 T::from(0.7289686274214116).unwrap(),
297 T::from(-0.6845471059286887).unwrap(),
298 );
299 let twiddle7 = Complex::new(
300 T::from(0.5358267949789965).unwrap(),
301 T::from(-0.8443279255020151).unwrap(),
302 );
303 let twiddle8 = Complex::new(
304 T::from(0.8763066800438636).unwrap(),
305 T::from(-0.4817536741017153).unwrap(),
306 );
307 let twiddle9 = Complex::new(
308 T::from(0.5358267949789965).unwrap(),
309 T::from(-0.8443279255020151).unwrap(),
310 );
311 let twiddle10 = Complex::new(
312 T::from(0.0627905195293133).unwrap(),
313 T::from(-0.9980267284282716).unwrap(),
314 );
315 let twiddle11 = Complex::new(
316 T::from(-0.4257792915650727).unwrap(),
317 T::from(-0.9048270524660195).unwrap(),
318 );
319 let twiddle12 = Complex::new(
320 T::from(0.7289686274214116).unwrap(),
321 T::from(-0.6845471059286887).unwrap(),
322 );
323 let twiddle13 = Complex::new(
324 T::from(0.0627905195293133).unwrap(),
325 T::from(-0.9980267284282716).unwrap(),
326 );
327 let twiddle14 = Complex::new(
328 T::from(-0.6374239897486897).unwrap(),
329 T::from(-0.7705132427757893).unwrap(),
330 );
331 let twiddle15 = Complex::new(
332 T::from(-0.9921147013144779).unwrap(),
333 T::from(-0.1253332335643041).unwrap(),
334 );
335 let twiddle16 = Complex::new(
336 T::from(0.5358267949789965).unwrap(),
337 T::from(-0.8443279255020151).unwrap(),
338 );
339 let twiddle17 = Complex::new(
340 T::from(-0.4257792915650727).unwrap(),
341 T::from(-0.9048270524660195).unwrap(),
342 );
343 let twiddle18 = Complex::new(
344 T::from(-0.9921147013144779).unwrap(),
345 T::from(-0.1253332335643041).unwrap(),
346 );
347 let twiddle19 = Complex::new(
348 T::from(-0.6374239897486895).unwrap(),
349 T::from(0.7705132427757894).unwrap(),
350 );
351 let twiddle20 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
352 let twiddle21 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
353 let twiddle22 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
354 let twiddle23 = Complex::new(T::from(1).unwrap(), T::from(-0).unwrap());
355 let twiddle24 = Complex::new(
356 T::from(0.9987369566060175).unwrap(),
357 T::from(-0.050244318179769556).unwrap(),
358 );
359 let twiddle25 = Complex::new(
360 T::from(0.9949510169813002).unwrap(),
361 T::from(-0.1003617148512149).unwrap(),
362 );
363 let twiddle26 = Complex::new(
364 T::from(0.9886517447379141).unwrap(),
365 T::from(-0.15022558912075706).unwrap(),
366 );
367 let twiddle27 = Complex::new(
368 T::from(0.9798550523842469).unwrap(),
369 T::from(-0.19970998051440703).unwrap(),
370 );
371 let twiddle28 = Complex::new(
372 T::from(0.9949510169813002).unwrap(),
373 T::from(-0.1003617148512149).unwrap(),
374 );
375 let twiddle29 = Complex::new(
376 T::from(0.9798550523842469).unwrap(),
377 T::from(-0.19970998051440703).unwrap(),
378 );
379 let twiddle30 = Complex::new(
380 T::from(0.954864544746643).unwrap(),
381 T::from(-0.2970415815770349).unwrap(),
382 );
383 let twiddle31 = Complex::new(
384 T::from(0.9202318473658704).unwrap(),
385 T::from(-0.3913736668372024).unwrap(),
386 );
387 let twiddle32 = Complex::new(
388 T::from(0.9886517447379141).unwrap(),
389 T::from(-0.15022558912075706).unwrap(),
390 );
391 let twiddle33 = Complex::new(
392 T::from(0.954864544746643).unwrap(),
393 T::from(-0.2970415815770349).unwrap(),
394 );
395 let twiddle34 = Complex::new(
396 T::from(0.8994052515663711).unwrap(),
397 T::from(-0.4371157666509329).unwrap(),
398 );
399 let twiddle35 = Complex::new(
400 T::from(0.8235325976284275).unwrap(),
401 T::from(-0.5672689491267565).unwrap(),
402 );
403 let twiddle36 = Complex::new(
404 T::from(0.9798550523842469).unwrap(),
405 T::from(-0.19970998051440703).unwrap(),
406 );
407 let twiddle37 = Complex::new(
408 T::from(0.9202318473658704).unwrap(),
409 T::from(-0.3913736668372024).unwrap(),
410 );
411 let twiddle38 = Complex::new(
412 T::from(0.8235325976284275).unwrap(),
413 T::from(-0.5672689491267565).unwrap(),
414 );
415 let twiddle39 = Complex::new(
416 T::from(0.6936533058128049).unwrap(),
417 T::from(-0.7203090248879068).unwrap(),
418 );
419 let twiddle40 = Complex::new(
420 T::from(0.9685831611286311).unwrap(),
421 T::from(-0.2486898871648548).unwrap(),
422 );
423 let twiddle41 = Complex::new(
424 T::from(0.8763066800438636).unwrap(),
425 T::from(-0.4817536741017153).unwrap(),
426 );
427 let twiddle42 = Complex::new(
428 T::from(0.7289686274214116).unwrap(),
429 T::from(-0.6845471059286887).unwrap(),
430 );
431 let twiddle43 = Complex::new(
432 T::from(0.5358267949789965).unwrap(),
433 T::from(-0.8443279255020151).unwrap(),
434 );
435 let twiddle44 = Complex::new(
436 T::from(0.954864544746643).unwrap(),
437 T::from(-0.2970415815770349).unwrap(),
438 );
439 let twiddle45 = Complex::new(
440 T::from(0.8235325976284275).unwrap(),
441 T::from(-0.5672689491267565).unwrap(),
442 );
443 let twiddle46 = Complex::new(
444 T::from(0.6178596130903343).unwrap(),
445 T::from(-0.7862884321366189).unwrap(),
446 );
447 let twiddle47 = Complex::new(
448 T::from(0.35641187871325075).unwrap(),
449 T::from(-0.934328942456612).unwrap(),
450 );
451 let twiddle48 = Complex::new(
452 T::from(0.9387338576538741).unwrap(),
453 T::from(-0.34464292317451706).unwrap(),
454 );
455 let twiddle49 = Complex::new(
456 T::from(0.7624425110114479).unwrap(),
457 T::from(-0.6470559615694443).unwrap(),
458 );
459 let twiddle50 = Complex::new(
460 T::from(0.49272734154829156).unwrap(),
461 T::from(-0.8701837546695257).unwrap(),
462 );
463 let twiddle51 = Complex::new(
464 T::from(0.1626371651948835).unwrap(),
465 T::from(-0.986685944207868).unwrap(),
466 );
467 let twiddle52 = Complex::new(
468 T::from(0.9202318473658704).unwrap(),
469 T::from(-0.3913736668372024).unwrap(),
470 );
471 let twiddle53 = Complex::new(
472 T::from(0.6936533058128049).unwrap(),
473 T::from(-0.7203090248879068).unwrap(),
474 );
475 let twiddle54 = Complex::new(
476 T::from(0.35641187871325075).unwrap(),
477 T::from(-0.934328942456612).unwrap(),
478 );
479 let twiddle55 = Complex::new(
480 T::from(-0.037690182669934576).unwrap(),
481 T::from(-0.9992894726405892).unwrap(),
482 );
483 let twiddle56 = Complex::new(
484 T::from(0.8994052515663711).unwrap(),
485 T::from(-0.4371157666509329).unwrap(),
486 );
487 let twiddle57 = Complex::new(
488 T::from(0.6178596130903343).unwrap(),
489 T::from(-0.7862884321366189).unwrap(),
490 );
491 let twiddle58 = Complex::new(
492 T::from(0.21200710992205452).unwrap(),
493 T::from(-0.9772681235681935).unwrap(),
494 );
495 let twiddle59 = Complex::new(
496 T::from(-0.23649899702372465).unwrap(),
497 T::from(-0.971631732914674).unwrap(),
498 );
499 let twiddle60 = Complex::new(
500 T::from(0.8763066800438636).unwrap(),
501 T::from(-0.4817536741017153).unwrap(),
502 );
503 let twiddle61 = Complex::new(
504 T::from(0.5358267949789965).unwrap(),
505 T::from(-0.8443279255020151).unwrap(),
506 );
507 let twiddle62 = Complex::new(
508 T::from(0.0627905195293133).unwrap(),
509 T::from(-0.9980267284282716).unwrap(),
510 );
511 let twiddle63 = Complex::new(
512 T::from(-0.4257792915650727).unwrap(),
513 T::from(-0.9048270524660195).unwrap(),
514 );
515 let twiddle64 = Complex::new(
516 T::from(0.8509944817946918).unwrap(),
517 T::from(-0.5251746299612957).unwrap(),
518 );
519 let twiddle65 = Complex::new(
520 T::from(0.44838321609003223).unwrap(),
521 T::from(-0.8938414241512638).unwrap(),
522 );
523 let twiddle66 = Complex::new(
524 T::from(-0.0878511965507432).unwrap(),
525 T::from(-0.9961336091431725).unwrap(),
526 );
527 let twiddle67 = Complex::new(
528 T::from(-0.5979049830575189).unwrap(),
529 T::from(-0.8015669848708765).unwrap(),
530 );
531 let twiddle68 = Complex::new(
532 T::from(0.8235325976284275).unwrap(),
533 T::from(-0.5672689491267565).unwrap(),
534 );
535 let twiddle69 = Complex::new(
536 T::from(0.35641187871325075).unwrap(),
537 T::from(-0.934328942456612).unwrap(),
538 );
539 let twiddle70 = Complex::new(
540 T::from(-0.23649899702372465).unwrap(),
541 T::from(-0.971631732914674).unwrap(),
542 );
543 let twiddle71 = Complex::new(
544 T::from(-0.7459411454241821).unwrap(),
545 T::from(-0.6660118674342517).unwrap(),
546 );
547 let twiddle72 = Complex::new(
548 T::from(0.7939903986478354).unwrap(),
549 T::from(-0.6079302976946054).unwrap(),
550 );
551 let twiddle73 = Complex::new(
552 T::from(0.260841506289897).unwrap(),
553 T::from(-0.9653816388332739).unwrap(),
554 );
555 let twiddle74 = Complex::new(
556 T::from(-0.3797790955218012).unwrap(),
557 T::from(-0.925077206834458).unwrap(),
558 );
559 let twiddle75 = Complex::new(
560 T::from(-0.8639234171928353).unwrap(),
561 T::from(-0.5036232016357609).unwrap(),
562 );
563 let twiddle76 = Complex::new(
564 T::from(0.7624425110114479).unwrap(),
565 T::from(-0.6470559615694443).unwrap(),
566 );
567 let twiddle77 = Complex::new(
568 T::from(0.1626371651948835).unwrap(),
569 T::from(-0.986685944207868).unwrap(),
570 );
571 let twiddle78 = Complex::new(
572 T::from(-0.5144395337815065).unwrap(),
573 T::from(-0.8575266561936522).unwrap(),
574 );
575 let twiddle79 = Complex::new(
576 T::from(-0.9470983049947443).unwrap(),
577 T::from(-0.32094360980720926).unwrap(),
578 );
579 let twiddle80 = Complex::new(
580 T::from(0.7289686274214116).unwrap(),
581 T::from(-0.6845471059286887).unwrap(),
582 );
583 let twiddle81 = Complex::new(
584 T::from(0.0627905195293133).unwrap(),
585 T::from(-0.9980267284282716).unwrap(),
586 );
587 let twiddle82 = Complex::new(
588 T::from(-0.6374239897486897).unwrap(),
589 T::from(-0.7705132427757893).unwrap(),
590 );
591 let twiddle83 = Complex::new(
592 T::from(-0.9921147013144779).unwrap(),
593 T::from(-0.1253332335643041).unwrap(),
594 );
595 let twiddle84 = Complex::new(
596 T::from(0.6936533058128049).unwrap(),
597 T::from(-0.7203090248879068).unwrap(),
598 );
599 let twiddle85 = Complex::new(
600 T::from(-0.037690182669934576).unwrap(),
601 T::from(-0.9992894726405892).unwrap(),
602 );
603 let twiddle86 = Complex::new(
604 T::from(-0.7459411454241821).unwrap(),
605 T::from(-0.6660118674342517).unwrap(),
606 );
607 let twiddle87 = Complex::new(
608 T::from(-0.9971589002606139).unwrap(),
609 T::from(0.07532680552793279).unwrap(),
610 );
611 let twiddle88 = Complex::new(
612 T::from(0.6565857557529564).unwrap(),
613 T::from(-0.7542513807361038).unwrap(),
614 );
615 let twiddle89 = Complex::new(
616 T::from(-0.13779029068463805).unwrap(),
617 T::from(-0.9904614256966512).unwrap(),
618 );
619 let twiddle90 = Complex::new(
620 T::from(-0.8375280400421417).unwrap(),
621 T::from(-0.5463943467342692).unwrap(),
622 );
623 let twiddle91 = Complex::new(
624 T::from(-0.9620276715860859).unwrap(),
625 T::from(0.2729519355173252).unwrap(),
626 );
627 let twiddle92 = Complex::new(
628 T::from(0.6178596130903343).unwrap(),
629 T::from(-0.7862884321366189).unwrap(),
630 );
631 let twiddle93 = Complex::new(
632 T::from(-0.23649899702372465).unwrap(),
633 T::from(-0.971631732914674).unwrap(),
634 );
635 let twiddle94 = Complex::new(
636 T::from(-0.9101059706849958).unwrap(),
637 T::from(-0.4143755809932839).unwrap(),
638 );
639 let twiddle95 = Complex::new(
640 T::from(-0.8881364488135446).unwrap(),
641 T::from(0.45957986062148776).unwrap(),
642 );
643 let twiddle96 = Complex::new(
644 T::from(0.5775727034222675).unwrap(),
645 T::from(-0.816339250717184).unwrap(),
646 );
647 let twiddle97 = Complex::new(
648 T::from(-0.3328195445229868).unwrap(),
649 T::from(-0.9429905358928644).unwrap(),
650 );
651 let twiddle98 = Complex::new(
652 T::from(-0.9620276715860859).unwrap(),
653 T::from(-0.27295193551732505).unwrap(),
654 );
655 let twiddle99 = Complex::new(
656 T::from(-0.7784623015670232).unwrap(),
657 T::from(0.6276913612907007).unwrap(),
658 );
659 let twiddle100 = Complex::new(
660 T::from(0.5358267949789965).unwrap(),
661 T::from(-0.8443279255020151).unwrap(),
662 );
663 let twiddle101 = Complex::new(
664 T::from(-0.4257792915650727).unwrap(),
665 T::from(-0.9048270524660195).unwrap(),
666 );
667 let twiddle102 = Complex::new(
668 T::from(-0.9921147013144779).unwrap(),
669 T::from(-0.1253332335643041).unwrap(),
670 );
671 let twiddle103 = Complex::new(
672 T::from(-0.6374239897486895).unwrap(),
673 T::from(0.7705132427757894).unwrap(),
674 );
675 let twiddle104 = Complex::new(
676 T::from(0.49272734154829156).unwrap(),
677 T::from(-0.8701837546695257).unwrap(),
678 );
679 let twiddle105 = Complex::new(
680 T::from(-0.5144395337815065).unwrap(),
681 T::from(-0.8575266561936522).unwrap(),
682 );
683 let twiddle106 = Complex::new(
684 T::from(-0.9996841892832999).unwrap(),
685 T::from(0.02513009544333757).unwrap(),
686 );
687 let twiddle107 = Complex::new(
688 T::from(-0.47070393216533246).unwrap(),
689 T::from(0.8822912264349533).unwrap(),
690 );
691 let twiddle108 = Complex::new(
692 T::from(0.44838321609003223).unwrap(),
693 T::from(-0.8938414241512638).unwrap(),
694 );
695 let twiddle109 = Complex::new(
696 T::from(-0.5979049830575189).unwrap(),
697 T::from(-0.8015669848708765).unwrap(),
698 );
699 let twiddle110 = Complex::new(
700 T::from(-0.9845643345292053).unwrap(),
701 T::from(0.1750230589752761).unwrap(),
702 );
703 let twiddle111 = Complex::new(
704 T::from(-0.2850192624699761).unwrap(),
705 T::from(0.958521789017376).unwrap(),
706 );
707 let twiddle112 = Complex::new(
708 T::from(0.4029064357136627).unwrap(),
709 T::from(-0.9152411726209175).unwrap(),
710 );
711 let twiddle113 = Complex::new(
712 T::from(-0.6753328081210245).unwrap(),
713 T::from(-0.7375131173581739).unwrap(),
714 );
715 let twiddle114 = Complex::new(
716 T::from(-0.9470983049947443).unwrap(),
717 T::from(0.3209436098072095).unwrap(),
718 );
719 let twiddle115 = Complex::new(
720 T::from(-0.08785119655074321).unwrap(),
721 T::from(0.9961336091431725).unwrap(),
722 );
723 let twiddle116 = Complex::new(
724 T::from(0.35641187871325075).unwrap(),
725 T::from(-0.934328942456612).unwrap(),
726 );
727 let twiddle117 = Complex::new(
728 T::from(-0.7459411454241821).unwrap(),
729 T::from(-0.6660118674342517).unwrap(),
730 );
731 let twiddle118 = Complex::new(
732 T::from(-0.8881364488135446).unwrap(),
733 T::from(0.45957986062148776).unwrap(),
734 );
735 let twiddle119 = Complex::new(
736 T::from(0.11285638487348157).unwrap(),
737 T::from(0.9936113105200084).unwrap(),
738 );
739
740 let row0 = fft5([x[0], x[25], x[50], x[75], x[100]]);
741 let row1 = fft5([x[5], x[30], x[55], x[80], x[105]]);
742 let row2 = fft5([x[10], x[35], x[60], x[85], x[110]]);
743 let row3 = fft5([x[15], x[40], x[65], x[90], x[115]]);
744 let row4 = fft5([x[20], x[45], x[70], x[95], x[120]]);
745 let row5 = fft5([x[1], x[26], x[51], x[76], x[101]]);
746 let row6 = fft5([x[6], x[31], x[56], x[81], x[106]]);
747 let row7 = fft5([x[11], x[36], x[61], x[86], x[111]]);
748 let row8 = fft5([x[16], x[41], x[66], x[91], x[116]]);
749 let row9 = fft5([x[21], x[46], x[71], x[96], x[121]]);
750
751 let row10 = fft5([x[2], x[2 + 25], x[2 + 50], x[2 + 75], x[2 + 100]]);
752 let row11 = fft5([x[2 + 5], x[2 + 30], x[2 + 55], x[2 + 80], x[2 + 105]]);
753 let row12 = fft5([x[2 + 10], x[2 + 35], x[2 + 60], x[2 + 85], x[2 + 110]]);
754 let row13 = fft5([x[2 + 15], x[2 + 40], x[2 + 65], x[2 + 90], x[2 + 115]]);
755 let row14 = fft5([x[2 + 20], x[2 + 45], x[2 + 70], x[2 + 95], x[2 + 120]]);
756 let row15 = fft5([x[2 + 1], x[2 + 26], x[2 + 51], x[2 + 76], x[2 + 101]]);
757 let row16 = fft5([x[2 + 6], x[2 + 31], x[2 + 56], x[2 + 81], x[2 + 106]]);
758 let row17 = fft5([x[2 + 11], x[2 + 36], x[2 + 61], x[2 + 86], x[2 + 111]]);
759 let row18 = fft5([x[2 + 16], x[2 + 41], x[2 + 66], x[2 + 91], x[2 + 116]]);
760 let row19 = fft5([x[2 + 21], x[2 + 46], x[2 + 71], x[2 + 96], x[2 + 121]]);
761
762 let row20 = fft5([x[4], x[4 + 25], x[4 + 50], x[4 + 75], x[4 + 100]]);
763 let row21 = fft5([x[4 + 5], x[4 + 30], x[4 + 55], x[4 + 80], x[4 + 105]]);
764 let row22 = fft5([x[4 + 10], x[4 + 35], x[4 + 60], x[4 + 85], x[4 + 110]]);
765 let row23 = fft5([x[4 + 15], x[4 + 40], x[4 + 65], x[4 + 90], x[4 + 115]]);
766 let row24 = fft5([x[4 + 20], x[4 + 45], x[4 + 70], x[4 + 95], x[4 + 120]]);
767
768 let col0 = fft5([
769 row0[0],
770 row1[0] * twiddle0,
771 row2[0] * twiddle1,
772 row3[0] * twiddle2,
773 row4[0] * twiddle3,
774 ]);
775 let col1 = fft5([
776 row0[1],
777 row1[1] * twiddle4,
778 row2[1] * twiddle5,
779 row3[1] * twiddle6,
780 row4[1] * twiddle7,
781 ]);
782 let col2 = fft5([
783 row0[2],
784 row1[2] * twiddle8,
785 row2[2] * twiddle9,
786 row3[2] * twiddle10,
787 row4[2] * twiddle11,
788 ]);
789 let col3 = fft5([
790 row0[3],
791 row1[3] * twiddle12,
792 row2[3] * twiddle13,
793 row3[3] * twiddle14,
794 row4[3] * twiddle15,
795 ]);
796 let col4 = fft5([
797 row0[4],
798 row1[4] * twiddle16,
799 row2[4] * twiddle17,
800 row3[4] * twiddle18,
801 row4[4] * twiddle19,
802 ]);
803
804 let col5 = fft5([
805 row5[0],
806 row6[0] * twiddle0,
807 row7[0] * twiddle1,
808 row8[0] * twiddle2,
809 row9[0] * twiddle3,
810 ]);
811 let col6 = fft5([
812 row5[1],
813 row6[1] * twiddle4,
814 row7[1] * twiddle5,
815 row8[1] * twiddle6,
816 row9[1] * twiddle7,
817 ]);
818 let col7 = fft5([
819 row5[2],
820 row6[2] * twiddle8,
821 row7[2] * twiddle9,
822 row8[2] * twiddle10,
823 row9[2] * twiddle11,
824 ]);
825 let col8 = fft5([
826 row5[3],
827 row6[3] * twiddle12,
828 row7[3] * twiddle13,
829 row8[3] * twiddle14,
830 row9[3] * twiddle15,
831 ]);
832 let col9 = fft5([
833 row5[4],
834 row6[4] * twiddle16,
835 row7[4] * twiddle17,
836 row8[4] * twiddle18,
837 row9[4] * twiddle19,
838 ]);
839
840 let col10 = fft5([
841 row10[0],
842 row11[0] * twiddle0,
843 row12[0] * twiddle1,
844 row13[0] * twiddle2,
845 row14[0] * twiddle3,
846 ]);
847 let col11 = fft5([
848 row10[1],
849 row11[1] * twiddle4,
850 row12[1] * twiddle5,
851 row13[1] * twiddle6,
852 row14[1] * twiddle7,
853 ]);
854 let col12 = fft5([
855 row10[2],
856 row11[2] * twiddle8,
857 row12[2] * twiddle9,
858 row13[2] * twiddle10,
859 row14[2] * twiddle11,
860 ]);
861 let col13 = fft5([
862 row10[3],
863 row11[3] * twiddle12,
864 row12[3] * twiddle13,
865 row13[3] * twiddle14,
866 row14[3] * twiddle15,
867 ]);
868 let col14 = fft5([
869 row10[4],
870 row11[4] * twiddle16,
871 row12[4] * twiddle17,
872 row13[4] * twiddle18,
873 row14[4] * twiddle19,
874 ]);
875
876 let col15 = fft5([
877 row15[0],
878 row16[0] * twiddle0,
879 row17[0] * twiddle1,
880 row18[0] * twiddle2,
881 row19[0] * twiddle3,
882 ]);
883 let col16 = fft5([
884 row15[1],
885 row16[1] * twiddle4,
886 row17[1] * twiddle5,
887 row18[1] * twiddle6,
888 row19[1] * twiddle7,
889 ]);
890 let col17 = fft5([
891 row15[2],
892 row16[2] * twiddle8,
893 row17[2] * twiddle9,
894 row18[2] * twiddle10,
895 row19[2] * twiddle11,
896 ]);
897 let col18 = fft5([
898 row15[3],
899 row16[3] * twiddle12,
900 row17[3] * twiddle13,
901 row18[3] * twiddle14,
902 row19[3] * twiddle15,
903 ]);
904 let col19 = fft5([
905 row15[4],
906 row16[4] * twiddle16,
907 row17[4] * twiddle17,
908 row18[4] * twiddle18,
909 row19[4] * twiddle19,
910 ]);
911
912 let col20 = fft5([
913 row20[0],
914 row21[0] * twiddle0,
915 row22[0] * twiddle1,
916 row23[0] * twiddle2,
917 row24[0] * twiddle3,
918 ]);
919 let col21 = fft5([
920 row20[1],
921 row21[1] * twiddle4,
922 row22[1] * twiddle5,
923 row23[1] * twiddle6,
924 row24[1] * twiddle7,
925 ]);
926 let col22 = fft5([
927 row20[2],
928 row21[2] * twiddle8,
929 row22[2] * twiddle9,
930 row23[2] * twiddle10,
931 row24[2] * twiddle11,
932 ]);
933 let col23 = fft5([
934 row20[3],
935 row21[3] * twiddle12,
936 row22[3] * twiddle13,
937 row23[3] * twiddle14,
938 row24[3] * twiddle15,
939 ]);
940 let col24 = fft5([
941 row20[4],
942 row21[4] * twiddle16,
943 row22[4] * twiddle17,
944 row23[4] * twiddle18,
945 row24[4] * twiddle19,
946 ]);
947
948 let row0 = fft5([
949 col0[0],
950 col5[0] * twiddle20,
951 col10[0] * twiddle21,
952 col15[0] * twiddle22,
953 col20[0] * twiddle23,
954 ]);
955 let row1 = fft5([
956 col1[0],
957 col6[0] * twiddle24,
958 col11[0] * twiddle25,
959 col16[0] * twiddle26,
960 col21[0] * twiddle27,
961 ]);
962 let row2 = fft5([
963 col2[0],
964 col7[0] * twiddle28,
965 col12[0] * twiddle29,
966 col17[0] * twiddle30,
967 col22[0] * twiddle31,
968 ]);
969 let row3 = fft5([
970 col3[0],
971 col8[0] * twiddle32,
972 col13[0] * twiddle33,
973 col18[0] * twiddle34,
974 col23[0] * twiddle35,
975 ]);
976 let row4 = fft5([
977 col4[0],
978 col9[0] * twiddle36,
979 col14[0] * twiddle37,
980 col19[0] * twiddle38,
981 col24[0] * twiddle39,
982 ]);
983
984 let row5 = fft5([
985 col0[1],
986 col5[1] * twiddle40,
987 col10[1] * twiddle41,
988 col15[1] * twiddle42,
989 col20[1] * twiddle43,
990 ]);
991 let row6 = fft5([
992 col1[1],
993 col6[1] * twiddle44,
994 col11[1] * twiddle45,
995 col16[1] * twiddle46,
996 col21[1] * twiddle47,
997 ]);
998 let row7 = fft5([
999 col2[1],
1000 col7[1] * twiddle48,
1001 col12[1] * twiddle49,
1002 col17[1] * twiddle50,
1003 col22[1] * twiddle51,
1004 ]);
1005 let row8 = fft5([
1006 col3[1],
1007 col8[1] * twiddle52,
1008 col13[1] * twiddle53,
1009 col18[1] * twiddle54,
1010 col23[1] * twiddle55,
1011 ]);
1012 let row9 = fft5([
1013 col4[1],
1014 col9[1] * twiddle56,
1015 col14[1] * twiddle57,
1016 col19[1] * twiddle58,
1017 col24[1] * twiddle59,
1018 ]);
1019
1020 let row10 = fft5([
1021 col0[2],
1022 col5[2] * twiddle60,
1023 col10[2] * twiddle61,
1024 col15[2] * twiddle62,
1025 col20[2] * twiddle63,
1026 ]);
1027 let row11 = fft5([
1028 col1[2],
1029 col6[2] * twiddle64,
1030 col11[2] * twiddle65,
1031 col16[2] * twiddle66,
1032 col21[2] * twiddle67,
1033 ]);
1034 let row12 = fft5([
1035 col2[2],
1036 col7[2] * twiddle68,
1037 col12[2] * twiddle69,
1038 col17[2] * twiddle70,
1039 col22[2] * twiddle71,
1040 ]);
1041 let row13 = fft5([
1042 col3[2],
1043 col8[2] * twiddle72,
1044 col13[2] * twiddle73,
1045 col18[2] * twiddle74,
1046 col23[2] * twiddle75,
1047 ]);
1048 let row14 = fft5([
1049 col4[2],
1050 col9[2] * twiddle76,
1051 col14[2] * twiddle77,
1052 col19[2] * twiddle78,
1053 col24[2] * twiddle79,
1054 ]);
1055
1056 let row15 = fft5([
1057 col0[3],
1058 col5[3] * twiddle80,
1059 col10[3] * twiddle81,
1060 col15[3] * twiddle82,
1061 col20[3] * twiddle83,
1062 ]);
1063 let row16 = fft5([
1064 col1[3],
1065 col6[3] * twiddle84,
1066 col11[3] * twiddle85,
1067 col16[3] * twiddle86,
1068 col21[3] * twiddle87,
1069 ]);
1070 let row17 = fft5([
1071 col2[3],
1072 col7[3] * twiddle88,
1073 col12[3] * twiddle89,
1074 col17[3] * twiddle90,
1075 col22[3] * twiddle91,
1076 ]);
1077 let row18 = fft5([
1078 col3[3],
1079 col8[3] * twiddle92,
1080 col13[3] * twiddle93,
1081 col18[3] * twiddle94,
1082 col23[3] * twiddle95,
1083 ]);
1084 let row19 = fft5([
1085 col4[3],
1086 col9[3] * twiddle96,
1087 col14[3] * twiddle97,
1088 col19[3] * twiddle98,
1089 col24[3] * twiddle99,
1090 ]);
1091
1092 let row20 = fft5([
1093 col0[4],
1094 col5[4] * twiddle100,
1095 col10[4] * twiddle101,
1096 col15[4] * twiddle102,
1097 col20[4] * twiddle103,
1098 ]);
1099 let row21 = fft5([
1100 col1[4],
1101 col6[4] * twiddle104,
1102 col11[4] * twiddle105,
1103 col16[4] * twiddle106,
1104 col21[4] * twiddle107,
1105 ]);
1106 let row22 = fft5([
1107 col2[4],
1108 col7[4] * twiddle108,
1109 col12[4] * twiddle109,
1110 col17[4] * twiddle110,
1111 col22[4] * twiddle111,
1112 ]);
1113 let row23 = fft5([
1114 col3[4],
1115 col8[4] * twiddle112,
1116 col13[4] * twiddle113,
1117 col18[4] * twiddle114,
1118 col23[4] * twiddle115,
1119 ]);
1120 let row24 = fft5([
1121 col4[4],
1122 col9[4] * twiddle116,
1123 col14[4] * twiddle117,
1124 col19[4] * twiddle118,
1125 col24[4] * twiddle119,
1126 ]);
1127
1128 [
1129 row0[0], row1[0], row2[0], row3[0], row4[0], row5[0], row6[0], row7[0], row8[0], row9[0],
1130 row10[0], row11[0], row12[0], row13[0], row14[0], row15[0], row16[0], row17[0], row18[0],
1131 row19[0], row20[0], row21[0], row22[0], row23[0], row24[0], row0[1], row1[1], row2[1],
1132 row3[1], row4[1], row5[1], row6[1], row7[1], row8[1], row9[1], row10[1], row11[1],
1133 row12[1], row13[1], row14[1], row15[1], row16[1], row17[1], row18[1], row19[1], row20[1],
1134 row21[1], row22[1], row23[1], row24[1], row0[2], row1[2], row2[2], row3[2], row4[2],
1135 row5[2], row6[2], row7[2], row8[2], row9[2], row10[2], row11[2], row12[2], row13[2],
1136 row14[2], row15[2], row16[2], row17[2], row18[2], row19[2], row20[2], row21[2], row22[2],
1137 row23[2], row24[2], row0[3], row1[3], row2[3], row3[3], row4[3], row5[3], row6[3], row7[3],
1138 row8[3], row9[3], row10[3], row11[3], row12[3], row13[3], row14[3], row15[3], row16[3],
1139 row17[3], row18[3], row19[3], row20[3], row21[3], row22[3], row23[3], row24[3], row0[4],
1140 row1[4], row2[4], row3[4], row4[4], row5[4], row6[4], row7[4], row8[4], row9[4], row10[4],
1141 row11[4], row12[4], row13[4], row14[4], row15[4], row16[4], row17[4], row18[4], row19[4],
1142 row20[4], row21[4], row22[4], row23[4], row24[4],
1143 ]
1144}
1145
1146