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