use arb_dot in arb_poly series sin_cos and sinh_cosh + improve cutoffs

This commit is contained in:
fredrik 2018-08-22 02:09:56 +02:00
parent 20579719ef
commit 1465e566dd
6 changed files with 55 additions and 37 deletions

View file

@ -112,10 +112,6 @@ _arb_poly_exp_series(arb_ptr f, arb_srcptr h, slong hlen, slong n, slong prec)
_arb_vec_zero(f + j - d + 1, n - (j - d + 1));
arb_clear(t);
}
else if (hlen <= arb_poly_newton_exp_cutoff)
{
_arb_poly_exp_series_basecase(f, h, hlen, n, prec);
}
else
{
slong cutoff;

View file

@ -11,8 +11,6 @@
#include "arb_poly.h"
#define TANGENT_CUTOFF 240
void
_arb_poly_sin_cos_pi_series(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen, slong n, slong prec)
{
@ -36,11 +34,26 @@ _arb_poly_sin_cos_pi_series(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen, slon
arb_mul(c + 1, s, t, prec);
arb_clear(t);
}
else if (hlen < TANGENT_CUTOFF)
else
{
slong cutoff;
if (prec <= 128)
{
cutoff = 1400;
}
else
{
cutoff = 100000 / pow(log(prec), 3);
cutoff = FLINT_MIN(cutoff, 700);
}
if (hlen < cutoff)
_arb_poly_sin_cos_series_basecase(s, c, h, hlen, n, prec, 1);
else
_arb_poly_sin_cos_series_tangent(s, c, h, hlen, n, prec, 1);
}
}
void
arb_poly_sin_cos_pi_series(arb_poly_t s, arb_poly_t c,

View file

@ -11,8 +11,6 @@
#include "arb_poly.h"
#define TANGENT_CUTOFF 240
void
_arb_poly_sin_cos_series(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen, slong n, slong prec)
{
@ -35,11 +33,26 @@ _arb_poly_sin_cos_series(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen, slong n
arb_mul(c + 1, s, t, prec);
arb_clear(t);
}
else if (hlen < TANGENT_CUTOFF)
else
{
slong cutoff;
if (prec <= 128)
{
cutoff = 1400;
}
else
{
cutoff = 100000 / pow(log(prec), 3);
cutoff = FLINT_MIN(cutoff, 700);
}
if (hlen < cutoff)
_arb_poly_sin_cos_series_basecase(s, c, h, hlen, n, prec, 0);
else
_arb_poly_sin_cos_series_tangent(s, c, h, hlen, n, prec, 0);
}
}
void
arb_poly_sin_cos_series(arb_poly_t s, arb_poly_t c,

View file

@ -15,7 +15,7 @@ void
_arb_poly_sin_cos_series_basecase(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen,
slong n, slong prec, int times_pi)
{
slong j, k, alen = FLINT_MIN(n, hlen);
slong k, alen = FLINT_MIN(n, hlen);
arb_ptr a;
arb_t t, u;
@ -46,15 +46,8 @@ _arb_poly_sin_cos_series_basecase(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen
for (k = 1; k < n; k++)
{
arb_zero(t);
arb_zero(u);
for (j = 1; j < FLINT_MIN(k + 1, hlen); j++)
{
arb_submul(t, a + j, s + k - j, prec);
arb_addmul(u, a + j, c + k - j, prec);
}
arb_dot(t, NULL, 1, a + 1, 1, s + k - 1, -1, FLINT_MIN(k, hlen - 1), prec);
arb_dot(u, NULL, 0, a + 1, 1, c + k - 1, -1, FLINT_MIN(k, hlen - 1), prec);
arb_div_ui(c + k, t, k, prec);
arb_div_ui(s + k, u, k, prec);
}

View file

@ -32,11 +32,21 @@ _arb_poly_sinh_cosh_series(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen, slong
arb_mul(c + 1, s, t, prec);
arb_clear(t);
}
else if (hlen < 60 || n < 120)
else
{
slong cutoff;
if (prec <= 128)
cutoff = 400;
else
cutoff = 30000 / pow(log(prec), 3);
if (hlen < cutoff)
_arb_poly_sinh_cosh_series_basecase(s, c, h, hlen, n, prec);
else
_arb_poly_sinh_cosh_series_exponential(s, c, h, hlen, n, prec);
}
}
void
arb_poly_sinh_cosh_series(arb_poly_t s, arb_poly_t c,

View file

@ -15,7 +15,7 @@ void
_arb_poly_sinh_cosh_series_basecase(arb_ptr s, arb_ptr c, arb_srcptr h, slong hlen,
slong n, slong prec)
{
slong j, k, alen = FLINT_MIN(n, hlen);
slong k, alen = FLINT_MIN(n, hlen);
arb_ptr a;
arb_t t, u;
@ -37,15 +37,8 @@ _arb_poly_sinh_cosh_series_basecase(arb_ptr s, arb_ptr c, arb_srcptr h, slong hl
for (k = 1; k < n; k++)
{
arb_zero(t);
arb_zero(u);
for (j = 1; j < FLINT_MIN(k + 1, hlen); j++)
{
arb_addmul(t, a + j, s + k - j, prec);
arb_addmul(u, a + j, c + k - j, prec);
}
arb_dot(t, NULL, 0, a + 1, 1, s + k - 1, -1, FLINT_MIN(k, hlen - 1), prec);
arb_dot(u, NULL, 0, a + 1, 1, c + k - 1, -1, FLINT_MIN(k, hlen - 1), prec);
arb_div_ui(c + k, t, k, prec);
arb_div_ui(s + k, u, k, prec);
}