blob: a013500218e0dfcfba9a09436e8b59ae25b58fea [file] [log] [blame]
Howard Hinnant3e519522010-05-11 19:42:16 +00001//===-------------------------- hash.cpp ----------------------------------===//
2//
Howard Hinnant5b08a8a2010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnant3e519522010-05-11 19:42:16 +00004//
Howard Hinnant412dbeb2010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3e519522010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#include "__hash_table"
11#include "algorithm"
Howard Hinnant5ec18262010-10-29 14:10:30 +000012#include "stdexcept"
Howard Hinnant43d978e2012-12-27 18:59:05 +000013#include "type_traits"
14
Howard Hinnant43d978e2012-12-27 18:59:05 +000015#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Howard Hinnant3e519522010-05-11 19:42:16 +000016
17_LIBCPP_BEGIN_NAMESPACE_STD
18
19namespace {
20
21// handle all next_prime(i) for i in [1, 210), special case 0
22const unsigned small_primes[] =
23{
24 0,
25 2,
26 3,
27 5,
28 7,
29 11,
30 13,
31 17,
32 19,
33 23,
34 29,
35 31,
36 37,
37 41,
38 43,
39 47,
40 53,
41 59,
42 61,
43 67,
44 71,
45 73,
46 79,
47 83,
48 89,
49 97,
50 101,
51 103,
52 107,
53 109,
54 113,
55 127,
56 131,
57 137,
58 139,
59 149,
60 151,
61 157,
62 163,
63 167,
64 173,
65 179,
66 181,
67 191,
68 193,
69 197,
70 199,
71 211
72};
73
74// potential primes = 210*k + indices[i], k >= 1
75// these numbers are not divisible by 2, 3, 5 or 7
76// (or any integer 2 <= j <= 10 for that matter).
77const unsigned indices[] =
78{
79 1,
80 11,
81 13,
82 17,
83 19,
84 23,
85 29,
86 31,
87 37,
88 41,
89 43,
90 47,
91 53,
92 59,
93 61,
94 67,
95 71,
96 73,
97 79,
98 83,
99 89,
100 97,
101 101,
102 103,
103 107,
104 109,
105 113,
106 121,
107 127,
108 131,
109 137,
110 139,
111 143,
112 149,
113 151,
114 157,
115 163,
116 167,
117 169,
118 173,
119 179,
120 181,
121 187,
122 191,
123 193,
124 197,
125 199,
126 209
127};
128
129}
130
131// Returns: If n == 0, returns 0. Else returns the lowest prime number that
132// is greater than or equal to n.
Howard Hinnant940e2112010-08-22 00:03:27 +0000133//
Howard Hinnant3e519522010-05-11 19:42:16 +0000134// The algorithm creates a list of small primes, plus an open-ended list of
135// potential primes. All prime numbers are potential prime numbers. However
136// some potential prime numbers are not prime. In an ideal world, all potential
137// prime numbers would be prime. Candiate prime numbers are chosen as the next
138// highest potential prime. Then this number is tested for prime by dividing it
139// by all potential prime numbers less than the sqrt of the candidate.
Howard Hinnant940e2112010-08-22 00:03:27 +0000140//
Howard Hinnant3e519522010-05-11 19:42:16 +0000141// This implementation defines potential primes as those numbers not divisible
142// by 2, 3, 5, and 7. Other (common) implementations define potential primes
143// as those not divisible by 2. A few other implementations define potential
144// primes as those not divisible by 2 or 3. By raising the number of small
145// primes which the potential prime is not divisible by, the set of potential
146// primes more closely approximates the set of prime numbers. And thus there
147// are fewer potential primes to search, and fewer potential primes to divide
148// against.
149
Howard Hinnant43d978e2012-12-27 18:59:05 +0000150template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000151inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000152typename enable_if<_Sz == 4, void>::type
153__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000154{
Howard Hinnant43d978e2012-12-27 18:59:05 +0000155#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5ec18262010-10-29 14:10:30 +0000156 if (N > 0xFFFFFFFB)
157 throw overflow_error("__next_prime overflow");
158#endif
159}
160
Howard Hinnant43d978e2012-12-27 18:59:05 +0000161template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000162inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000163typename enable_if<_Sz == 8, void>::type
164__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000165{
Howard Hinnant43d978e2012-12-27 18:59:05 +0000166#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5ec18262010-10-29 14:10:30 +0000167 if (N > 0xFFFFFFFFFFFFFFC5ull)
168 throw overflow_error("__next_prime overflow");
169#endif
170}
171
Howard Hinnant3e519522010-05-11 19:42:16 +0000172size_t
173__next_prime(size_t n)
174{
175 const size_t L = 210;
176 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
177 // If n is small enough, search in small_primes
178 if (n <= small_primes[N-1])
179 return *std::lower_bound(small_primes, small_primes + N, n);
180 // Else n > largest small_primes
Howard Hinnant5ec18262010-10-29 14:10:30 +0000181 // Check for overflow
Howard Hinnant43d978e2012-12-27 18:59:05 +0000182 __check_for_overflow(n);
Howard Hinnant3e519522010-05-11 19:42:16 +0000183 // Start searching list of potential primes: L * k0 + indices[in]
184 const size_t M = sizeof(indices) / sizeof(indices[0]);
185 // Select first potential prime >= n
186 // Known a-priori n >= L
187 size_t k0 = n / L;
Howard Hinnantc2063662011-12-01 20:21:04 +0000188 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
189 - indices);
Howard Hinnant3e519522010-05-11 19:42:16 +0000190 n = L * k0 + indices[in];
191 while (true)
192 {
193 // Divide n by all primes or potential primes (i) until:
194 // 1. The division is even, so try next potential prime.
195 // 2. The i > sqrt(n), in which case n is prime.
196 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
197 // so don't test those (j == 5 -> divide by 11 first). And the
198 // potential primes start with 211, so don't test against the last
199 // small prime.
200 for (size_t j = 5; j < N - 1; ++j)
201 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000202 const std::size_t p = small_primes[j];
203 const std::size_t q = n / p;
204 if (q < p)
Howard Hinnant3e519522010-05-11 19:42:16 +0000205 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000206 if (n == q * p)
207 goto next;
Howard Hinnant3e519522010-05-11 19:42:16 +0000208 }
209 // n wasn't divisible by small primes, try potential primes
210 {
211 size_t i = 211;
212 while (true)
213 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000214 std::size_t q = n / i;
215 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000216 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000217 if (n == q * i)
218 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000219
220 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000221 q = n / i;
222 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000223 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000224 if (n == q * i)
225 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000226
227 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000228 q = n / i;
229 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000230 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000231 if (n == q * i)
232 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000233
234 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000235 q = n / i;
236 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000237 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000238 if (n == q * i)
239 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000240
241 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000242 q = n / i;
243 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000244 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000245 if (n == q * i)
246 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000247
248 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000249 q = n / i;
250 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000251 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000252 if (n == q * i)
253 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000254
255 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000256 q = n / i;
257 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000258 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000259 if (n == q * i)
260 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000261
262 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000263 q = n / i;
264 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000265 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000266 if (n == q * i)
267 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000268
269 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000270 q = n / i;
271 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000272 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000273 if (n == q * i)
274 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000275
276 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000277 q = n / i;
278 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000279 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000280 if (n == q * i)
281 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000282
283 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000284 q = n / i;
285 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000286 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000287 if (n == q * i)
288 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000289
290 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000291 q = n / i;
292 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000293 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000294 if (n == q * i)
295 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000296
297 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000298 q = n / i;
299 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000300 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000301 if (n == q * i)
302 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000303
304 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000305 q = n / i;
306 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000307 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000308 if (n == q * i)
309 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000310
311 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000312 q = n / i;
313 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000314 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000315 if (n == q * i)
316 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000317
318 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000319 q = n / i;
320 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000321 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000322 if (n == q * i)
323 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000324
325 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000326 q = n / i;
327 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000328 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000329 if (n == q * i)
330 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000331
332 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000333 q = n / i;
334 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000335 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000336 if (n == q * i)
337 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000338
339 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000340 q = n / i;
341 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000342 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000343 if (n == q * i)
344 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000345
346 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000347 q = n / i;
348 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000349 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000350 if (n == q * i)
351 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000352
353 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000354 q = n / i;
355 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000356 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000357 if (n == q * i)
358 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000359
360 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000361 q = n / i;
362 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000363 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000364 if (n == q * i)
365 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000366
367 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000368 q = n / i;
369 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000370 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000371 if (n == q * i)
372 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000373
374 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000375 q = n / i;
376 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000377 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000378 if (n == q * i)
379 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000380
381 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000382 q = n / i;
383 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000384 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000385 if (n == q * i)
386 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000387
388 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000389 q = n / i;
390 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000391 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000392 if (n == q * i)
393 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000394
395 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000396 q = n / i;
397 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000398 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000399 if (n == q * i)
400 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000401
402 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000403 q = n / i;
404 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000405 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000406 if (n == q * i)
407 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000408
409 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000410 q = n / i;
411 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000412 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000413 if (n == q * i)
414 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000415
416 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000417 q = n / i;
418 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000419 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000420 if (n == q * i)
421 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000422
423 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000424 q = n / i;
425 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000426 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000427 if (n == q * i)
428 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000429
430 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000431 q = n / i;
432 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000433 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000434 if (n == q * i)
435 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000436
437 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000438 q = n / i;
439 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000440 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000441 if (n == q * i)
442 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000443
444 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000445 q = n / i;
446 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000447 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000448 if (n == q * i)
449 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000450
451 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000452 q = n / i;
453 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000454 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000455 if (n == q * i)
456 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000457
458 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000459 q = n / i;
460 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000461 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000462 if (n == q * i)
463 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000464
465 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000466 q = n / i;
467 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000468 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000469 if (n == q * i)
470 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000471
472 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000473 q = n / i;
474 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000475 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000476 if (n == q * i)
477 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000478
479 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000480 q = n / i;
481 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000482 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000483 if (n == q * i)
484 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000485
486 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000487 q = n / i;
488 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000489 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000490 if (n == q * i)
491 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000492
493 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000494 q = n / i;
495 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000496 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000497 if (n == q * i)
498 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000499
500 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000501 q = n / i;
502 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000503 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000504 if (n == q * i)
505 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000506
507 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000508 q = n / i;
509 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000510 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000511 if (n == q * i)
512 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000513
514 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000515 q = n / i;
516 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000517 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000518 if (n == q * i)
519 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000520
521 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000522 q = n / i;
523 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000524 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000525 if (n == q * i)
526 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000527
528 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000529 q = n / i;
530 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000531 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000532 if (n == q * i)
533 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000534
535 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000536 q = n / i;
537 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000538 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000539 if (n == q * i)
540 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000541
542 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000543 q = n / i;
544 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000545 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000546 if (n == q * i)
547 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000548
549 // This will loop i to the next "plane" of potential primes
550 i += 2;
551 }
552 }
553next:
554 // n is not prime. Increment n to next potential prime.
555 if (++in == M)
556 {
557 ++k0;
558 in = 0;
559 }
560 n = L * k0 + indices[in];
561 }
562}
563
564_LIBCPP_END_NAMESPACE_STD