File: lvalue.c

package info (click to toggle)
flint 3.4.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 68,996 kB
  • sloc: ansic: 915,350; asm: 14,605; python: 5,340; sh: 4,512; lisp: 2,621; makefile: 787; cpp: 341
file content (117 lines) | stat: -rw-r--r-- 2,863 bytes parent folder | download
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* This file is public domain. Author: Fredrik Johansson. */

#include <string.h>
#include <stdlib.h>
#include <flint/profiler.h>
#include <flint/acb.h>
#include <flint/acb_dirichlet.h>

int main(int argc, char *argv[])
{
    dirichlet_group_t G;
    dirichlet_char_t chi;
    acb_t s;
    acb_ptr z;
    slong prec, i, len;
    ulong q, n;
    int zfunction, deflate;

    if (argc < 2)
    {
        flint_printf("lvalue [-character q n] [-re a] [-im b] [-prec p] [-z] [-deflate] [-len l]\n\n");
        flint_printf("Print value of Dirichlet L-function at s = a+bi.\n");
        flint_printf("Default a = 0.5, b = 0, p = 53, (q, n) = (1, 0) (Riemann zeta)\n");
        flint_printf("[-z]       - compute Z(s) instead of L(s)\n");
        flint_printf("[-deflate] - remove singular term at s = 1\n");
        flint_printf("[-len l]   - compute l terms in Taylor series at s\n");
        return 1;
    }

    acb_init(s);

    zfunction = 0;
    prec = 53;
    q = 1;
    n = 0;
    len = 1;
    deflate = 0;
    acb_set_d(s, 0.5);

    for (i = 1; i < argc; i++)
    {
        if (!strcmp(argv[i], "-prec"))
        {
            prec = atol(argv[i+1]);
        }
    }

    for (i = 1; i < argc; i++)
    {
        if (!strcmp(argv[i], "-character"))
        {
            q = atol(argv[i+1]);
            n = atol(argv[i+2]);
        }
        else if (!strcmp(argv[i], "-len"))
        {
            len = atol(argv[i+1]);
        }
        else if (!strcmp(argv[i], "-z"))
        {
            zfunction = 1;
        }
        else if (!strcmp(argv[i], "-deflate"))
        {
            deflate = 1;
        }
        else if (!strcmp(argv[i], "-re"))
        {
            arb_set_str(acb_realref(s), argv[i+1], prec);
        }
        else if (!strcmp(argv[i], "-im"))
        {
            arb_set_str(acb_imagref(s), argv[i+1], prec);
        }
    }

    if (n_gcd(q, n) != 1)
    {
        flint_printf("need gcd(q,n) = 1 to define a character\n");
        flint_abort();
    }

    z = _acb_vec_init(len);

    dirichlet_group_init(G, q);
    dirichlet_char_init(chi, G);
    dirichlet_char_log(chi, G, n);

    TIMEIT_ONCE_START;
    if (zfunction)
        acb_dirichlet_hardy_z(z, s, G, chi, len, prec);
    else
        acb_dirichlet_l_jet(z, s, G, chi, deflate, len, prec);

    for (i = 0; i < len; i++)
    {
        if (i == 0)
            flint_printf("%s(s) = ", zfunction ? "Z" : "L");
        else if (i == 1)
            flint_printf("%s'(s) = ", zfunction ? "Z" : "L");
        else
            flint_printf("[x^%wd] %s(s+x) = ", i, zfunction ? "Z" : "L");
        acb_printn(z + i, prec * 0.333 + 1, 0);
        flint_printf("\n");
    }

    TIMEIT_ONCE_STOP;
    print_memory_usage();

    _acb_vec_clear(z, len);
    acb_clear(s);
    dirichlet_char_clear(chi);
    dirichlet_group_clear(G);
    flint_cleanup();
    return 0;
}