blob: 1631b91acb191f19ded82f26fcbf0878dad93122 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001//===-------------------------- hash.cpp ----------------------------------===//
2//
Chandler Carruthd2012102019-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 Hinnantc51e1022010-05-11 19:42:16 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "__hash_table"
10#include "algorithm"
Howard Hinnant5d5da682010-10-29 14:10:30 +000011#include "stdexcept"
Howard Hinnant8765fc32012-12-27 18:59:05 +000012#include "type_traits"
13
Joerg Sonnenberger3cf67aa2013-04-27 19:10:15 +000014#ifdef __clang__
Howard Hinnant8765fc32012-12-27 18:59:05 +000015#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Joerg Sonnenberger3cf67aa2013-04-27 19:10:15 +000016#endif
Howard Hinnantc51e1022010-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 Hinnantffb308e2010-08-22 00:03:27 +0000134//
Howard Hinnantc51e1022010-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 Tokerb8a95f52014-05-15 11:27:39 +0000138// prime numbers would be prime. Candidate prime numbers are chosen as the next
Howard Hinnantc51e1022010-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 Hinnantffb308e2010-08-22 00:03:27 +0000141//
Howard Hinnantc51e1022010-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 Hinnant8765fc32012-12-27 18:59:05 +0000151template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000152inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000153typename enable_if<_Sz == 4, void>::type
154__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000155{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000156#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000157 if (N > 0xFFFFFFFB)
158 throw overflow_error("__next_prime overflow");
Howard Hinnant417bc432013-03-28 18:56:26 +0000159#else
160 (void)N;
Howard Hinnant5d5da682010-10-29 14:10:30 +0000161#endif
162}
163
Howard Hinnant8765fc32012-12-27 18:59:05 +0000164template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000165inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000166typename enable_if<_Sz == 8, void>::type
167__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000168{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000169#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000170 if (N > 0xFFFFFFFFFFFFFFC5ull)
171 throw overflow_error("__next_prime overflow");
Howard Hinnant417bc432013-03-28 18:56:26 +0000172#else
173 (void)N;
Howard Hinnant5d5da682010-10-29 14:10:30 +0000174#endif
175}
176
Howard Hinnantc51e1022010-05-11 19:42:16 +0000177size_t
178__next_prime(size_t n)
179{
180 const size_t L = 210;
181 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
182 // If n is small enough, search in small_primes
183 if (n <= small_primes[N-1])
184 return *std::lower_bound(small_primes, small_primes + N, n);
185 // Else n > largest small_primes
Howard Hinnant5d5da682010-10-29 14:10:30 +0000186 // Check for overflow
Howard Hinnant8765fc32012-12-27 18:59:05 +0000187 __check_for_overflow(n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000188 // Start searching list of potential primes: L * k0 + indices[in]
189 const size_t M = sizeof(indices) / sizeof(indices[0]);
190 // Select first potential prime >= n
191 // Known a-priori n >= L
192 size_t k0 = n / L;
Howard Hinnant28b24882011-12-01 20:21:04 +0000193 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
194 - indices);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000195 n = L * k0 + indices[in];
196 while (true)
197 {
198 // Divide n by all primes or potential primes (i) until:
199 // 1. The division is even, so try next potential prime.
200 // 2. The i > sqrt(n), in which case n is prime.
201 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
202 // so don't test those (j == 5 -> divide by 11 first). And the
203 // potential primes start with 211, so don't test against the last
204 // small prime.
205 for (size_t j = 5; j < N - 1; ++j)
206 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000207 const std::size_t p = small_primes[j];
208 const std::size_t q = n / p;
209 if (q < p)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000210 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000211 if (n == q * p)
212 goto next;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000213 }
214 // n wasn't divisible by small primes, try potential primes
215 {
216 size_t i = 211;
217 while (true)
218 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000219 std::size_t q = n / i;
220 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000222 if (n == q * i)
223 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224
225 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000226 q = n / i;
227 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000229 if (n == q * i)
230 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000231
232 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000233 q = n / i;
234 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000236 if (n == q * i)
237 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000238
239 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000240 q = n / i;
241 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000242 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000243 if (n == q * i)
244 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245
246 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000247 q = n / i;
248 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000249 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000250 if (n == q * i)
251 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000252
253 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000254 q = n / i;
255 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000256 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000257 if (n == q * i)
258 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000259
260 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000261 q = n / i;
262 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000263 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000264 if (n == q * i)
265 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000266
267 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000268 q = n / i;
269 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000271 if (n == q * i)
272 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000273
274 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000275 q = n / i;
276 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000277 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000278 if (n == q * i)
279 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280
281 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000282 q = n / i;
283 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000284 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000285 if (n == q * i)
286 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000287
288 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000289 q = n / i;
290 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000291 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000292 if (n == q * i)
293 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294
295 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000296 q = n / i;
297 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000299 if (n == q * i)
300 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301
302 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000303 q = n / i;
304 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000305 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000306 if (n == q * i)
307 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308
309 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000310 q = n / i;
311 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000313 if (n == q * i)
314 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315
316 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000317 q = n / i;
318 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000319 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000320 if (n == q * i)
321 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322
323 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000324 q = n / i;
325 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000327 if (n == q * i)
328 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329
330 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000331 q = n / i;
332 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000333 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000334 if (n == q * i)
335 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000336
337 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000338 q = n / i;
339 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000340 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000341 if (n == q * i)
342 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000343
344 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000345 q = n / i;
346 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000348 if (n == q * i)
349 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000350
351 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000352 q = n / i;
353 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000355 if (n == q * i)
356 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000357
358 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000359 q = n / i;
360 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000362 if (n == q * i)
363 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000364
365 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000366 q = n / i;
367 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000369 if (n == q * i)
370 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371
372 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000373 q = n / i;
374 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000376 if (n == q * i)
377 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378
379 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000380 q = n / i;
381 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000383 if (n == q * i)
384 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000385
386 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000387 q = n / i;
388 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000390 if (n == q * i)
391 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000392
393 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000394 q = n / i;
395 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000396 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000397 if (n == q * i)
398 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399
400 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000401 q = n / i;
402 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000404 if (n == q * i)
405 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406
407 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000408 q = n / i;
409 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000411 if (n == q * i)
412 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000413
414 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000415 q = n / i;
416 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000417 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000418 if (n == q * i)
419 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420
421 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000422 q = n / i;
423 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000425 if (n == q * i)
426 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000427
428 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000429 q = n / i;
430 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000432 if (n == q * i)
433 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000434
435 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000436 q = n / i;
437 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000439 if (n == q * i)
440 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441
442 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000443 q = n / i;
444 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000445 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000446 if (n == q * i)
447 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000448
449 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000450 q = n / i;
451 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000452 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000453 if (n == q * i)
454 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000455
456 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000457 q = n / i;
458 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000459 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000460 if (n == q * i)
461 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000462
463 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000464 q = n / i;
465 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000466 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000467 if (n == q * i)
468 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000469
470 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000471 q = n / i;
472 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000473 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000474 if (n == q * i)
475 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476
477 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000478 q = n / i;
479 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000480 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000481 if (n == q * i)
482 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000483
484 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000485 q = n / i;
486 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000488 if (n == q * i)
489 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490
491 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000492 q = n / i;
493 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000495 if (n == q * i)
496 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497
498 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000499 q = n / i;
500 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000501 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000502 if (n == q * i)
503 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000504
505 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000506 q = n / i;
507 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000508 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000509 if (n == q * i)
510 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000511
512 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000513 q = n / i;
514 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000516 if (n == q * i)
517 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518
519 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000520 q = n / i;
521 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000523 if (n == q * i)
524 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000525
526 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000527 q = n / i;
528 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000530 if (n == q * i)
531 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532
533 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000534 q = n / i;
535 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000537 if (n == q * i)
538 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539
540 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000541 q = n / i;
542 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000543 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000544 if (n == q * i)
545 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546
547 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000548 q = n / i;
549 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000550 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000551 if (n == q * i)
552 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553
554 // This will loop i to the next "plane" of potential primes
555 i += 2;
556 }
557 }
558next:
559 // n is not prime. Increment n to next potential prime.
560 if (++in == M)
561 {
562 ++k0;
563 in = 0;
564 }
565 n = L * k0 + indices[in];
566 }
567}
568
569_LIBCPP_END_NAMESPACE_STD