1 /*
2     Copyright (C) 2012 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 
14 void
arb_randtest_exact(arb_t x,flint_rand_t state,slong prec,slong mag_bits)15 arb_randtest_exact(arb_t x, flint_rand_t state, slong prec, slong mag_bits)
16 {
17     arf_randtest(arb_midref(x), state, prec, mag_bits);
18     mag_zero(arb_radref(x));
19 }
20 
21 void
arb_randtest_wide(arb_t x,flint_rand_t state,slong prec,slong mag_bits)22 arb_randtest_wide(arb_t x, flint_rand_t state, slong prec, slong mag_bits)
23 {
24     arf_randtest(arb_midref(x), state, prec, mag_bits);
25     mag_randtest(arb_radref(x), state, mag_bits);
26 }
27 
28 void
arb_randtest_precise(arb_t x,flint_rand_t state,slong prec,slong mag_bits)29 arb_randtest_precise(arb_t x, flint_rand_t state, slong prec, slong mag_bits)
30 {
31     arf_randtest(arb_midref(x), state, prec, mag_bits);
32 
33     if (arf_is_zero(arb_midref(x)) || (n_randint(state, 8) == 0))
34     {
35         mag_zero(arb_radref(x));
36     }
37     else
38     {
39         mag_randtest(arb_radref(x), state, 0);
40 
41         if (!mag_is_zero(arb_radref(x)))
42         {
43             fmpz_add_si(MAG_EXPREF(arb_radref(x)),
44                 ARF_EXPREF(arb_midref(x)),
45                 -prec + 2 - n_randint(state, 8));
46         }
47     }
48 }
49 
50 void
arb_randtest(arb_t x,flint_rand_t state,slong prec,slong mag_bits)51 arb_randtest(arb_t x, flint_rand_t state, slong prec, slong mag_bits)
52 {
53     switch (n_randint(state, 8))
54     {
55         case 0:
56             arb_randtest_exact(x, state, prec, mag_bits);
57             break;
58         case 1:
59             arb_randtest_wide(x, state, prec, mag_bits);
60             break;
61         default:
62             arb_randtest_precise(x, state, prec, mag_bits);
63     }
64 }
65 
66 void
arb_randtest_special(arb_t x,flint_rand_t state,slong prec,slong mag_bits)67 arb_randtest_special(arb_t x, flint_rand_t state, slong prec, slong mag_bits)
68 {
69     arb_randtest(x, state, prec, mag_bits);
70 
71     if (n_randint(state, 10) == 0)
72         mag_inf(arb_radref(x));
73 
74     switch (n_randint(state, 10))
75     {
76         case 0:
77             arf_pos_inf(arb_midref(x));
78             break;
79         case 1:
80             arf_neg_inf(arb_midref(x));
81             break;
82         case 2:
83             arf_nan(arb_midref(x));
84             mag_inf(arb_radref(x));
85             break;
86         default:
87             break;
88     }
89 }
90 
91