#include "acb_dft.h"
#define REORDER 0
void
acb_dft_step(acb_ptr w, acb_srcptr v, acb_dft_step_ptr cyc, slong num, slong prec)
{
acb_dft_step_struct c;
if (num == 0)
return;
c = cyc[0];
if (num == 1)
{
acb_dft_precomp(w, v, c.pre, prec);
}
else
{
slong i, j;
slong m = c.m, M = c.M, dv = c.dv, dz = c.dz;
acb_srcptr z = c.z;
acb_ptr t;
#if REORDER
acb_ptr w2;
#endif
t = _acb_vec_init(m * M);
if (w == v)
{
_acb_vec_set(t, v, m * M);
v = t;
}
for (i = 0; i < m; i++)
acb_dft_step(w + i * M, v + i * dv, cyc + 1, num - 1, prec);
if (c.z != NULL)
{
acb_ptr wi;
for (wi = w + M, i = 1; i < m; i++, wi += M)
for (j = 1; j < M; j++)
{
if (DFT_VERB)
flint_printf("z[%wu*%wu]",dz,i*j);
acb_mul(wi + j, wi + j, z + dz * i * j, prec);
}
if (DFT_VERB)
flint_printf("\n");
}
#if REORDER
w2 = flint_malloc(m * M * sizeof(acb_struct));
for (j = 0; j < M; j++)
for (i = 0; i < m; i++)
w2[j + M * i] = w[i + m * j];
#endif
for (j = 0; j < M; j++)
acb_dft_precomp(t + m * j, w + j, c.pre, prec);
for (i = 0; i < m; i++)
for (j = 0; j < M; j++)
acb_set(w + j + M * i, t + i + m * j);
_acb_vec_clear(t, m * M);
}
}