From ef612c71e2644cc65ab857831af96e368abac177 Mon Sep 17 00:00:00 2001 From: Fredrik Johansson Date: Thu, 25 Jul 2013 18:24:35 +0200 Subject: [PATCH] improve speed and stability of series composition/reversion by balancing the power table exponents --- fmprb_poly/compose_series_brent_kung.c | 2 +- fmprb_poly/revert_series_lagrange_fast.c | 3 ++- todo.txt | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/fmprb_poly/compose_series_brent_kung.c b/fmprb_poly/compose_series_brent_kung.c index bfd47666..8b4f95a7 100644 --- a/fmprb_poly/compose_series_brent_kung.c +++ b/fmprb_poly/compose_series_brent_kung.c @@ -59,7 +59,7 @@ _fmprb_poly_compose_series_brent_kung(fmprb_ptr res, fmprb_set_ui(A->rows[0] + 0, 1UL); _fmprb_vec_set(A->rows[1], poly2, len2); for (i = 2; i < m; i++) - _fmprb_poly_mullow(A->rows[i], A->rows[i-1], n, poly2, len2, n, prec); + _fmprb_poly_mullow(A->rows[i], A->rows[(i + 1) / 2], n, A->rows[i / 2], n, n, prec); fmprb_mat_mul(C, B, A, prec); diff --git a/fmprb_poly/revert_series_lagrange_fast.c b/fmprb_poly/revert_series_lagrange_fast.c index 754928f6..b4ce8852 100644 --- a/fmprb_poly/revert_series_lagrange_fast.c +++ b/fmprb_poly/revert_series_lagrange_fast.c @@ -56,7 +56,8 @@ _fmprb_poly_revert_series_lagrange_fast(fmprb_ptr Qinv, fmprb_srcptr Q, long n, _fmprb_poly_inv_series(Ri(1), Q + 1, n - 1, n - 1, prec); for (i = 2; i <= m; i++) - _fmprb_poly_mullow(Ri(i), Ri(i-1), n - 1, Ri(1), n - 1, n - 1, prec); + _fmprb_poly_mullow(Ri(i), Ri((i + 1) / 2), n - 1, Ri(i / 2), n - 1, n - 1, prec); + for (i = 2; i < m; i++) fmprb_div_ui(Qinv + i, Ri(i) + i - 1, i, prec); diff --git a/todo.txt b/todo.txt index e17fd381..510e0812 100644 --- a/todo.txt +++ b/todo.txt @@ -88,8 +88,6 @@ This is certainly faster when n is prime, but might be faster for all n, at least if implemented cleverly. -* Add polynomial squaring code, and exploit in pow, Brent-Kung, etc. - * Add polynomial mulmid, and use in Newton iteration * Tune basecase/Newton selection for exp/sin/cos series (the basecase