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