#include "arb.h"
#include "mpn_extras.h"
void
_arb_atan_taylor_naive(nn_ptr y, ulong * error,
nn_srcptr x, slong xn, ulong N, int alternating)
{
ulong k;
nn_ptr s, t, x1, x2, u;
slong nn = xn + 1;
if (N == 0)
{
flint_mpn_zero(y, xn);
error[0] = 0;
return;
}
if (N == 1)
{
flint_mpn_copyi(y, x, xn);
error[0] = 0;
}
s = flint_malloc(sizeof(ulong) * nn);
t = flint_malloc(sizeof(ulong) * nn);
u = flint_malloc(sizeof(ulong) * 2 * nn);
x1 = flint_malloc(sizeof(ulong) * nn);
x2 = flint_malloc(sizeof(ulong) * nn);
flint_mpn_zero(s, nn);
flint_mpn_zero(t, nn);
flint_mpn_zero(u, 2 * nn);
flint_mpn_zero(x1, nn);
flint_mpn_zero(x2, nn);
flint_mpn_copyi(x1 + 1, x, xn);
flint_mpn_mul_n(u, x1, x1, nn);
flint_mpn_copyi(x2, u + nn, nn);
flint_mpn_copyi(s, x1, nn);
flint_mpn_copyi(t, x1, nn);
for (k = 1; k < N; k++)
{
flint_mpn_mul_n(u, t, x2, nn);
flint_mpn_copyi(t, u + nn, nn);
mpn_divrem_1(u, 0, t, nn, 2 * k + 1);
if (alternating & k)
mpn_sub_n(s, s, u, nn);
else
mpn_add_n(s, s, u, nn);
}
flint_mpn_copyi(y, s + 1, xn);
error[0] = 2;
flint_free(s);
flint_free(t);
flint_free(u);
flint_free(x1);
flint_free(x2);
}