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