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  }