blob: 75e773a3a647928e67178c1eb86a94bbcd97b814 [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");
Howard Hinnant417bc432013-03-28 18:56:26 +0000158#else
159 (void)N;
Howard Hinnant5d5da682010-10-29 14:10:30 +0000160#endif
161}
162
Howard Hinnant8765fc32012-12-27 18:59:05 +0000163template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000164inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000165typename enable_if<_Sz == 8, void>::type
166__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000167{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000168#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000169 if (N > 0xFFFFFFFFFFFFFFC5ull)
170 throw overflow_error("__next_prime overflow");
Howard Hinnant417bc432013-03-28 18:56:26 +0000171#else
172 (void)N;
Howard Hinnant5d5da682010-10-29 14:10:30 +0000173#endif
174}
175
Howard Hinnantc51e1022010-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 Hinnant5d5da682010-10-29 14:10:30 +0000185 // Check for overflow
Howard Hinnant8765fc32012-12-27 18:59:05 +0000186 __check_for_overflow(n);
Howard Hinnantc51e1022010-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 Hinnant28b24882011-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 Hinnantc51e1022010-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 Hinnant7bf565c2010-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 Hinnantc51e1022010-05-11 19:42:16 +0000209 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000210 if (n == q * p)
211 goto next;
Howard Hinnantc51e1022010-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 Hinnant7bf565c2010-09-13 01:43:27 +0000218 std::size_t q = n / i;
219 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000220 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000221 if (n == q * i)
222 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000223
224 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000225 q = n / i;
226 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000227 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000228 if (n == q * i)
229 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000230
231 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000232 q = n / i;
233 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000235 if (n == q * i)
236 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237
238 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000239 q = n / i;
240 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000242 if (n == q * i)
243 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000244
245 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000246 q = n / i;
247 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000249 if (n == q * i)
250 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000251
252 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000253 q = n / i;
254 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000256 if (n == q * i)
257 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000258
259 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000260 q = n / i;
261 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000262 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000263 if (n == q * i)
264 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000265
266 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000267 q = n / i;
268 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000269 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000270 if (n == q * i)
271 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000272
273 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000274 q = n / i;
275 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000277 if (n == q * i)
278 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000279
280 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000281 q = n / i;
282 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000284 if (n == q * i)
285 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000286
287 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000288 q = n / i;
289 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000290 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000291 if (n == q * i)
292 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293
294 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000295 q = n / i;
296 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000297 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000298 if (n == q * i)
299 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000300
301 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000302 q = n / i;
303 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000305 if (n == q * i)
306 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307
308 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000309 q = n / i;
310 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000312 if (n == q * i)
313 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314
315 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000316 q = n / i;
317 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000319 if (n == q * i)
320 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321
322 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000323 q = n / i;
324 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000326 if (n == q * i)
327 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328
329 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000330 q = n / i;
331 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000333 if (n == q * i)
334 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335
336 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000337 q = n / i;
338 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000340 if (n == q * i)
341 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342
343 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000344 q = n / i;
345 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000347 if (n == q * i)
348 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349
350 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000351 q = n / i;
352 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000354 if (n == q * i)
355 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000356
357 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000358 q = n / i;
359 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000361 if (n == q * i)
362 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363
364 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000365 q = n / i;
366 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000368 if (n == q * i)
369 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370
371 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000372 q = n / i;
373 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000375 if (n == q * i)
376 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377
378 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000379 q = n / i;
380 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000381 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000382 if (n == q * i)
383 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384
385 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000386 q = n / i;
387 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000389 if (n == q * i)
390 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391
392 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000393 q = n / i;
394 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000396 if (n == q * i)
397 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398
399 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000400 q = n / i;
401 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000402 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000403 if (n == q * i)
404 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405
406 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000407 q = n / i;
408 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000410 if (n == q * i)
411 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412
413 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000414 q = n / i;
415 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000417 if (n == q * i)
418 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419
420 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000421 q = n / i;
422 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000424 if (n == q * i)
425 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426
427 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000428 q = n / i;
429 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000430 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000431 if (n == q * i)
432 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433
434 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000435 q = n / i;
436 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000438 if (n == q * i)
439 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440
441 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000442 q = n / i;
443 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000445 if (n == q * i)
446 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447
448 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000449 q = n / i;
450 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000451 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000452 if (n == q * i)
453 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454
455 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000456 q = n / i;
457 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000458 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000459 if (n == q * i)
460 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461
462 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000463 q = n / i;
464 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000466 if (n == q * i)
467 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000468
469 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000470 q = n / i;
471 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000472 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000473 if (n == q * i)
474 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475
476 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000477 q = n / i;
478 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000480 if (n == q * i)
481 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482
483 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000484 q = n / i;
485 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000487 if (n == q * i)
488 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000489
490 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000491 q = n / i;
492 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000493 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000494 if (n == q * i)
495 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000496
497 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000498 q = n / i;
499 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000501 if (n == q * i)
502 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000503
504 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000505 q = n / i;
506 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000508 if (n == q * i)
509 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510
511 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000512 q = n / i;
513 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000515 if (n == q * i)
516 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000517
518 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000519 q = n / i;
520 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000522 if (n == q * i)
523 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524
525 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000526 q = n / i;
527 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000529 if (n == q * i)
530 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531
532 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000533 q = n / i;
534 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000536 if (n == q * i)
537 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538
539 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000540 q = n / i;
541 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000543 if (n == q * i)
544 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545
546 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000547 q = n / i;
548 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000549 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000550 if (n == q * i)
551 break;
Howard Hinnantc51e1022010-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