blob: c66691de0cf177c298406766295e7637111fce8c [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001/* Exercise the lc2exp random functions.
2
3Copyright 2002, 2011 Free Software Foundation, Inc.
4
5This file is part of the GNU MP Library test suite.
6
7The GNU MP Library test suite is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 3 of the License,
10or (at your option) any later version.
11
12The GNU MP Library test suite is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15Public License for more details.
16
17You should have received a copy of the GNU General Public License along with
18the 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. */
27void
28check_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 */
57void
58check_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
85void
86check_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
118void
119check_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). */
151void
152check_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. */
167void
168check_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
196int
197main (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}