use flint fft mpn_mul

This commit is contained in:
Fredrik Johansson 2022-05-18 15:43:00 +02:00
parent b74162a5a7
commit 8b2c1704f0
4 changed files with 24 additions and 6 deletions

View file

@ -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;
}

15
arf.h
View file

@ -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)); \
}

View file

@ -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)

View file

@ -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);