xref: /netbsd-src/external/lgpl3/gmp/dist/tests/rand/t-lc2exp.c (revision 6d322f2f4598f0d8a138f10ea648ec4fabe41f8b)
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 http://www.gnu.org/licenses/.  */
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include "gmp.h"
23 #include "gmp-impl.h"
24 #include "tests.h"
25 
26 
27 /* a=0 and c=0 produces zero results always. */
28 void
29 check_zero (unsigned long m2exp)
30 {
31   gmp_randstate_t  r;
32   mpz_t            a;
33   unsigned long    c;
34   int              i;
35 
36   mpz_init_set_ui (a, 0L);
37   c = 0L;
38 
39   gmp_randinit_lc_2exp (r, a, c, m2exp);
40   gmp_randseed_ui (r, 0L);
41 
42   for (i = 0; i < 5; i++)
43     {
44       mpz_urandomb (a, r, 123L);
45       if (mpz_sgn (a) != 0)
46         {
47           printf ("check_zero m2exp=%lu: didn't get zero\n", m2exp);
48           gmp_printf ("  rand=%#Zx\n", a);
49           abort ();
50         }
51     }
52 
53   mpz_clear (a);
54   gmp_randclear (r);
55 }
56 
57 /* negative a */
58 void
59 check_nega (void)
60 {
61   gmp_randstate_t  r;
62   mpz_t            a;
63   unsigned long    c, m2exp;
64   int              i;
65 
66   mpz_init (a);
67   mpz_setbit (a, 1000L);
68   mpz_neg (a, a);
69   c = 0L;
70   m2exp = 45L;
71 
72   gmp_randinit_lc_2exp (r, a, c, m2exp);
73   gmp_randseed_ui (r, 0L);
74 
75   for (i = 0; i < 5; i++)
76     {
77       mpz_urandomb (a, r, 123L);
78       if (mpz_sgn (a) != 0)
79         printf ("check_nega m2exp=%lu: didn't get zero\n", m2exp);
80     }
81 
82   mpz_clear (a);
83   gmp_randclear (r);
84 }
85 
86 void
87 check_bigc (void)
88 {
89   gmp_randstate_t  r;
90   mpz_t            a;
91   unsigned long    c, m2exp, bits;
92   int              i;
93 
94   mpz_init_set_ui (a, 0L);
95   c = ULONG_MAX;
96   m2exp = 8;
97 
98   gmp_randinit_lc_2exp (r, a, c, m2exp);
99   gmp_randseed_ui (r, 0L);
100 
101   for (i = 0; i < 20; i++)
102     {
103       bits = 123L;
104       mpz_urandomb (a, r, bits);
105       if (mpz_sgn (a) < 0 || mpz_sizeinbase (a, 2) > bits)
106         {
107           printf     ("check_bigc: mpz_urandomb out of range\n");
108           printf     ("   m2exp=%lu\n", m2exp);
109           gmp_printf ("   rand=%#ZX\n", a);
110           gmp_printf ("   sizeinbase2=%u\n", mpz_sizeinbase (a, 2));
111 	  abort ();
112         }
113     }
114 
115   mpz_clear (a);
116   gmp_randclear (r);
117 }
118 
119 void
120 check_bigc1 (void)
121 {
122   gmp_randstate_t  r;
123   mpz_t            a;
124   unsigned long    c, m2exp;
125   int              i;
126 
127   mpz_init_set_ui (a, 0L);
128   c = ULONG_MAX;
129   m2exp = 2;
130 
131   gmp_randinit_lc_2exp (r, a, c, m2exp);
132   gmp_randseed_ui (r, 0L);
133 
134   for (i = 0; i < 20; i++)
135     {
136       mpz_urandomb (a, r, 1L);
137       if (mpz_cmp_ui (a, 1L) != 0)
138         {
139           printf     ("check_bigc1: mpz_urandomb didn't give 1\n");
140           printf     ("   m2exp=%lu\n", m2exp);
141           gmp_printf ("   got rand=%#ZX\n", a);
142           abort ();
143         }
144     }
145 
146   mpz_clear (a);
147   gmp_randclear (r);
148 }
149 
150 /* Checks parameters which triggered an assertion failure in the past.
151    Happened when limbs(a)+limbs(c) < bits_to_limbs(m2exp).  */
152 void
153 check_bigm (void)
154 {
155   gmp_randstate_t rstate;
156   mpz_t a;
157 
158   mpz_init_set_ui (a, 5L);
159   gmp_randinit_lc_2exp (rstate, a, 1L, 384L);
160 
161   mpz_urandomb (a, rstate, 20L);
162 
163   gmp_randclear (rstate);
164   mpz_clear (a);
165 }
166 
167 /* Checks for seeds bigger than the modulus.  */
168 void
169 check_bigs (void)
170 {
171   gmp_randstate_t rstate;
172   mpz_t sd, a;
173   int i;
174 
175   mpz_init (sd);
176   mpz_setbit (sd, 300L);
177   mpz_sub_ui (sd, sd, 1L);
178   mpz_clrbit (sd, 13L);
179   mpz_init_set_ui (a, 123456789L);
180 
181   gmp_randinit_lc_2exp (rstate, a, 5L, 64L);
182 
183   for (i = 0; i < 20; i++)
184     {
185       mpz_neg (sd, sd);
186       gmp_randseed (rstate, sd);
187       mpz_mul_ui (sd, sd, 7L);
188 
189       mpz_urandomb (a, rstate, 80L);
190     }
191 
192   gmp_randclear (rstate);
193   mpz_clear (a);
194   mpz_clear (sd);
195 }
196 
197 int
198 main (void)
199 {
200   tests_start ();
201 
202   check_zero (2L);
203   check_zero (7L);
204   check_zero (32L);
205   check_zero (64L);
206   check_zero (1000L);
207 
208   check_nega ();
209   check_bigc ();
210   check_bigc1 ();
211 
212   check_bigm ();
213   check_bigs ();
214 
215   tests_end ();
216   exit (0);
217 }
218