From 1764c21c0328b24042e4a1e08900563bad37fc5b Mon Sep 17 00:00:00 2001 From: fredrik Date: Mon, 20 Aug 2018 22:43:16 +0200 Subject: [PATCH] use arb_dot in arb_poly division --- arb_poly/div_series.c | 14 +++----------- arb_poly/inv_series.c | 11 +++-------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/arb_poly/div_series.c b/arb_poly/div_series.c index 98561074..702e33c8 100644 --- a/arb_poly/div_series.c +++ b/arb_poly/div_series.c @@ -44,7 +44,7 @@ _arb_poly_div_series(arb_ptr Q, arb_srcptr A, slong Alen, { /* The basecase algorithm is faster for much larger Blen and n than this, but unfortunately has worse numerical stability. */ - slong i, j; + slong i; arb_t q; arb_init(q); @@ -54,16 +54,8 @@ _arb_poly_div_series(arb_ptr Q, arb_srcptr A, slong Alen, for (i = 1; i < n; i++) { - arb_mul(Q + i, B + 1, Q + i - 1, prec); - - for (j = 2; j < FLINT_MIN(i + 1, Blen); j++) - arb_addmul(Q + i, B + j, Q + i - j, prec); - - if (i < Alen) - arb_sub(Q + i, A + i, Q + i, prec); - else - arb_neg(Q + i, Q + i); - + arb_dot(Q + i, (i < Alen) ? A + i : NULL, 1, + B + 1, 1, Q + i - 1, -1, FLINT_MIN(i, Blen - 1), prec); if (!arb_is_one(q)) arb_mul(Q + i, Q + i, q, prec); } diff --git a/arb_poly/inv_series.c b/arb_poly/inv_series.c index 13ee5c71..08389ce1 100644 --- a/arb_poly/inv_series.c +++ b/arb_poly/inv_series.c @@ -37,7 +37,7 @@ _arb_poly_inv_series(arb_ptr Qinv, } else { - slong i, j, blen; + slong i, blen; /* The basecase algorithm is faster for much larger Qlen or len than this, but unfortunately also much less numerically stable. */ @@ -48,15 +48,10 @@ _arb_poly_inv_series(arb_ptr Qinv, for (i = 1; i < blen; i++) { - arb_mul(Qinv + i, Q + 1, Qinv + i - 1, prec); - - for (j = 2; j < FLINT_MIN(i + 1, Qlen); j++) - arb_addmul(Qinv + i, Q + j, Qinv + i - j, prec); - + arb_dot(Qinv + i, NULL, 1, + Q + 1, 1, Qinv + i - 1, -1, FLINT_MIN(i, Qlen - 1), prec); if (!arb_is_one(Qinv)) arb_mul(Qinv + i, Qinv + i, Qinv, prec); - - arb_neg(Qinv + i, Qinv + i); } if (len > blen)