49 static void butterfly(Elt* A,
size_t s,
const Field& F) {
56 static void butterflytw(Elt* A,
size_t s,
const Elt& twiddle,
68 static void fftb(Elt A[],
size_t n,
const Elt& omega,
69 uint64_t omega_order,
const Field& F) {
74 Elt omega_n = Twiddle<Field>::reroot(omega, omega_order, n, F);
77 Permutations<Elt>::bitrev(A, n);
80 for (
size_t k = 0; k < n; k += 2) {
81 butterfly(&A[k], 1, F);
85 for (
size_t m = 2; m < n; m = 2 * m) {
86 size_t ws = n / (2 * m);
87 for (
size_t k = 0; k < n; k += 2 * m) {
88 butterfly(&A[k], m, F);
89 for (
size_t j = 1; j < m; ++j) {
90 butterflytw(&A[k + j], m, roots.w_[j * ws], F);
97 static void fftf(Elt A[],
size_t n,
const Elt& omega,
98 uint64_t omega_order,
const Field& F) {
99 fftb(A, n, F.invertf(omega), omega_order, F);