github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/rand/t-rand.c (about) 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 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 }