1 /* t-rand -- Test random number generators. */
2
3 /*
4 Copyright 2000, 2001 Free Software Foundation, Inc.
5
6 This file is part of the GNU MP Library test suite.
7
8 The GNU MP Library test suite is free software; you can redistribute it
9 and/or modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 3 of the License,
11 or (at your option) any later version.
12
13 The GNU MP Library test suite is distributed in the hope that it will be
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
17
18 You should have received a copy of the GNU General Public License along with
19 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
20
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include "gmp.h"
24
25 #define SEED 1
26 #define BASE 16
27 #define ENTS 10 /* Number of entries in array when
28 printing. */
29
30 /* These were generated by this very program. Do not edit! */
31 /* Integers. */
32 const char *z1[ENTS] = {"0", "1", "1", "1", "1", "0", "1", "1", "1", "1"};
33 const char *z2[ENTS] = {"0", "3", "1", "3", "3", "0", "3", "3", "3", "1"};
34 const char *z3[ENTS] = {"4", "3", "1", "7", "3", "0", "3", "3", "3", "1"};
35 const char *z4[ENTS] = {"c", "3", "1", "f", "b", "8", "3", "3", "3", "1"};
36 const char *z5[ENTS] = {"1c", "13", "11", "1f", "b", "18", "3", "13", "3", "1"};
37
38 const char *z10[ENTS] = {"29c", "213", "f1", "17f", "12b", "178", "383", "d3", "3a3", "281"};
39
40 const char *z15[ENTS] = {"29c", "1a13", "74f1", "257f", "592b", "4978", "4783", "7cd3", "5ba3", "4681"};
41 const char *z16[ENTS] = {"29c", "9a13", "74f1", "a57f", "d92b", "4978", "c783", "fcd3", "5ba3", "c681"};
42 const char *z17[ENTS] = {"51e", "f17a", "54ff", "1a335", "cf65", "5d6f", "583f", "618f", "1bc6", "98ff"};
43
44 const char *z31[ENTS] = {"3aecd515", "13ae8ec6", "518c8090", "81ca077", "70b7134", "7ee78d71", "323a7636", "2122cb1a", "19811941", "41fd605"};
45 const char *z32[ENTS] = {"baecd515", "13ae8ec6", "518c8090", "881ca077", "870b7134", "7ee78d71", "323a7636", "a122cb1a", "99811941", "841fd605"};
46 const char *z33[ENTS] = {"1faf4cca", "15d6ef83b", "9095fe72", "1b6a3dff6", "b17cbddd", "16e5209d4", "6f65b12c", "493bbbc6", "abf2a5d5", "6d491a3c"};
47
48 const char *z63[ENTS] = {"48a74f367fa7b5c8", "3ba9e9dc1b263076", "1e0ac84e7678e0fb", "11416581728b3e35", "36ab610523f0f1f7", "3e540e8e95c0eb4b", "439ae16057dbc9d3", "734fb260db243950", "7d3a317effc289bf", "1d80301fb3d1a0d1"};
49 const char *z64[ENTS] = {"48a74f367fa7b5c8", "bba9e9dc1b263076", "9e0ac84e7678e0fb", "11416581728b3e35", "b6ab610523f0f1f7", "be540e8e95c0eb4b", "439ae16057dbc9d3", "f34fb260db243950", "fd3a317effc289bf", "1d80301fb3d1a0d1"};
50 const char *z65[ENTS] = {"1ff77710d846d49f0", "1b1411701d709ee10", "31ffa81a208b6af4", "446638d431d3c681", "df5c569d5baa8b55", "197d99ea9bf28e5a0", "191ade09edd94cfae", "194acefa6dde5e18d", "1afc1167c56272d92", "d092994da72f206f"};
51
52 const char *z127[ENTS] = {"2f66ba932aaf58a071fd8f0742a99a0c", "73cfa3c664c9c1753507ca60ec6b8425", "53ea074ca131dec12cd68b8aa8e20278", "3cf5ac8c343532f8a53cc0eb47581f73", "50c11d5869e208aa1b9aa317b8c2d0a9", "b23163c892876472b1ef19642eace09", "489f4c03d41f87509c8d6c90ce674f95", "2ab8748c96aa6762ea1932b44c9d7164", "98cb5591fc05ad31afbbc1d67b90edd", "77848bb991fd0be331adcf1457fbc672"};
53 const char *z128[ENTS] = {"af66ba932aaf58a071fd8f0742a99a0c", "73cfa3c664c9c1753507ca60ec6b8425", "53ea074ca131dec12cd68b8aa8e20278", "3cf5ac8c343532f8a53cc0eb47581f73", "50c11d5869e208aa1b9aa317b8c2d0a9", "8b23163c892876472b1ef19642eace09", "489f4c03d41f87509c8d6c90ce674f95", "aab8748c96aa6762ea1932b44c9d7164", "98cb5591fc05ad31afbbc1d67b90edd", "f7848bb991fd0be331adcf1457fbc672"};
54
55 /* Floats. */
56 const char *f1[ENTS] = {"0.@0", "0.8@0", "0.8@0", "0.8@0", "0.8@0", "0.@0", "0.8@0", "0.8@0", "0.8@0", "0.8@0"};
57 const char *f2[ENTS] = {"0.@0", "0.c@0", "0.4@0", "0.c@0", "0.c@0", "0.@0", "0.c@0", "0.c@0", "0.c@0", "0.4@0"};
58 const char *f3[ENTS] = {"0.8@0", "0.6@0", "0.2@0", "0.e@0", "0.6@0", "0.@0", "0.6@0", "0.6@0", "0.6@0", "0.2@0"};
59 const char *f4[ENTS] = {"0.c@0", "0.3@0", "0.1@0", "0.f@0", "0.b@0", "0.8@0", "0.3@0", "0.3@0", "0.3@0", "0.1@0"};
60 const char *f5[ENTS] = {"0.e@0", "0.98@0", "0.88@0", "0.f8@0", "0.58@0", "0.c@0", "0.18@0", "0.98@0", "0.18@0", "0.8@-1"};
61
62 const char *f10[ENTS] = {"0.a7@0", "0.84c@0", "0.3c4@0", "0.5fc@0", "0.4ac@0", "0.5e@0", "0.e0c@0", "0.34c@0", "0.e8c@0", "0.a04@0"};
63
64 const char *f15[ENTS] = {"0.538@-1", "0.3426@0", "0.e9e2@0", "0.4afe@0", "0.b256@0", "0.92f@0", "0.8f06@0", "0.f9a6@0", "0.b746@0", "0.8d02@0"};
65 const char *f16[ENTS] = {"0.29c@-1", "0.9a13@0", "0.74f1@0", "0.a57f@0", "0.d92b@0", "0.4978@0", "0.c783@0", "0.fcd3@0", "0.5ba3@0", "0.c681@0"};
66 const char *f17[ENTS] = {"0.28f@-1", "0.78bd@0", "0.2a7f8@0", "0.d19a8@0", "0.67b28@0", "0.2eb78@0", "0.2c1f8@0", "0.30c78@0", "0.de3@-1", "0.4c7f8@0"};
67
68 const char *f31[ENTS] = {"0.75d9aa2a@0", "0.275d1d8c@0", "0.a319012@0", "0.103940ee@0", "0.e16e268@-1", "0.fdcf1ae2@0", "0.6474ec6c@0", "0.42459634@0", "0.33023282@0", "0.83fac0a@-1"};
69 const char *f32[ENTS] = {"0.baecd515@0", "0.13ae8ec6@0", "0.518c809@0", "0.881ca077@0", "0.870b7134@0", "0.7ee78d71@0", "0.323a7636@0", "0.a122cb1a@0", "0.99811941@0", "0.841fd605@0"};
70 const char *f33[ENTS] = {"0.fd7a665@-1", "0.aeb77c1d8@0", "0.484aff39@0", "0.db51effb@0", "0.58be5eee8@0", "0.b72904ea@0", "0.37b2d896@0", "0.249ddde3@0", "0.55f952ea8@0", "0.36a48d1e@0"};
71
72 const char *f63[ENTS] = {"0.914e9e6cff4f6b9@0", "0.7753d3b8364c60ec@0", "0.3c15909cecf1c1f6@0", "0.2282cb02e5167c6a@0", "0.6d56c20a47e1e3ee@0", "0.7ca81d1d2b81d696@0", "0.8735c2c0afb793a6@0", "0.e69f64c1b64872a@0", "0.fa7462fdff85137e@0", "0.3b00603f67a341a2@0"};
73 const char *f64[ENTS] = {"0.48a74f367fa7b5c8@0", "0.bba9e9dc1b263076@0", "0.9e0ac84e7678e0fb@0", "0.11416581728b3e35@0", "0.b6ab610523f0f1f7@0", "0.be540e8e95c0eb4b@0", "0.439ae16057dbc9d3@0", "0.f34fb260db24395@0", "0.fd3a317effc289bf@0", "0.1d80301fb3d1a0d1@0"};
74 const char *f65[ENTS] = {"0.ffbbb886c236a4f8@0", "0.d8a08b80eb84f708@0", "0.18ffd40d1045b57a@0", "0.22331c6a18e9e3408@0", "0.6fae2b4eadd545aa8@0", "0.cbeccf54df9472d@0", "0.c8d6f04f6eca67d7@0", "0.ca5677d36ef2f0c68@0", "0.d7e08b3e2b1396c9@0", "0.68494ca6d39790378@0"};
75
76 const char *f127[ENTS] = {"0.5ecd7526555eb140e3fb1e0e85533418@0", "0.e79f478cc99382ea6a0f94c1d8d7084a@0", "0.a7d40e994263bd8259ad171551c404f@0", "0.79eb5918686a65f14a7981d68eb03ee6@0", "0.a1823ab0d3c411543735462f7185a152@0", "0.16462c791250ec8e563de32c85d59c12@0", "0.913e9807a83f0ea1391ad9219cce9f2a@0", "0.5570e9192d54cec5d4326568993ae2c8@0", "0.13196ab23f80b5a635f7783acf721dba@0", "0.ef09177323fa17c6635b9e28aff78ce4@0"};
77 const char *f128[ENTS] = {"0.af66ba932aaf58a071fd8f0742a99a0c@0", "0.73cfa3c664c9c1753507ca60ec6b8425@0", "0.53ea074ca131dec12cd68b8aa8e20278@0", "0.3cf5ac8c343532f8a53cc0eb47581f73@0", "0.50c11d5869e208aa1b9aa317b8c2d0a9@0", "0.8b23163c892876472b1ef19642eace09@0", "0.489f4c03d41f87509c8d6c90ce674f95@0", "0.aab8748c96aa6762ea1932b44c9d7164@0", "0.98cb5591fc05ad31afbbc1d67b90edd@-1", "0.f7848bb991fd0be331adcf1457fbc672@0"};
78
79
80 struct rt
81 {
82 const char **s;
83 int nbits;
84 };
85
86 static struct rt zarr[] =
87 {
88 {z1, 1},
89 {z2, 2},
90 {z3, 3},
91 {z4, 4},
92 {z5, 5},
93 {z10, 10},
94 {z15, 15},
95 {z16, 16},
96 {z17, 17},
97 {z31, 31},
98 {z32, 32},
99 {z33, 33},
100 {z63, 63},
101 {z64, 64},
102 {z65, 65},
103 {z127, 127},
104 {z128, 128},
105 {NULL, 0}
106 };
107
108 static struct rt farr[] =
109 {
110 {f1, 1},
111 {f2, 2},
112 {f3, 3},
113 {f4, 4},
114 {f5, 5},
115 {f10, 10},
116 {f15, 15},
117 {f16, 16},
118 {f17, 17},
119 {f31, 31},
120 {f32, 32},
121 {f33, 33},
122 {f63, 63},
123 {f64, 64},
124 {f65, 65},
125 {f127, 127},
126 {f128, 128},
127 {NULL, 0}
128 };
129
130
131 int
main(int argc,char * argv[])132 main (int argc, char *argv[])
133 {
134 static char usage[] = "\
135 usage: t-rand [function nbits]\n\
136 function is one of z, f\n\
137 nbits is number of bits\n\
138 ";
139 gmp_randstate_t rstate;
140 mpz_t z, rz;
141 mpf_t f, rf;
142 enum { Z, F } func = Z;
143 int nbits = 1;
144 int verify_mode_flag = 1;
145 int i;
146 struct rt *a;
147
148
149 if (argc > 1)
150 {
151 if (argc < 3)
152 {
153 fputs (usage, stderr);
154 exit (1);
155 }
156 verify_mode_flag = 0;
157 if (*argv[1] == 'z')
158 func = Z;
159 if (*argv[1] == 'f')
160 func = F;
161 nbits = atoi (argv[2]);
162 }
163
164 mpz_init (rz);
165
166 if (verify_mode_flag)
167 {
168 #ifdef VERBOSE
169 printf ("%s: verifying random numbers: ", argv[0]);
170 #endif
171
172 /* Test z. */
173 mpz_init (z);
174 for (a = zarr; a->s != NULL; a++)
175 {
176 gmp_randinit (rstate, GMP_RAND_ALG_LC, a->nbits);
177 if (gmp_errno != GMP_ERROR_NONE)
178 exit (1);
179 gmp_randseed_ui (rstate, SEED);
180
181 for (i = 0; i < ENTS; i++)
182 {
183 mpz_urandomb (rz, rstate, a->nbits);
184 mpz_set_str (z, a->s[i], BASE);
185 if (mpz_cmp (z, rz) != 0)
186 {
187 printf ("z%d: ", a->nbits);
188 mpz_out_str (stdout, BASE, rz);
189 printf (" should be ");
190 mpz_out_str (stdout, BASE, z);
191 puts ("");
192 exit (1);
193 }
194 }
195 #ifdef VERBOSE
196 printf ("z%d ", a->nbits);
197 #endif
198 gmp_randclear (rstate);
199 }
200 mpz_clear (z);
201
202
203 /* Test f. */
204 for (a = farr; a->s != NULL; a++)
205 {
206 gmp_randinit (rstate, GMP_RAND_ALG_LC, a->nbits);
207 if (gmp_errno != GMP_ERROR_NONE)
208 exit (1);
209 gmp_randseed_ui (rstate, SEED);
210
211 mpf_init2 (f, a->nbits);
212 mpf_init2 (rf, a->nbits);
213 for (i = 0; i < ENTS; i++)
214 {
215 mpf_urandomb (rf, rstate, a->nbits);
216 mpf_set_str (f, a->s[i], BASE);
217 if (mpf_cmp (f, rf) != 0)
218 {
219 printf ("f%d: ", a->nbits);
220 mpf_out_str (stdout, BASE, a->nbits, rf);
221 printf (" should be ");
222 mpf_out_str (stdout, BASE, a->nbits, f);
223 puts ("");
224 exit (1);
225 }
226 }
227 #ifdef VERBOSE
228 printf ("f%d ", a->nbits);
229 #endif
230 gmp_randclear (rstate);
231 mpf_clear (f);
232 mpf_clear (rf);
233 }
234
235 #ifdef VERBOSE
236 puts ("");
237 #endif
238 }
239 else /* Print mode. */
240 {
241 gmp_randinit (rstate, GMP_RAND_ALG_LC, nbits);
242 if (gmp_errno != GMP_ERROR_NONE)
243 exit (1);
244 gmp_randseed_ui (rstate, SEED);
245
246 switch (func)
247 {
248 case Z:
249 printf ("char *z%d[ENTS] = {", nbits);
250 for (i = 0; i < ENTS; i++)
251 {
252 mpz_urandomb (rz, rstate, nbits);
253 printf ("\"");
254 mpz_out_str (stdout, BASE, rz);
255 printf ("\"");
256 if (i != ENTS - 1)
257 printf (", ");
258 }
259 printf ("};\n");
260 printf (" {z%d, %d},\n", nbits, nbits);
261 break;
262
263 case F:
264 printf ("char *f%d[ENTS] = {", nbits);
265 mpf_init2 (rf, nbits);
266 for (i = 0; i < ENTS; i++)
267 {
268 mpf_urandomb (rf, rstate, nbits);
269 printf ("\"");
270 mpf_out_str (stdout, BASE, nbits, rf);
271 printf ("\"");
272 if (i != ENTS - 1)
273 printf (", ");
274 }
275 printf ("};\n");
276 printf (" {f%d, %d},\n", nbits, nbits);
277 mpf_clear (rf);
278 break;
279
280 default:
281 exit (1);
282 }
283
284 gmp_randclear (rstate);
285 }
286
287 mpz_clear (rz);
288
289 return 0;
290 }
291