use arb_dot/acb_dot in more polynomial methods

This commit is contained in:
fredrik 2018-08-26 20:25:31 +02:00
parent ffa60bf319
commit a682aedb61
6 changed files with 24 additions and 40 deletions

View file

@ -51,21 +51,18 @@ _acb_poly_evaluate2_rectangular(acb_t y, acb_t z, acb_srcptr poly,
acb_init(c); acb_init(c);
_acb_vec_set_powers(xs, x, m + 1, prec); _acb_vec_set_powers(xs, x, m + 1, prec);
acb_dot(y, poly + (r - 1) * m, 0, xs + 1, 1,
acb_set(y, poly + (r - 1) * m); poly + (r - 1) * m + 1, 1, len - (r - 1) * m - 1, prec);
for (j = 1; (r - 1) * m + j < len; j++)
acb_addmul(y, xs + j, poly + (r - 1) * m + j, prec);
for (i = r - 2; i >= 0; i--) for (i = r - 2; i >= 0; i--)
{ {
acb_set(s, poly + i * m); acb_dot(s, poly + i * m, 0, xs + 1, 1,
for (j = 1; j < m; j++) poly + i * m + 1, 1, m - 1, prec);
acb_addmul(s, xs + j, poly + i * m + j, prec);
acb_mul(y, y, xs + m, prec); acb_mul(y, y, xs + m, prec);
acb_add(y, y, s, prec); acb_add(y, y, s, prec);
} }
/* todo: rewrite using acb_dot */
len -= 1; len -= 1;
r = (len + m - 1) / m; r = (len + m - 1) / m;
acb_mul_ui(z, poly + (r - 1) * m + 1, (r - 1) * m + 1, ARF_PREC_EXACT); acb_mul_ui(z, poly + (r - 1) * m + 1, (r - 1) * m + 1, ARF_PREC_EXACT);

View file

@ -15,7 +15,7 @@ void
_acb_poly_evaluate_rectangular(acb_t y, acb_srcptr poly, _acb_poly_evaluate_rectangular(acb_t y, acb_srcptr poly,
slong len, const acb_t x, slong prec) slong len, const acb_t x, slong prec)
{ {
slong i, j, m, r; slong i, m, r;
acb_ptr xs; acb_ptr xs;
acb_t s, t, c; acb_t s, t, c;
@ -46,17 +46,13 @@ _acb_poly_evaluate_rectangular(acb_t y, acb_srcptr poly,
acb_init(c); acb_init(c);
_acb_vec_set_powers(xs, x, m + 1, prec); _acb_vec_set_powers(xs, x, m + 1, prec);
acb_dot(y, poly + (r - 1) * m, 0, xs + 1, 1,
acb_set(y, poly + (r - 1) * m); poly + (r - 1) * m + 1, 1, len - (r - 1) * m - 1, prec);
for (j = 1; (r - 1) * m + j < len; j++)
acb_addmul(y, xs + j, poly + (r - 1) * m + j, prec);
for (i = r - 2; i >= 0; i--) for (i = r - 2; i >= 0; i--)
{ {
acb_set(s, poly + i * m); acb_dot(s, poly + i * m, 0, xs + 1, 1,
for (j = 1; j < m; j++) poly + i * m + 1, 1, m - 1, prec);
acb_addmul(s, xs + j, poly + i * m + j, prec);
acb_mul(y, y, xs + m, prec); acb_mul(y, y, xs + m, prec);
acb_add(y, y, s, prec); acb_add(y, y, s, prec);
} }

View file

@ -17,7 +17,7 @@
void void
_acb_poly_revert_series_lagrange_fast(acb_ptr Qinv, acb_srcptr Q, slong Qlen, slong n, slong prec) _acb_poly_revert_series_lagrange_fast(acb_ptr Qinv, acb_srcptr Q, slong Qlen, slong n, slong prec)
{ {
slong i, j, k, m; slong i, j, m;
acb_ptr R, S, T, tmp; acb_ptr R, S, T, tmp;
acb_t t; acb_t t;
@ -55,9 +55,7 @@ _acb_poly_revert_series_lagrange_fast(acb_ptr Qinv, acb_srcptr Q, slong Qlen, sl
for (j = 1; j < m && i + j < n; j++) for (j = 1; j < m && i + j < n; j++)
{ {
acb_mul(t, S + 0, Ri(j) + i + j - 1, prec); acb_dot(t, NULL, 0, S, 1, Ri(j) + i + j - 1, -1, i + j, prec);
for (k = 1; k <= i + j - 1; k++)
acb_addmul(t, S + k, Ri(j) + i + j - 1 - k, prec);
acb_div_ui(Qinv + i + j, t, i + j, prec); acb_div_ui(Qinv + i + j, t, i + j, prec);
} }

View file

@ -52,20 +52,18 @@ _arb_poly_evaluate2_rectangular(arb_t y, arb_t z, arb_srcptr poly,
_arb_vec_set_powers(xs, x, m + 1, prec); _arb_vec_set_powers(xs, x, m + 1, prec);
arb_set(y, poly + (r - 1) * m); arb_dot(y, poly + (r - 1) * m, 0, xs + 1, 1,
for (j = 1; (r - 1) * m + j < len; j++) poly + (r - 1) * m + 1, 1, len - (r - 1) * m - 1, prec);
arb_addmul(y, xs + j, poly + (r - 1) * m + j, prec);
for (i = r - 2; i >= 0; i--) for (i = r - 2; i >= 0; i--)
{ {
arb_set(s, poly + i * m); arb_dot(s, poly + i * m, 0, xs + 1, 1,
for (j = 1; j < m; j++) poly + i * m + 1, 1, m - 1, prec);
arb_addmul(s, xs + j, poly + i * m + j, prec);
arb_mul(y, y, xs + m, prec); arb_mul(y, y, xs + m, prec);
arb_add(y, y, s, prec); arb_add(y, y, s, prec);
} }
/* todo: rewrite using arb_dot */
len -= 1; len -= 1;
r = (len + m - 1) / m; r = (len + m - 1) / m;
arb_mul_ui(z, poly + (r - 1) * m + 1, (r - 1) * m + 1, ARF_PREC_EXACT); arb_mul_ui(z, poly + (r - 1) * m + 1, (r - 1) * m + 1, ARF_PREC_EXACT);

View file

@ -15,7 +15,7 @@ void
_arb_poly_evaluate_rectangular(arb_t y, arb_srcptr poly, _arb_poly_evaluate_rectangular(arb_t y, arb_srcptr poly,
slong len, const arb_t x, slong prec) slong len, const arb_t x, slong prec)
{ {
slong i, j, m, r; slong i, m, r;
arb_ptr xs; arb_ptr xs;
arb_t s, t, c; arb_t s, t, c;
@ -47,16 +47,13 @@ _arb_poly_evaluate_rectangular(arb_t y, arb_srcptr poly,
_arb_vec_set_powers(xs, x, m + 1, prec); _arb_vec_set_powers(xs, x, m + 1, prec);
arb_set(y, poly + (r - 1) * m); arb_dot(y, poly + (r - 1) * m, 0, xs + 1, 1,
for (j = 1; (r - 1) * m + j < len; j++) poly + (r - 1) * m + 1, 1, len - (r - 1) * m - 1, prec);
arb_addmul(y, xs + j, poly + (r - 1) * m + j, prec);
for (i = r - 2; i >= 0; i--) for (i = r - 2; i >= 0; i--)
{ {
arb_set(s, poly + i * m); arb_dot(s, poly + i * m, 0, xs + 1, 1,
for (j = 1; j < m; j++) poly + i * m + 1, 1, m - 1, prec);
arb_addmul(s, xs + j, poly + i * m + j, prec);
arb_mul(y, y, xs + m, prec); arb_mul(y, y, xs + m, prec);
arb_add(y, y, s, prec); arb_add(y, y, s, prec);
} }

View file

@ -17,7 +17,7 @@
void void
_arb_poly_revert_series_lagrange_fast(arb_ptr Qinv, arb_srcptr Q, slong Qlen, slong n, slong prec) _arb_poly_revert_series_lagrange_fast(arb_ptr Qinv, arb_srcptr Q, slong Qlen, slong n, slong prec)
{ {
slong i, j, k, m; slong i, j, m;
arb_ptr R, S, T, tmp; arb_ptr R, S, T, tmp;
arb_t t; arb_t t;
@ -55,9 +55,7 @@ _arb_poly_revert_series_lagrange_fast(arb_ptr Qinv, arb_srcptr Q, slong Qlen, sl
for (j = 1; j < m && i + j < n; j++) for (j = 1; j < m && i + j < n; j++)
{ {
arb_mul(t, S + 0, Ri(j) + i + j - 1, prec); arb_dot(t, NULL, 0, S, 1, Ri(j) + i + j - 1, -1, i + j, prec);
for (k = 1; k <= i + j - 1; k++)
arb_addmul(t, S + k, Ri(j) + i + j - 1 - k, prec);
arb_div_ui(Qinv + i + j, t, i + j, prec); arb_div_ui(Qinv + i + j, t, i + j, prec);
} }