xref: /netbsd-src/external/lgpl3/gmp/dist/tests/cxx/t-rand.cc (revision 8ecbf5f02b752fcb7debe1a8fab1dc82602bc760)
1 /* Test gmp_randclass.
2 
3 Copyright 2002, 2003 Free Software Foundation, Inc.
4 
5 This file is part of the GNU MP Library test suite.
6 
7 The GNU MP Library test suite is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 3 of the License,
10 or (at your option) any later version.
11 
12 The GNU MP Library test suite is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
15 Public License for more details.
16 
17 You should have received a copy of the GNU General Public License along with
18 the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
19 
20 #include "gmp.h"
21 #include "gmpxx.h"
22 #include "gmp-impl.h"
23 #include "tests.h"
24 
25 using namespace std;
26 
27 
28 /* all flavours of initialization */
29 void
30 check_randinit (void)
31 {
32   {
33     gmp_randclass r(gmp_randinit_default);
34   }
35 
36   {
37     mpz_class a(0);
38     unsigned long c = 0, m2exp = 8;
39     gmp_randclass r(gmp_randinit_lc_2exp, a, c, m2exp);
40   }
41 
42   {
43     unsigned long m2exp = 64;
44     gmp_randclass r(gmp_randinit_lc_2exp_size, m2exp);
45   }
46 
47   /* gmp_randinit_lc_2exp_size, with excessive size */
48   {
49     try {
50       unsigned long m2exp = ULONG_MAX;
51       gmp_randclass r(gmp_randinit_lc_2exp_size, m2exp);
52       ASSERT_ALWAYS (0);  /* should not be reached */
53     } catch (length_error) {
54     }
55   }
56 
57   {
58     gmp_randclass r(gmp_randinit_mt);
59   }
60 
61   /* obsolete, but still available */
62   {
63     gmp_randalg_t alg = GMP_RAND_ALG_LC;
64     unsigned long m2exp = 64;
65     gmp_randclass r(alg, m2exp);
66   }
67   {
68     gmp_randalg_t alg = GMP_RAND_ALG_DEFAULT;
69     unsigned long m2exp = 64;
70     gmp_randclass r(alg, m2exp);
71   }
72   {
73     gmp_randalg_t alg = (gmp_randalg_t) 0;
74     unsigned long m2exp = 64;
75     gmp_randclass r(alg, m2exp);
76   }
77 }
78 
79 void
80 check_mpz (void)
81 {
82   {
83     gmp_randclass r(gmp_randinit_default);
84     mpz_class a(123);
85     unsigned int b = 256;
86     mpz_class c;
87     r.seed(a);
88     c = r.get_z_bits(b);
89   }
90   {
91     gmp_randclass r(gmp_randinit_default);
92     mpz_class a(256);
93     unsigned long b = 123;
94     mpz_class c;
95     r.seed(b);
96     c = r.get_z_bits(a);
97   }
98   {
99     gmp_randclass r(gmp_randinit_default);
100     mpz_class a(123), b(256);
101     mpz_class c;
102     r.seed(a);
103     c = r.get_z_range(b);
104   }
105 }
106 
107 void
108 check_mpf (void)
109 {
110   {
111     gmp_randclass r(gmp_randinit_default);
112     mpz_class a(123);
113     r.seed(a);
114     mpf_class b;
115     b = r.get_f();
116     mpf_class c(r.get_f());
117     ASSERT_ALWAYS (c.get_prec() == mpf_get_default_prec());
118     mpf_class d(r.get_f(),212);
119     ASSERT_ALWAYS (d.get_prec() >= 212);
120   }
121   {
122     gmp_randclass r(gmp_randinit_default);
123     int a = 123, b = 198;
124     r.seed(a);
125     mpf_class c;
126     c = r.get_f(b);
127     ASSERT_ALWAYS (c.get_prec() == mpf_get_default_prec());
128     mpf_class d(r.get_f(b));
129     ASSERT_ALWAYS (d.get_prec() >= 198);
130     mpf_class e(r.get_f(b)-r.get_f());
131     ASSERT_ALWAYS (e.get_prec() >= 198);
132     mpf_class f(r.get_f(60),300);
133     ASSERT_ALWAYS (f.get_prec() >= 300);
134   }
135 }
136 
137 
138 int
139 main (void)
140 {
141   tests_start();
142 
143   check_randinit();
144   check_mpz();
145   check_mpf();
146 
147   tests_end();
148   return 0;
149 }
150