Austin Schuh | bb1338c | 2024-06-15 19:31:16 -0700 | [diff] [blame] | 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 | } |