Home | History | Annotate | Line # | Download | only in rand
      1 /* Exercise the lc2exp random functions.
      2 
      3 Copyright 2002, 2011 Free Software Foundation, Inc.
      4 
      5 This file is part of the GNU MP Library test suite.
      6 
      7 The GNU MP Library test suite is free software; you can redistribute it
      8 and/or modify it under the terms of the GNU General Public License as
      9 published by the Free Software Foundation; either version 3 of the License,
     10 or (at your option) any later version.
     11 
     12 The GNU MP Library test suite is distributed in the hope that it will be
     13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
     15 Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License along with
     18 the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
     19 
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include "gmp-impl.h"
     23 #include "tests.h"
     24 
     25 
     26 /* a=0 and c=0 produces zero results always. */
     27 void
     28 check_zero (unsigned long m2exp)
     29 {
     30   gmp_randstate_t  r;
     31   mpz_t            a;
     32   unsigned long    c;
     33   int              i;
     34 
     35   mpz_init_set_ui (a, 0L);
     36   c = 0L;
     37 
     38   gmp_randinit_lc_2exp (r, a, c, m2exp);
     39   gmp_randseed_ui (r, 0L);
     40 
     41   for (i = 0; i < 5; i++)
     42     {
     43       mpz_urandomb (a, r, 123L);
     44       if (mpz_sgn (a) != 0)
     45         {
     46           printf ("check_zero m2exp=%lu: didn't get zero\n", m2exp);
     47           gmp_printf ("  rand=%#Zx\n", a);
     48           abort ();
     49         }
     50     }
     51 
     52   mpz_clear (a);
     53   gmp_randclear (r);
     54 }
     55 
     56 /* negative a */
     57 void
     58 check_nega (void)
     59 {
     60   gmp_randstate_t  r;
     61   mpz_t            a;
     62   unsigned long    c, m2exp;
     63   int              i;
     64 
     65   mpz_init (a);
     66   mpz_setbit (a, 1000L);
     67   mpz_neg (a, a);
     68   c = 0L;
     69   m2exp = 45L;
     70 
     71   gmp_randinit_lc_2exp (r, a, c, m2exp);
     72   gmp_randseed_ui (r, 0L);
     73 
     74   for (i = 0; i < 5; i++)
     75     {
     76       mpz_urandomb (a, r, 123L);
     77       if (mpz_sgn (a) != 0)
     78         printf ("check_nega m2exp=%lu: didn't get zero\n", m2exp);
     79     }
     80 
     81   mpz_clear (a);
     82   gmp_randclear (r);
     83 }
     84 
     85 void
     86 check_bigc (void)
     87 {
     88   gmp_randstate_t  r;
     89   mpz_t            a;
     90   unsigned long    c, m2exp, bits;
     91   int              i;
     92 
     93   mpz_init_set_ui (a, 0L);
     94   c = ULONG_MAX;
     95   m2exp = 8;
     96 
     97   gmp_randinit_lc_2exp (r, a, c, m2exp);
     98   gmp_randseed_ui (r, 0L);
     99 
    100   for (i = 0; i < 20; i++)
    101     {
    102       bits = 123L;
    103       mpz_urandomb (a, r, bits);
    104       if (mpz_sgn (a) < 0 || mpz_sizeinbase (a, 2) > bits)
    105         {
    106           printf     ("check_bigc: mpz_urandomb out of range\n");
    107           printf     ("   m2exp=%lu\n", m2exp);
    108           gmp_printf ("   rand=%#ZX\n", a);
    109           gmp_printf ("   sizeinbase2=%u\n", mpz_sizeinbase (a, 2));
    110 	  abort ();
    111         }
    112     }
    113 
    114   mpz_clear (a);
    115   gmp_randclear (r);
    116 }
    117 
    118 void
    119 check_bigc1 (void)
    120 {
    121   gmp_randstate_t  r;
    122   mpz_t            a;
    123   unsigned long    c, m2exp;
    124   int              i;
    125 
    126   mpz_init_set_ui (a, 0L);
    127   c = ULONG_MAX;
    128   m2exp = 2;
    129 
    130   gmp_randinit_lc_2exp (r, a, c, m2exp);
    131   gmp_randseed_ui (r, 0L);
    132 
    133   for (i = 0; i < 20; i++)
    134     {
    135       mpz_urandomb (a, r, 1L);
    136       if (mpz_cmp_ui (a, 1L) != 0)
    137         {
    138           printf     ("check_bigc1: mpz_urandomb didn't give 1\n");
    139           printf     ("   m2exp=%lu\n", m2exp);
    140           gmp_printf ("   got rand=%#ZX\n", a);
    141           abort ();
    142         }
    143     }
    144 
    145   mpz_clear (a);
    146   gmp_randclear (r);
    147 }
    148 
    149 /* Checks parameters which triggered an assertion failure in the past.
    150    Happened when limbs(a)+limbs(c) < bits_to_limbs(m2exp).  */
    151 void
    152 check_bigm (void)
    153 {
    154   gmp_randstate_t rstate;
    155   mpz_t a;
    156 
    157   mpz_init_set_ui (a, 5L);
    158   gmp_randinit_lc_2exp (rstate, a, 1L, 384L);
    159 
    160   mpz_urandomb (a, rstate, 20L);
    161 
    162   gmp_randclear (rstate);
    163   mpz_clear (a);
    164 }
    165 
    166 /* Checks for seeds bigger than the modulus.  */
    167 void
    168 check_bigs (void)
    169 {
    170   gmp_randstate_t rstate;
    171   mpz_t sd, a;
    172   int i;
    173 
    174   mpz_init (sd);
    175   mpz_setbit (sd, 300L);
    176   mpz_sub_ui (sd, sd, 1L);
    177   mpz_clrbit (sd, 13L);
    178   mpz_init_set_ui (a, 123456789L);
    179 
    180   gmp_randinit_lc_2exp (rstate, a, 5L, 64L);
    181 
    182   for (i = 0; i < 20; i++)
    183     {
    184       mpz_neg (sd, sd);
    185       gmp_randseed (rstate, sd);
    186       mpz_mul_ui (sd, sd, 7L);
    187 
    188       mpz_urandomb (a, rstate, 80L);
    189     }
    190 
    191   gmp_randclear (rstate);
    192   mpz_clear (a);
    193   mpz_clear (sd);
    194 }
    195 
    196 int
    197 main (void)
    198 {
    199   tests_start ();
    200 
    201   check_zero (2L);
    202   check_zero (7L);
    203   check_zero (32L);
    204   check_zero (64L);
    205   check_zero (1000L);
    206 
    207   check_nega ();
    208   check_bigc ();
    209   check_bigc1 ();
    210 
    211   check_bigm ();
    212   check_bigs ();
    213 
    214   tests_end ();
    215   exit (0);
    216 }
    217