From 33dafb4ff579d468a5721cb1e540791b25e9e007 Mon Sep 17 00:00:00 2001 From: Pascal Date: Thu, 5 Oct 2017 13:37:35 +0200 Subject: [PATCH] add acb_dft function --- acb_dft.h | 3 +++ acb_dft/bluestein.c | 5 ++++- acb_dft/precomp.c | 14 +++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/acb_dft.h b/acb_dft.h index b638206f..189fb069 100644 --- a/acb_dft.h +++ b/acb_dft.h @@ -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) diff --git a/acb_dft/bluestein.c b/acb_dft/bluestein.c index a720f5e7..1482086f 100644 --- a/acb_dft/bluestein.c +++ b/acb_dft/bluestein.c @@ -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); } - diff --git a/acb_dft/precomp.c b/acb_dft/precomp.c index bd84e9c6..f3900605 100644 --- a/acb_dft/precomp.c +++ b/acb_dft/precomp.c @@ -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); +}