add acb_dft function

This commit is contained in:
Pascal 2017-10-05 13:37:35 +02:00
parent 8e13588eb4
commit 33dafb4ff5
3 changed files with 18 additions and 4 deletions

View file

@ -194,6 +194,8 @@ void _acb_dft_precomp_init(acb_dft_pre_t pre, slong dv, acb_ptr z, slong dz, slo
void acb_dft_precomp_init(acb_dft_pre_t pre, slong len, slong prec);
void acb_dft_precomp_clear(acb_dft_pre_t pre);
void acb_dft(acb_ptr w, acb_srcptr v, slong len, slong prec);
acb_dft_step_ptr _acb_dft_steps_prod(slong * m, slong num, slong prec);
ACB_DFT_INLINE void
@ -299,6 +301,7 @@ _acb_vec_kronecker_mul(acb_ptr z, acb_srcptr x, acb_srcptr y, slong len, slong p
acb_mul(z + k, x + k, y + k, prec);
}
/* FIXME: no longer used */
/* z[k] = conj(x[k])*y[k] */
ACB_DFT_INLINE void
acb_vec_kronecker_mul_conj(acb_ptr z, acb_srcptr x, acb_srcptr y, slong len, slong prec)

View file

@ -18,9 +18,13 @@ acb_dft_bluestein_init(acb_dft_bluestein_t t, slong n, slong prec)
slong k, k2;
acb_ptr z2n;
int e = n_clog(2 * n - 1, 2);
#if DFT_VERB
flint_printf("\n init bluestein e = %i", e);
#endif
acb_dft_rad2_init(t->rad2, e, prec);
/* compute z[k] = e(-k^2/2n) */
/* TODO: check if this can be improved */
z2n = _acb_vec_init(2 * n);
_acb_vec_unit_roots(z2n, 2 * n, prec);
nmod_init(&n2, 2 * n);
@ -74,4 +78,3 @@ acb_dft_bluestein(acb_ptr w, acb_srcptr v, slong len, slong prec)
acb_dft_bluestein_precomp(w, v, t, prec);
acb_dft_bluestein_clear(t);
}

View file

@ -21,8 +21,7 @@ _acb_dft_precomp_init(acb_dft_pre_t pre, slong dv, acb_ptr z, slong dz, slong le
}
if (n_is_prime(len))
{
/* TODO: need convolution if len is large */
if (len < 20)
if (len < 100)
{
pre->type = DFT_NAIVE;
_acb_dft_naive_init(pre->t.naive, dv, z, dz, len, prec);
@ -31,7 +30,7 @@ _acb_dft_precomp_init(acb_dft_pre_t pre, slong dv, acb_ptr z, slong dz, slong le
{
pre->type = DFT_CONV;
/* FIXME: do not recompute the same bluestein
* scheme over and over */
* scheme if needed several times */
acb_dft_bluestein_init(pre->t.bluestein, len, prec);
}
}
@ -115,3 +114,12 @@ acb_dft_precomp(acb_ptr w, acb_srcptr v, const acb_dft_pre_t pre, slong prec)
break;
}
}
void
acb_dft(acb_ptr w, acb_srcptr v, slong len, slong prec)
{
acb_dft_pre_t t;
acb_dft_precomp_init(t, len, prec);
acb_dft_precomp(w, v, t, prec);
acb_dft_precomp_clear(t);
}