blob: 89bb736c86c22460f81b9d84c938b091e1c6c128 [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001//===-------------------------- hash.cpp ----------------------------------===//
2//
Chandler Carruth57b08b02019-01-19 10:56:40 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnant3e519522010-05-11 19:42:16 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "__hash_table"
10#include "algorithm"
Howard Hinnant5ec18262010-10-29 14:10:30 +000011#include "stdexcept"
Howard Hinnant43d978e2012-12-27 18:59:05 +000012#include "type_traits"
13
Joerg Sonnenbergerff3ce2b2013-04-27 19:10:15 +000014#ifdef __clang__
Howard Hinnant43d978e2012-12-27 18:59:05 +000015#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Joerg Sonnenbergerff3ce2b2013-04-27 19:10:15 +000016#endif
Howard Hinnant3e519522010-05-11 19:42:16 +000017
18_LIBCPP_BEGIN_NAMESPACE_STD
19
20namespace {
21
22// handle all next_prime(i) for i in [1, 210), special case 0
23const unsigned small_primes[] =
24{
25 0,
26 2,
27 3,
28 5,
29 7,
30 11,
31 13,
32 17,
33 19,
34 23,
35 29,
36 31,
37 37,
38 41,
39 43,
40 47,
41 53,
42 59,
43 61,
44 67,
45 71,
46 73,
47 79,
48 83,
49 89,
50 97,
51 101,
52 103,
53 107,
54 109,
55 113,
56 127,
57 131,
58 137,
59 139,
60 149,
61 151,
62 157,
63 163,
64 167,
65 173,
66 179,
67 181,
68 191,
69 193,
70 197,
71 199,
72 211
73};
74
75// potential primes = 210*k + indices[i], k >= 1
76// these numbers are not divisible by 2, 3, 5 or 7
77// (or any integer 2 <= j <= 10 for that matter).
78const unsigned indices[] =
79{
80 1,
81 11,
82 13,
83 17,
84 19,
85 23,
86 29,
87 31,
88 37,
89 41,
90 43,
91 47,
92 53,
93 59,
94 61,
95 67,
96 71,
97 73,
98 79,
99 83,
100 89,
101 97,
102 101,
103 103,
104 107,
105 109,
106 113,
107 121,
108 127,
109 131,
110 137,
111 139,
112 143,
113 149,
114 151,
115 157,
116 163,
117 167,
118 169,
119 173,
120 179,
121 181,
122 187,
123 191,
124 193,
125 197,
126 199,
127 209
128};
129
130}
131
132// Returns: If n == 0, returns 0. Else returns the lowest prime number that
133// is greater than or equal to n.
Howard Hinnant940e2112010-08-22 00:03:27 +0000134//
Howard Hinnant3e519522010-05-11 19:42:16 +0000135// The algorithm creates a list of small primes, plus an open-ended list of
136// potential primes. All prime numbers are potential prime numbers. However
137// some potential prime numbers are not prime. In an ideal world, all potential
Alp Tokerf03763a2014-05-15 11:27:39 +0000138// prime numbers would be prime. Candidate prime numbers are chosen as the next
Howard Hinnant3e519522010-05-11 19:42:16 +0000139// highest potential prime. Then this number is tested for prime by dividing it
140// by all potential prime numbers less than the sqrt of the candidate.
Howard Hinnant940e2112010-08-22 00:03:27 +0000141//
Howard Hinnant3e519522010-05-11 19:42:16 +0000142// This implementation defines potential primes as those numbers not divisible
143// by 2, 3, 5, and 7. Other (common) implementations define potential primes
144// as those not divisible by 2. A few other implementations define potential
145// primes as those not divisible by 2 or 3. By raising the number of small
146// primes which the potential prime is not divisible by, the set of potential
147// primes more closely approximates the set of prime numbers. And thus there
148// are fewer potential primes to search, and fewer potential primes to divide
149// against.
150
Howard Hinnant43d978e2012-12-27 18:59:05 +0000151template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000152inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000153typename enable_if<_Sz == 4, void>::type
154__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000155{
Howard Hinnant5ec18262010-10-29 14:10:30 +0000156 if (N > 0xFFFFFFFB)
Louis Dionne7232a842019-02-12 16:06:02 +0000157 __throw_overflow_error("__next_prime overflow");
Howard Hinnant5ec18262010-10-29 14:10:30 +0000158}
159
Howard Hinnant43d978e2012-12-27 18:59:05 +0000160template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000161inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000162typename enable_if<_Sz == 8, void>::type
163__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000164{
Howard Hinnant5ec18262010-10-29 14:10:30 +0000165 if (N > 0xFFFFFFFFFFFFFFC5ull)
Louis Dionne7232a842019-02-12 16:06:02 +0000166 __throw_overflow_error("__next_prime overflow");
Howard Hinnant5ec18262010-10-29 14:10:30 +0000167}
168
Howard Hinnant3e519522010-05-11 19:42:16 +0000169size_t
170__next_prime(size_t n)
171{
172 const size_t L = 210;
173 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
174 // If n is small enough, search in small_primes
175 if (n <= small_primes[N-1])
176 return *std::lower_bound(small_primes, small_primes + N, n);
177 // Else n > largest small_primes
Howard Hinnant5ec18262010-10-29 14:10:30 +0000178 // Check for overflow
Howard Hinnant43d978e2012-12-27 18:59:05 +0000179 __check_for_overflow(n);
Howard Hinnant3e519522010-05-11 19:42:16 +0000180 // Start searching list of potential primes: L * k0 + indices[in]
181 const size_t M = sizeof(indices) / sizeof(indices[0]);
182 // Select first potential prime >= n
183 // Known a-priori n >= L
184 size_t k0 = n / L;
Howard Hinnantc2063662011-12-01 20:21:04 +0000185 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
186 - indices);
Howard Hinnant3e519522010-05-11 19:42:16 +0000187 n = L * k0 + indices[in];
188 while (true)
189 {
190 // Divide n by all primes or potential primes (i) until:
191 // 1. The division is even, so try next potential prime.
192 // 2. The i > sqrt(n), in which case n is prime.
193 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
194 // so don't test those (j == 5 -> divide by 11 first). And the
195 // potential primes start with 211, so don't test against the last
196 // small prime.
197 for (size_t j = 5; j < N - 1; ++j)
198 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000199 const std::size_t p = small_primes[j];
200 const std::size_t q = n / p;
201 if (q < p)
Howard Hinnant3e519522010-05-11 19:42:16 +0000202 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000203 if (n == q * p)
204 goto next;
Howard Hinnant3e519522010-05-11 19:42:16 +0000205 }
206 // n wasn't divisible by small primes, try potential primes
207 {
208 size_t i = 211;
209 while (true)
210 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000211 std::size_t q = n / i;
212 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000213 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000214 if (n == q * i)
215 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000216
217 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000218 q = n / i;
219 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000220 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000221 if (n == q * i)
222 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000223
224 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000225 q = n / i;
226 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000227 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000228 if (n == q * i)
229 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000230
231 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000232 q = n / i;
233 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000234 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000235 if (n == q * i)
236 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000237
238 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000239 q = n / i;
240 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000241 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000242 if (n == q * i)
243 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000244
245 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000246 q = n / i;
247 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000248 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000249 if (n == q * i)
250 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000251
252 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000253 q = n / i;
254 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000255 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000256 if (n == q * i)
257 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000258
259 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000260 q = n / i;
261 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000262 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000263 if (n == q * i)
264 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000265
266 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000267 q = n / i;
268 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000269 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000270 if (n == q * i)
271 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000272
273 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000274 q = n / i;
275 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000276 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000277 if (n == q * i)
278 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000279
280 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000281 q = n / i;
282 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000283 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000284 if (n == q * i)
285 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000286
287 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000288 q = n / i;
289 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000290 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000291 if (n == q * i)
292 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000293
294 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000295 q = n / i;
296 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000297 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000298 if (n == q * i)
299 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000300
301 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000302 q = n / i;
303 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000304 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000305 if (n == q * i)
306 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000307
308 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000309 q = n / i;
310 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000311 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000312 if (n == q * i)
313 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000314
315 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000316 q = n / i;
317 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000318 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000319 if (n == q * i)
320 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000321
322 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000323 q = n / i;
324 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000325 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000326 if (n == q * i)
327 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000328
329 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000330 q = n / i;
331 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000332 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000333 if (n == q * i)
334 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000335
336 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000337 q = n / i;
338 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000339 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000340 if (n == q * i)
341 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000342
343 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000344 q = n / i;
345 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000346 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000347 if (n == q * i)
348 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000349
350 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000351 q = n / i;
352 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000353 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000354 if (n == q * i)
355 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000356
357 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000358 q = n / i;
359 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000360 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000361 if (n == q * i)
362 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000363
364 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000365 q = n / i;
366 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000367 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000368 if (n == q * i)
369 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000370
371 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000372 q = n / i;
373 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000374 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000375 if (n == q * i)
376 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000377
378 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000379 q = n / i;
380 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000381 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000382 if (n == q * i)
383 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000384
385 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000386 q = n / i;
387 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000388 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000389 if (n == q * i)
390 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000391
392 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000393 q = n / i;
394 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000395 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000396 if (n == q * i)
397 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000398
399 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000400 q = n / i;
401 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000402 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000403 if (n == q * i)
404 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000405
406 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000407 q = n / i;
408 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000409 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000410 if (n == q * i)
411 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000412
413 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000414 q = n / i;
415 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000416 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000417 if (n == q * i)
418 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000419
420 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000421 q = n / i;
422 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000423 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000424 if (n == q * i)
425 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000426
427 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000428 q = n / i;
429 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000430 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000431 if (n == q * i)
432 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000433
434 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000435 q = n / i;
436 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000437 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000438 if (n == q * i)
439 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000440
441 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000442 q = n / i;
443 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000444 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000445 if (n == q * i)
446 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000447
448 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000449 q = n / i;
450 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000451 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000452 if (n == q * i)
453 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000454
455 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000456 q = n / i;
457 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000458 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000459 if (n == q * i)
460 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000461
462 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000463 q = n / i;
464 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000465 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000466 if (n == q * i)
467 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000468
469 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000470 q = n / i;
471 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000472 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000473 if (n == q * i)
474 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000475
476 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000477 q = n / i;
478 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000479 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000480 if (n == q * i)
481 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000482
483 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000484 q = n / i;
485 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000486 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000487 if (n == q * i)
488 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000489
490 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000491 q = n / i;
492 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000493 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000494 if (n == q * i)
495 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000496
497 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000498 q = n / i;
499 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000500 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000501 if (n == q * i)
502 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000503
504 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000505 q = n / i;
506 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000507 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000508 if (n == q * i)
509 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000510
511 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000512 q = n / i;
513 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000514 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000515 if (n == q * i)
516 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000517
518 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000519 q = n / i;
520 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000521 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000522 if (n == q * i)
523 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000524
525 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000526 q = n / i;
527 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000528 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000529 if (n == q * i)
530 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000531
532 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000533 q = n / i;
534 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000535 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000536 if (n == q * i)
537 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000538
539 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000540 q = n / i;
541 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000542 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000543 if (n == q * i)
544 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000545
546 // This will loop i to the next "plane" of potential primes
547 i += 2;
548 }
549 }
550next:
551 // n is not prime. Increment n to next potential prime.
552 if (++in == M)
553 {
554 ++k0;
555 in = 0;
556 }
557 n = L * k0 + indices[in];
558 }
559}
560
561_LIBCPP_END_NAMESPACE_STD