2016-10-16 19:09:49 +02:00
|
|
|
/*
|
|
|
|
Copyright (C) 2016 Fredrik Johansson
|
|
|
|
|
|
|
|
This file is part of Arb.
|
|
|
|
|
|
|
|
Arb is free software: you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU Lesser General Public License (LGPL) as published
|
|
|
|
by the Free Software Foundation; either version 2.1 of the License, or
|
|
|
|
(at your option) any later version. See <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "acb_dirichlet.h"
|
|
|
|
#include "acb_poly.h"
|
|
|
|
|
|
|
|
void
|
|
|
|
acb_dirichlet_hurwitz_precomp_eval(acb_t res,
|
|
|
|
const acb_dirichlet_hurwitz_precomp_t pre, ulong p, ulong q, slong prec)
|
|
|
|
{
|
|
|
|
slong i;
|
|
|
|
acb_t a, t;
|
|
|
|
|
|
|
|
if (p > q)
|
2017-10-31 18:28:09 +01:00
|
|
|
{
|
|
|
|
flint_printf("hurwitz_precomp_eval: require p <= n\n");
|
2017-02-28 16:50:03 +01:00
|
|
|
flint_abort();
|
2017-10-31 18:28:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (pre->A == 0)
|
|
|
|
{
|
|
|
|
acb_init(a);
|
|
|
|
acb_set_ui(a, p);
|
|
|
|
acb_div_ui(a, a, q, prec);
|
|
|
|
|
|
|
|
if (pre->deflate == 0)
|
|
|
|
acb_hurwitz_zeta(res, &pre->s, a, prec);
|
|
|
|
else
|
|
|
|
_acb_poly_zeta_cpx_series(res, &pre->s, a, 1, 1, prec);
|
|
|
|
|
|
|
|
acb_clear(a);
|
|
|
|
return;
|
|
|
|
}
|
2016-10-16 19:09:49 +02:00
|
|
|
|
|
|
|
acb_init(a);
|
|
|
|
acb_init(t);
|
|
|
|
|
|
|
|
/* todo: avoid integer overflows below */
|
|
|
|
if (p == q)
|
|
|
|
i = pre->N - 1;
|
|
|
|
else
|
|
|
|
i = (pre->N * p) / q;
|
|
|
|
acb_set_si(a, 2 * pre->N * p - q * (2 * i + 1));
|
|
|
|
acb_div_ui(a, a, 2 * q * pre->N, prec);
|
|
|
|
|
|
|
|
/* compute zeta(s,A+p/q) */
|
|
|
|
_acb_poly_evaluate(res, pre->coeffs + i * pre->K, pre->K, a, prec);
|
|
|
|
|
|
|
|
/* error bound */
|
|
|
|
if (acb_is_real(&pre->s))
|
|
|
|
arb_add_error_mag(acb_realref(res), &pre->err);
|
|
|
|
else
|
|
|
|
acb_add_error_mag(res, &pre->err);
|
|
|
|
|
|
|
|
/* zeta(s,p/q) = (p/q)^-s + ... + (p/q+A-1)^-s zeta(s,A+p/q) */
|
|
|
|
for (i = 0; i < pre->A; i++)
|
|
|
|
{
|
|
|
|
acb_set_ui(a, p);
|
|
|
|
acb_div_ui(a, a, q, prec);
|
|
|
|
acb_add_ui(a, a, i, prec);
|
|
|
|
acb_neg(t, &pre->s);
|
|
|
|
acb_pow(a, a, t, prec);
|
|
|
|
acb_add(res, res, a, prec);
|
|
|
|
}
|
|
|
|
|
|
|
|
acb_clear(a);
|
|
|
|
acb_clear(t);
|
|
|
|
}
|
|
|
|
|