blob: a013500218e0dfcfba9a09436e8b59ae25b58fea [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001//===-------------------------- hash.cpp ----------------------------------===//
2//
Howard Hinnantc566dc32010-05-11 21:36:01 +00003// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00004//
Howard Hinnantee11c312010-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 Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#include "__hash_table"
11#include "algorithm"
Howard Hinnant5d5da682010-10-29 14:10:30 +000012#include "stdexcept"
Howard Hinnant8765fc32012-12-27 18:59:05 +000013#include "type_traits"
14
Howard Hinnant8765fc32012-12-27 18:59:05 +000015#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Howard Hinnantc51e1022010-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 Hinnantffb308e2010-08-22 00:03:27 +0000133//
Howard Hinnantc51e1022010-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 Hinnantffb308e2010-08-22 00:03:27 +0000140//
Howard Hinnantc51e1022010-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 Hinnant8765fc32012-12-27 18:59:05 +0000150template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000151inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000152typename enable_if<_Sz == 4, void>::type
153__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000154{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000155#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000156 if (N > 0xFFFFFFFB)
157 throw overflow_error("__next_prime overflow");
158#endif
159}
160
Howard Hinnant8765fc32012-12-27 18:59:05 +0000161template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000162inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000163typename enable_if<_Sz == 8, void>::type
164__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000165{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000166#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000167 if (N > 0xFFFFFFFFFFFFFFC5ull)
168 throw overflow_error("__next_prime overflow");
169#endif
170}
171
Howard Hinnantc51e1022010-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 Hinnant5d5da682010-10-29 14:10:30 +0000181 // Check for overflow
Howard Hinnant8765fc32012-12-27 18:59:05 +0000182 __check_for_overflow(n);
Howard Hinnantc51e1022010-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 Hinnant28b24882011-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 Hinnantc51e1022010-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 Hinnant7bf565c2010-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 Hinnantc51e1022010-05-11 19:42:16 +0000205 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000206 if (n == q * p)
207 goto next;
Howard Hinnantc51e1022010-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 Hinnant7bf565c2010-09-13 01:43:27 +0000214 std::size_t q = n / i;
215 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000216 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000217 if (n == q * i)
218 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219
220 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000221 q = n / i;
222 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000223 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000224 if (n == q * i)
225 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000226
227 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000228 q = n / i;
229 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000230 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000231 if (n == q * i)
232 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000233
234 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000235 q = n / i;
236 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000238 if (n == q * i)
239 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000240
241 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000242 q = n / i;
243 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000244 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000245 if (n == q * i)
246 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247
248 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000249 q = n / i;
250 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000251 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000252 if (n == q * i)
253 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000254
255 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000256 q = n / i;
257 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000258 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000259 if (n == q * i)
260 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000261
262 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000263 q = n / i;
264 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000265 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000266 if (n == q * i)
267 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000268
269 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000270 q = n / i;
271 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000272 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000273 if (n == q * i)
274 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000275
276 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000277 q = n / i;
278 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000279 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000280 if (n == q * i)
281 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000282
283 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000284 q = n / i;
285 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000286 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000287 if (n == q * i)
288 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000289
290 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000291 q = n / i;
292 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000294 if (n == q * i)
295 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000296
297 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000298 q = n / i;
299 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000300 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000301 if (n == q * i)
302 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303
304 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000305 q = n / i;
306 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000308 if (n == q * i)
309 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310
311 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000312 q = n / i;
313 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000315 if (n == q * i)
316 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000317
318 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000319 q = n / i;
320 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000322 if (n == q * i)
323 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324
325 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000326 q = n / i;
327 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000329 if (n == q * i)
330 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331
332 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000333 q = n / i;
334 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000336 if (n == q * i)
337 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338
339 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000340 q = n / i;
341 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000343 if (n == q * i)
344 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345
346 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000347 q = n / i;
348 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000350 if (n == q * i)
351 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352
353 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000354 q = n / i;
355 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000356 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000357 if (n == q * i)
358 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359
360 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000361 q = n / i;
362 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000364 if (n == q * i)
365 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000366
367 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000368 q = n / i;
369 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000371 if (n == q * i)
372 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373
374 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000375 q = n / i;
376 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000378 if (n == q * i)
379 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380
381 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000382 q = n / i;
383 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000385 if (n == q * i)
386 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387
388 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000389 q = n / i;
390 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000392 if (n == q * i)
393 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394
395 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000396 q = n / i;
397 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000399 if (n == q * i)
400 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401
402 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000403 q = n / i;
404 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000406 if (n == q * i)
407 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000408
409 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000410 q = n / i;
411 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000413 if (n == q * i)
414 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000415
416 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000417 q = n / i;
418 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000420 if (n == q * i)
421 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422
423 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000424 q = n / i;
425 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000427 if (n == q * i)
428 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000429
430 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000431 q = n / i;
432 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000434 if (n == q * i)
435 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000436
437 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000438 q = n / i;
439 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000441 if (n == q * i)
442 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000443
444 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000445 q = n / i;
446 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000448 if (n == q * i)
449 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000450
451 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000452 q = n / i;
453 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000455 if (n == q * i)
456 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457
458 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000459 q = n / i;
460 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000462 if (n == q * i)
463 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464
465 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000466 q = n / i;
467 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000468 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000469 if (n == q * i)
470 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471
472 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000473 q = n / i;
474 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000476 if (n == q * i)
477 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000478
479 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000480 q = n / i;
481 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000483 if (n == q * i)
484 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485
486 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000487 q = n / i;
488 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000489 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000490 if (n == q * i)
491 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492
493 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000494 q = n / i;
495 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000496 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000497 if (n == q * i)
498 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000499
500 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000501 q = n / i;
502 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000503 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000504 if (n == q * i)
505 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000506
507 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000508 q = n / i;
509 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000511 if (n == q * i)
512 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513
514 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000515 q = n / i;
516 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000517 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000518 if (n == q * i)
519 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000520
521 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000522 q = n / i;
523 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000525 if (n == q * i)
526 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527
528 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000529 q = n / i;
530 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000532 if (n == q * i)
533 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534
535 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000536 q = n / i;
537 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000539 if (n == q * i)
540 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541
542 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000543 q = n / i;
544 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000546 if (n == q * i)
547 break;
Howard Hinnantc51e1022010-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