1 1.1 mrg /* Test mpz_nextprime. 2 1.1 mrg 3 1.1.1.4 mrg Copyright 2009, 2015, 2018 Free Software Foundation, Inc. 4 1.1 mrg 5 1.1.1.2 mrg This file is part of the GNU MP Library test suite. 6 1.1 mrg 7 1.1.1.2 mrg The GNU MP Library test suite is free software; you can redistribute it 8 1.1.1.2 mrg and/or modify it under the terms of the GNU General Public License as 9 1.1.1.2 mrg published by the Free Software Foundation; either version 3 of the License, 10 1.1.1.2 mrg or (at your option) any later version. 11 1.1.1.2 mrg 12 1.1.1.2 mrg The GNU MP Library test suite is distributed in the hope that it will be 13 1.1.1.2 mrg useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1.1.2 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 1.1.1.2 mrg Public License for more details. 16 1.1 mrg 17 1.1.1.2 mrg You should have received a copy of the GNU General Public License along with 18 1.1.1.3 mrg the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */ 19 1.1 mrg 20 1.1 mrg 21 1.1 mrg #include <stdio.h> 22 1.1 mrg #include <stdlib.h> 23 1.1 mrg 24 1.1 mrg #include "gmp-impl.h" 25 1.1 mrg #include "tests.h" 26 1.1 mrg 27 1.1 mrg void 28 1.1 mrg refmpz_nextprime (mpz_ptr p, mpz_srcptr t) 29 1.1 mrg { 30 1.1 mrg mpz_add_ui (p, t, 1L); 31 1.1 mrg while (! mpz_probab_prime_p (p, 10)) 32 1.1 mrg mpz_add_ui (p, p, 1L); 33 1.1 mrg } 34 1.1 mrg 35 1.1 mrg void 36 1.1.1.2 mrg run (const char *start, int reps, const char *end, short diffs[]) 37 1.1 mrg { 38 1.1 mrg mpz_t x, y; 39 1.1 mrg int i; 40 1.1 mrg 41 1.1 mrg mpz_init_set_str (x, start, 0); 42 1.1 mrg mpz_init (y); 43 1.1 mrg 44 1.1 mrg for (i = 0; i < reps; i++) 45 1.1 mrg { 46 1.1 mrg mpz_nextprime (y, x); 47 1.1 mrg mpz_sub (x, y, x); 48 1.1.1.4 mrg if (diffs != NULL && 49 1.1.1.4 mrg (! mpz_fits_sshort_p (x) || diffs[i] != (short) mpz_get_ui (x))) 50 1.1 mrg { 51 1.1 mrg gmp_printf ("diff list discrepancy\n"); 52 1.1 mrg abort (); 53 1.1 mrg } 54 1.1.1.4 mrg mpz_swap (x, y); 55 1.1 mrg } 56 1.1 mrg 57 1.1 mrg mpz_set_str (y, end, 0); 58 1.1 mrg 59 1.1 mrg if (mpz_cmp (x, y) != 0) 60 1.1 mrg { 61 1.1 mrg gmp_printf ("got %Zx\n", x); 62 1.1 mrg gmp_printf ("want %Zx\n", y); 63 1.1 mrg abort (); 64 1.1 mrg } 65 1.1 mrg 66 1.1 mrg mpz_clear (y); 67 1.1 mrg mpz_clear (x); 68 1.1 mrg } 69 1.1 mrg 70 1.1 mrg extern short diff1[]; 71 1.1 mrg extern short diff3[]; 72 1.1 mrg extern short diff4[]; 73 1.1 mrg extern short diff5[]; 74 1.1.1.4 mrg extern short diff6[]; 75 1.1 mrg 76 1.1 mrg int 77 1.1 mrg main (int argc, char **argv) 78 1.1 mrg { 79 1.1 mrg int i; 80 1.1 mrg int reps = 20; 81 1.1 mrg gmp_randstate_ptr rands; 82 1.1 mrg mpz_t bs, x, nxtp, ref_nxtp; 83 1.1 mrg unsigned long size_range; 84 1.1 mrg 85 1.1 mrg tests_start(); 86 1.1 mrg rands = RANDS; 87 1.1 mrg 88 1.1 mrg run ("2", 1000, "0x1ef7", diff1); 89 1.1 mrg 90 1.1 mrg run ("3", 1000 - 1, "0x1ef7", NULL); 91 1.1 mrg 92 1.1 mrg run ("0x8a43866f5776ccd5b02186e90d28946aeb0ed914", 50, 93 1.1 mrg "0x8a43866f5776ccd5b02186e90d28946aeb0eeec5", diff3); 94 1.1 mrg 95 1.1.1.4 mrg run ("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C", 50, /* 2^148 - 148 */ 96 1.1 mrg "0x100000000000000000000000000000000010ab", diff4); 97 1.1 mrg 98 1.1 mrg run ("0x1c2c26be55317530311facb648ea06b359b969715db83292ab8cf898d8b1b", 50, 99 1.1 mrg "0x1c2c26be55317530311facb648ea06b359b969715db83292ab8cf898da957", diff5); 100 1.1 mrg 101 1.1.1.4 mrg run ("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80", 50, /* 2^128 - 128 */ 102 1.1.1.4 mrg "0x10000000000000000000000000000155B", diff6); 103 1.1.1.4 mrg 104 1.1 mrg mpz_init (bs); 105 1.1 mrg mpz_init (x); 106 1.1 mrg mpz_init (nxtp); 107 1.1 mrg mpz_init (ref_nxtp); 108 1.1 mrg 109 1.1.1.4 mrg TESTS_REPS (reps, argv, argc); 110 1.1 mrg 111 1.1 mrg for (i = 0; i < reps; i++) 112 1.1 mrg { 113 1.1 mrg mpz_urandomb (bs, rands, 32); 114 1.1 mrg size_range = mpz_get_ui (bs) % 8 + 2; /* 0..1024 bit operands */ 115 1.1 mrg 116 1.1 mrg mpz_urandomb (bs, rands, size_range); 117 1.1 mrg mpz_rrandomb (x, rands, mpz_get_ui (bs)); 118 1.1 mrg 119 1.1 mrg /* gmp_printf ("%ld: %Zd\n", mpz_sizeinbase (x, 2), x); */ 120 1.1 mrg 121 1.1 mrg mpz_nextprime (nxtp, x); 122 1.1 mrg refmpz_nextprime (ref_nxtp, x); 123 1.1 mrg if (mpz_cmp (nxtp, ref_nxtp) != 0) 124 1.1 mrg abort (); 125 1.1 mrg } 126 1.1 mrg 127 1.1 mrg mpz_clear (bs); 128 1.1 mrg mpz_clear (x); 129 1.1 mrg mpz_clear (nxtp); 130 1.1 mrg mpz_clear (ref_nxtp); 131 1.1 mrg 132 1.1 mrg tests_end (); 133 1.1 mrg return 0; 134 1.1 mrg } 135 1.1 mrg 136 1.1 mrg short diff1[] = 137 1.1 mrg { 138 1.1 mrg 1,2,2,4,2,4,2,4,6,2,6,4,2,4,6,6, 139 1.1 mrg 2,6,4,2,6,4,6,8,4,2,4,2,4,14,4,6, 140 1.1 mrg 2,10,2,6,6,4,6,6,2,10,2,4,2,12,12,4, 141 1.1 mrg 2,4,6,2,10,6,6,6,2,6,4,2,10,14,4,2, 142 1.1 mrg 4,14,6,10,2,4,6,8,6,6,4,6,8,4,8,10, 143 1.1 mrg 2,10,2,6,4,6,8,4,2,4,12,8,4,8,4,6, 144 1.1 mrg 12,2,18,6,10,6,6,2,6,10,6,6,2,6,6,4, 145 1.1 mrg 2,12,10,2,4,6,6,2,12,4,6,8,10,8,10,8, 146 1.1 mrg 6,6,4,8,6,4,8,4,14,10,12,2,10,2,4,2, 147 1.1 mrg 10,14,4,2,4,14,4,2,4,20,4,8,10,8,4,6, 148 1.1 mrg 6,14,4,6,6,8,6,12,4,6,2,10,2,6,10,2, 149 1.1 mrg 10,2,6,18,4,2,4,6,6,8,6,6,22,2,10,8, 150 1.1 mrg 10,6,6,8,12,4,6,6,2,6,12,10,18,2,4,6, 151 1.1 mrg 2,6,4,2,4,12,2,6,34,6,6,8,18,10,14,4, 152 1.1 mrg 2,4,6,8,4,2,6,12,10,2,4,2,4,6,12,12, 153 1.1 mrg 8,12,6,4,6,8,4,8,4,14,4,6,2,4,6,2, 154 1.1 mrg 6,10,20,6,4,2,24,4,2,10,12,2,10,8,6,6, 155 1.1 mrg 6,18,6,4,2,12,10,12,8,16,14,6,4,2,4,2, 156 1.1 mrg 10,12,6,6,18,2,16,2,22,6,8,6,4,2,4,8, 157 1.1 mrg 6,10,2,10,14,10,6,12,2,4,2,10,12,2,16,2, 158 1.1 mrg 6,4,2,10,8,18,24,4,6,8,16,2,4,8,16,2, 159 1.1 mrg 4,8,6,6,4,12,2,22,6,2,6,4,6,14,6,4, 160 1.1 mrg 2,6,4,6,12,6,6,14,4,6,12,8,6,4,26,18, 161 1.1 mrg 10,8,4,6,2,6,22,12,2,16,8,4,12,14,10,2, 162 1.1 mrg 4,8,6,6,4,2,4,6,8,4,2,6,10,2,10,8, 163 1.1 mrg 4,14,10,12,2,6,4,2,16,14,4,6,8,6,4,18, 164 1.1 mrg 8,10,6,6,8,10,12,14,4,6,6,2,28,2,10,8, 165 1.1 mrg 4,14,4,8,12,6,12,4,6,20,10,2,16,26,4,2, 166 1.1 mrg 12,6,4,12,6,8,4,8,22,2,4,2,12,28,2,6, 167 1.1 mrg 6,6,4,6,2,12,4,12,2,10,2,16,2,16,6,20, 168 1.1 mrg 16,8,4,2,4,2,22,8,12,6,10,2,4,6,2,6, 169 1.1 mrg 10,2,12,10,2,10,14,6,4,6,8,6,6,16,12,2, 170 1.1 mrg 4,14,6,4,8,10,8,6,6,22,6,2,10,14,4,6, 171 1.1 mrg 18,2,10,14,4,2,10,14,4,8,18,4,6,2,4,6, 172 1.1 mrg 2,12,4,20,22,12,2,4,6,6,2,6,22,2,6,16, 173 1.1 mrg 6,12,2,6,12,16,2,4,6,14,4,2,18,24,10,6, 174 1.1 mrg 2,10,2,10,2,10,6,2,10,2,10,6,8,30,10,2, 175 1.1 mrg 10,8,6,10,18,6,12,12,2,18,6,4,6,6,18,2, 176 1.1 mrg 10,14,6,4,2,4,24,2,12,6,16,8,6,6,18,16, 177 1.1 mrg 2,4,6,2,6,6,10,6,12,12,18,2,6,4,18,8, 178 1.1 mrg 24,4,2,4,6,2,12,4,14,30,10,6,12,14,6,10, 179 1.1 mrg 12,2,4,6,8,6,10,2,4,14,6,6,4,6,2,10, 180 1.1 mrg 2,16,12,8,18,4,6,12,2,6,6,6,28,6,14,4, 181 1.1 mrg 8,10,8,12,18,4,2,4,24,12,6,2,16,6,6,14, 182 1.1 mrg 10,14,4,30,6,6,6,8,6,4,2,12,6,4,2,6, 183 1.1 mrg 22,6,2,4,18,2,4,12,2,6,4,26,6,6,4,8, 184 1.1 mrg 10,32,16,2,6,4,2,4,2,10,14,6,4,8,10,6, 185 1.1 mrg 20,4,2,6,30,4,8,10,6,6,8,6,12,4,6,2, 186 1.1 mrg 6,4,6,2,10,2,16,6,20,4,12,14,28,6,20,4, 187 1.1 mrg 18,8,6,4,6,14,6,6,10,2,10,12,8,10,2,10, 188 1.1 mrg 8,12,10,24,2,4,8,6,4,8,18,10,6,6,2,6, 189 1.1 mrg 10,12,2,10,6,6,6,8,6,10,6,2,6,6,6,10, 190 1.1 mrg 8,24,6,22,2,18,4,8,10,30,8,18,4,2,10,6, 191 1.1 mrg 2,6,4,18,8,12,18,16,6,2,12,6,10,2,10,2, 192 1.1 mrg 6,10,14,4,24,2,16,2,10,2,10,20,4,2,4,8, 193 1.1 mrg 16,6,6,2,12,16,8,4,6,30,2,10,2,6,4,6, 194 1.1 mrg 6,8,6,4,12,6,8,12,4,14,12,10,24,6,12,6, 195 1.1 mrg 2,22,8,18,10,6,14,4,2,6,10,8,6,4,6,30, 196 1.1 mrg 14,10,2,12,10,2,16,2,18,24,18,6,16,18,6,2, 197 1.1 mrg 18,4,6,2,10,8,10,6,6,8,4,6,2,10,2,12, 198 1.1 mrg 4,6,6,2,12,4,14,18,4,6,20,4,8,6,4,8, 199 1.1 mrg 4,14,6,4,14,12,4,2,30,4,24,6,6,12,12,14, 200 1.1 mrg 6,4,2,4,18,6,12,8 201 1.1 mrg }; 202 1.1 mrg 203 1.1 mrg short diff3[] = 204 1.1 mrg { 205 1.1 mrg 33,32,136,116,24,22,104,114,76,278,238,162,36,44,388,134, 206 1.1 mrg 130,26,312,42,138,28,24,80,138,108,270,12,330,130,98,102, 207 1.1 mrg 162,34,36,170,90,34,14,6,24,66,154,218,70,132,188,88, 208 1.1 mrg 80,82 209 1.1 mrg }; 210 1.1 mrg 211 1.1 mrg short diff4[] = 212 1.1 mrg { 213 1.1.1.4 mrg 239,92,64,6,104,24,46,258,68,18,54,100,68,154,26,4, 214 1.1 mrg 38,142,168,42,18,26,286,104,136,116,40,2,28,110,52,78, 215 1.1 mrg 104,24,54,96,4,626,196,24,56,36,52,102,48,156,26,18, 216 1.1 mrg 42,40 217 1.1 mrg }; 218 1.1 mrg 219 1.1 mrg short diff5[] = 220 1.1 mrg { 221 1.1 mrg 268,120,320,184,396,2,94,108,20,318,274,14,64,122,220,108, 222 1.1 mrg 18,174,6,24,348,32,64,116,268,162,20,156,28,110,52,428, 223 1.1 mrg 196,14,262,30,194,120,300,66,268,12,428,370,212,198,192,130, 224 1.1 mrg 30,80 225 1.1 mrg }; 226 1.1.1.4 mrg 227 1.1.1.4 mrg short diff6[] = 228 1.1.1.4 mrg { 229 1.1.1.4 mrg 179,30,84,108,112,36,42,110,52,132,60,30,326,114,496,92,100, 230 1.1.1.4 mrg 272,36,54,90,4,2,24,40,398,150,72,60,16,8,4,80,16,2,342,112, 231 1.1.1.4 mrg 14,136,236,40,18,50,192,198,204,40,266,42,274 232 1.1.1.4 mrg }; 233