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