1 /*
2 Copyright (C) 2015 Fredrik Johansson
3
4 This file is part of Arb.
5
6 Arb is free software: you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License (LGPL) as published
8 by the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version. See <http://www.gnu.org/licenses/>.
10 */
11
12 #include "acb.h"
13 #include "acb_poly.h"
14
15 void
acb_polygamma(acb_t res,const acb_t s,const acb_t z,slong prec)16 acb_polygamma(acb_t res, const acb_t s, const acb_t z, slong prec)
17 {
18 if (acb_is_zero(s))
19 {
20 acb_digamma(res, z, prec);
21 }
22 else if (acb_is_int(s) && arb_is_positive(acb_realref(s)))
23 {
24 acb_t t, u;
25
26 acb_init(t);
27 acb_init(u);
28
29 acb_add_ui(t, s, 1, prec);
30 acb_gamma(u, t, prec);
31 acb_hurwitz_zeta(t, t, z, prec);
32
33 if (acb_is_int_2exp_si(s, 1))
34 acb_neg(t, t);
35
36 acb_mul(res, t, u, prec);
37
38 acb_clear(t);
39 acb_clear(u);
40 }
41 else
42 {
43 acb_t t, u;
44 acb_struct v[2];
45
46 acb_init(t);
47 acb_init(u);
48
49 acb_init(v);
50 acb_init(v + 1);
51
52 /* u = psi(-s) + gamma */
53 acb_neg(t, s);
54 acb_digamma(u, t, prec);
55 arb_const_euler(acb_realref(v), prec);
56 arb_add(acb_realref(u), acb_realref(u), acb_realref(v), prec);
57
58 acb_add_ui(t, s, 1, prec);
59 _acb_poly_zeta_cpx_series(v, t, z, 0, 2, prec);
60
61 acb_addmul(v + 1, v, u, prec);
62
63 acb_neg(t, s);
64 acb_rgamma(u, t, prec);
65 acb_mul(res, v + 1, u, prec);
66
67 acb_clear(v);
68 acb_clear(v + 1);
69
70 acb_clear(t);
71 acb_clear(u);
72 }
73 }
74
75