github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/rand/t-lc2exp.c (about) 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.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 }