From a6dc4358cc42df037c664cb8816a6f3a7f4bd38d Mon Sep 17 00:00:00 2001 From: Fredrik Johansson Date: Fri, 19 Jul 2013 16:33:14 +0200 Subject: [PATCH] improve series composition in the linear case --- fmprb_poly/compose_series.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/fmprb_poly/compose_series.c b/fmprb_poly/compose_series.c index 7c75d1dc..0a434d5e 100644 --- a/fmprb_poly/compose_series.c +++ b/fmprb_poly/compose_series.c @@ -29,10 +29,33 @@ void _fmprb_poly_compose_series(fmprb_ptr res, fmprb_srcptr poly1, long len1, fmprb_srcptr poly2, long len2, long n, long prec) { - if (len1 < 6 || n < 6) + if (len2 == 2) /* fast linear case (TODO: all monomials) */ + { + long i; + fmprb_t t; + + fmprb_init(t); + + fmprb_set(t, poly2 + 1); + fmprb_set_round(res, poly1, prec); + + for (i = 1; i < n; i++) + { + fmprb_mul(res + i, poly1 + i, t, prec); + if (i + 1 < n) + fmprb_mul(t, t, poly2 + 1, prec); + } + + fmprb_clear(t); + } + else if (len1 < 6 || n < 6) + { _fmprb_poly_compose_series_horner(res, poly1, len1, poly2, len2, n, prec); + } else + { _fmprb_poly_compose_series_brent_kung(res, poly1, len1, poly2, len2, n, prec); + } } void