diff --git a/arb/ui_pow_ui.c b/arb/ui_pow_ui.c index 826cc196..48e69346 100644 --- a/arb/ui_pow_ui.c +++ b/arb/ui_pow_ui.c @@ -292,7 +292,10 @@ arb_ui_pow_ui(arb_t res, ulong a, ulong exp, slong prec) } else /* or exactly */ { - mpn_sqr(tmp, yman, yn); + if (ARF_USE_FFT_MUL(yn)) + flint_mpn_mul_fft_main(tmp, yman, yn, yman, yn); + else + mpn_sqr(tmp, yman, yn); yn = 2 * yn; } diff --git a/arf.h b/arf.h index 2c193f52..87da5762 100644 --- a/arf.h +++ b/arf.h @@ -826,6 +826,11 @@ void arf_urandom(arf_t x, flint_rand_t state, slong bits, arf_rnd_t rnd); r3 += r2 < t1; \ } while (0) +#define ARF_USE_FFT_MUL(_xn) ((_xn) > 10000) + +/* from flint/fft.h */ +void flint_mpn_mul_fft_main(mp_ptr r1, mp_srcptr i1, mp_size_t n1, mp_srcptr i2, mp_size_t n2); + #define ARF_MPN_MUL(_z, _x, _xn, _y, _yn) \ if ((_xn) == (_yn)) \ { \ @@ -842,19 +847,19 @@ void arf_urandom(arf_t x, flint_rand_t state, slong bits, arf_rnd_t rnd); __arb_y1 = (_y)[1]; \ nn_mul_2x2((_z)[3], (_z)[2], (_z)[1], (_z)[0], __arb_x1, __arb_x0, __arb_y1, __arb_y0); \ } \ + else if (ARF_USE_FFT_MUL(_xn)) \ + flint_mpn_mul_fft_main((_z), (_x), (_xn), (_y), (_yn)); \ else if ((_x) == (_y)) \ - { \ mpn_sqr((_z), (_x), (_xn)); \ - } \ else \ - { \ mpn_mul_n((_z), (_x), (_y), (_xn)); \ - } \ } \ else if ((_xn) > (_yn)) \ { \ if ((_yn) == 1) \ (_z)[(_xn) + (_yn) - 1] = mpn_mul_1((_z), (_x), (_xn), (_y)[0]); \ + else if (ARF_USE_FFT_MUL(_yn)) \ + flint_mpn_mul_fft_main((_z), (_x), (_xn), (_y), (_yn)); \ else \ mpn_mul((_z), (_x), (_xn), (_y), (_yn)); \ } \ @@ -862,6 +867,8 @@ void arf_urandom(arf_t x, flint_rand_t state, slong bits, arf_rnd_t rnd); { \ if ((_xn) == 1) \ (_z)[(_xn) + (_yn) - 1] = mpn_mul_1((_z), (_y), (_yn), (_x)[0]); \ + else if (ARF_USE_FFT_MUL(_xn)) \ + flint_mpn_mul_fft_main((_z), (_y), (_yn), (_x), (_xn)); \ else \ mpn_mul((_z), (_y), (_yn), (_x), (_xn)); \ } diff --git a/arf/mul_rnd_any.c b/arf/mul_rnd_any.c index bdb01e2e..5dbffa41 100644 --- a/arf/mul_rnd_any.c +++ b/arf/mul_rnd_any.c @@ -55,6 +55,10 @@ arf_mul_rnd_any(arf_ptr z, arf_srcptr x, arf_srcptr y, { tmp[zn - 1] = mpn_mul_1(tmp, xptr, xn, yptr[0]); } + else if (ARF_USE_FFT_MUL(yn)) + { + flint_mpn_mul_fft_main(tmp, xptr, xn, yptr, yn); + } else if (xn == yn) { if (xptr == yptr) diff --git a/arf/mul_rnd_down.c b/arf/mul_rnd_down.c index 731a1d54..3765b021 100644 --- a/arf/mul_rnd_down.c +++ b/arf/mul_rnd_down.c @@ -194,7 +194,11 @@ arf_mul_rnd_down(arf_ptr z, arf_srcptr x, arf_srcptr y, slong prec) alloc = zn = xn + yn; ARF_MUL_TMP_ALLOC(tmp, alloc) - if (xn == yn) + if (ARF_USE_FFT_MUL(yn)) + { + flint_mpn_mul_fft_main(tmp, xptr, xn, yptr, yn); + } + else if (xn == yn) { if (xptr == yptr) mpn_sqr(tmp, xptr, xn);