1 /*
2 Copyright (C) 2013 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 "arb.h"
13
main()14 int main()
15 {
16 slong iter;
17 flint_rand_t state;
18
19 flint_printf("coth....");
20 fflush(stdout);
21
22 flint_randinit(state);
23
24 for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++)
25 {
26 arb_t x, y, a, b, c, d;
27 slong prec1, prec2;
28
29 prec1 = 2 + n_randint(state, 1000);
30 prec2 = prec1 + 30;
31
32 arb_init(x);
33 arb_init(y);
34 arb_init(a);
35 arb_init(b);
36 arb_init(c);
37 arb_init(d);
38
39 arb_randtest_precise(x, state, 1 + n_randint(state, 1000), 100);
40 arb_randtest_precise(y, state, 1 + n_randint(state, 1000), 100);
41
42 arb_coth(a, x, prec1);
43 arb_coth(b, x, prec2);
44
45 /* check consistency */
46 if (!arb_overlaps(a, b))
47 {
48 flint_printf("FAIL: overlap\n\n");
49 flint_printf("x = "); arb_print(x); flint_printf("\n\n");
50 flint_printf("a = "); arb_print(a); flint_printf("\n\n");
51 flint_printf("b = "); arb_print(b); flint_printf("\n\n");
52 flint_abort();
53 }
54
55 /* check coth(x+y) = (1 + coth(x) coth(y)) / (coth(x) + coth(y)) */
56 arb_add(b, x, y, prec1);
57 arb_coth(b, b, prec1);
58
59 arb_coth(c, y, prec1);
60 arb_add(d, a, c, prec1);
61 arb_mul(c, a, c, prec1);
62 arb_add_ui(c, c, 1, prec1);
63 arb_div(d, c, d, prec1);
64
65 if (!arb_overlaps(b, d))
66 {
67 flint_printf("FAIL: functional equation\n\n");
68 flint_printf("x = "); arb_print(x); flint_printf("\n\n");
69 flint_printf("y = "); arb_print(y); flint_printf("\n\n");
70 flint_printf("b = "); arb_print(b); flint_printf("\n\n");
71 flint_printf("d = "); arb_print(d); flint_printf("\n\n");
72 flint_abort();
73 }
74
75 arb_coth(x, x, prec1);
76
77 if (!arb_overlaps(a, x))
78 {
79 flint_printf("FAIL: aliasing\n\n");
80 flint_printf("a = "); arb_print(a); flint_printf("\n\n");
81 flint_printf("x = "); arb_print(x); flint_printf("\n\n");
82 flint_abort();
83 }
84
85 arb_clear(x);
86 arb_clear(y);
87 arb_clear(a);
88 arb_clear(b);
89 arb_clear(c);
90 arb_clear(d);
91 }
92
93 flint_randclear(state);
94 flint_cleanup();
95 flint_printf("PASS\n");
96 return EXIT_SUCCESS;
97 }
98
99