File: powsum_term.c

package info (click to toggle)
flint-arb 1%3A2.19.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,028 kB
  • sloc: ansic: 177,109; sh: 553; makefile: 288; python: 268
file content (73 lines) | stat: -rw-r--r-- 1,890 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
    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"

void
acb_dirichlet_powsum_term(acb_ptr res, arb_t log_prev, ulong * prev,
    const acb_t s, ulong k, int integer, int critical_line, slong len, slong prec)
{
    slong i;

    if (integer)
    {
        arb_neg(acb_realref(res), acb_realref(s));
        arb_set_ui(acb_imagref(res), k);
        arb_pow(acb_realref(res), acb_imagref(res), acb_realref(res), prec);
        arb_zero(acb_imagref(res));

        if (len != 1)
        {
            arb_log_ui_from_prev(log_prev, k, log_prev, *prev, prec);
            *prev = k;
        }
    }
    else
    {
        arb_t w;
        arb_init(w);

        arb_log_ui_from_prev(log_prev, k, log_prev, *prev, prec);
        *prev = k;
        arb_mul(w, log_prev, acb_imagref(s), prec);
        arb_sin_cos(acb_imagref(res), acb_realref(res), w, prec);
        arb_neg(acb_imagref(res), acb_imagref(res));

        if (critical_line)
        {
            arb_rsqrt_ui(w, k, prec);
            acb_mul_arb(res, res, w, prec);
        }
        else
        {
            arb_mul(w, acb_realref(s), log_prev, prec);
            arb_neg(w, w);
            arb_exp(w, w, prec);
            acb_mul_arb(res, res, w, prec);
        }

        arb_clear(w);
    }

    if (len > 1)
    {
        arb_neg(log_prev, log_prev);

        for (i = 1; i < len; i++)
        {
            acb_mul_arb(res + i, res + i - 1, log_prev, prec);
            acb_div_ui(res + i, res + i, i, prec);
        }

        arb_neg(log_prev, log_prev);
    }
}