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