blob: 75e773a3a647928e67178c1eb86a94bbcd97b814 [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");
Howard Hinnante00e6f22013-03-28 18:56:26 +0000158#else
159 (void)N;
Howard Hinnant5ec18262010-10-29 14:10:30 +0000160#endif
161}
162
Howard Hinnant43d978e2012-12-27 18:59:05 +0000163template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000164inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000165typename enable_if<_Sz == 8, void>::type
166__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000167{
Howard Hinnant43d978e2012-12-27 18:59:05 +0000168#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5ec18262010-10-29 14:10:30 +0000169 if (N > 0xFFFFFFFFFFFFFFC5ull)
170 throw overflow_error("__next_prime overflow");
Howard Hinnante00e6f22013-03-28 18:56:26 +0000171#else
172 (void)N;
Howard Hinnant5ec18262010-10-29 14:10:30 +0000173#endif
174}
175
Howard Hinnant3e519522010-05-11 19:42:16 +0000176size_t
177__next_prime(size_t n)
178{
179 const size_t L = 210;
180 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
181 // If n is small enough, search in small_primes
182 if (n <= small_primes[N-1])
183 return *std::lower_bound(small_primes, small_primes + N, n);
184 // Else n > largest small_primes
Howard Hinnant5ec18262010-10-29 14:10:30 +0000185 // Check for overflow
Howard Hinnant43d978e2012-12-27 18:59:05 +0000186 __check_for_overflow(n);
Howard Hinnant3e519522010-05-11 19:42:16 +0000187 // Start searching list of potential primes: L * k0 + indices[in]
188 const size_t M = sizeof(indices) / sizeof(indices[0]);
189 // Select first potential prime >= n
190 // Known a-priori n >= L
191 size_t k0 = n / L;
Howard Hinnantc2063662011-12-01 20:21:04 +0000192 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
193 - indices);
Howard Hinnant3e519522010-05-11 19:42:16 +0000194 n = L * k0 + indices[in];
195 while (true)
196 {
197 // Divide n by all primes or potential primes (i) until:
198 // 1. The division is even, so try next potential prime.
199 // 2. The i > sqrt(n), in which case n is prime.
200 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
201 // so don't test those (j == 5 -> divide by 11 first). And the
202 // potential primes start with 211, so don't test against the last
203 // small prime.
204 for (size_t j = 5; j < N - 1; ++j)
205 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000206 const std::size_t p = small_primes[j];
207 const std::size_t q = n / p;
208 if (q < p)
Howard Hinnant3e519522010-05-11 19:42:16 +0000209 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000210 if (n == q * p)
211 goto next;
Howard Hinnant3e519522010-05-11 19:42:16 +0000212 }
213 // n wasn't divisible by small primes, try potential primes
214 {
215 size_t i = 211;
216 while (true)
217 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000218 std::size_t 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 += 10;
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 += 2;
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 += 4;
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 += 2;
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 += 4;
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 += 6;
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 += 2;
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 += 6;
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 += 4;
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 += 2;
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 += 4;
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 += 6;
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 += 2;
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 += 6;
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 += 4;
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 += 2;
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 += 6;
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 += 4;
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 += 6;
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 += 8;
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 += 4;
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 += 2;
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 += 4;
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 += 2;
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 += 4;
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 += 8;
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 += 6;
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 += 4;
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 += 6;
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 += 2;
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 += 4;
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 += 6;
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 += 2;
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 += 6;
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 += 4;
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 += 2;
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 += 4;
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 += 6;
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 += 2;
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 += 6;
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 += 4;
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 += 2;
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 += 4;
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 += 2;
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 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000547 q = n / i;
548 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000549 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000550 if (n == q * i)
551 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000552
553 // This will loop i to the next "plane" of potential primes
554 i += 2;
555 }
556 }
557next:
558 // n is not prime. Increment n to next potential prime.
559 if (++in == M)
560 {
561 ++k0;
562 in = 0;
563 }
564 n = L * k0 + indices[in];
565 }
566}
567
568_LIBCPP_END_NAMESPACE_STD