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