blob: 388ab2ebe17574b747a0609ee84b8527c1266a56 [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
Joerg Sonnenberger006ab1e2013-04-27 19:10:15 +000015#ifdef __clang__
Howard Hinnant0aa900e2012-12-27 18:59:05 +000016#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Joerg Sonnenberger006ab1e2013-04-27 19:10:15 +000017#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000018
19_LIBCPP_BEGIN_NAMESPACE_STD
20
21namespace {
22
23// handle all next_prime(i) for i in [1, 210), special case 0
24const unsigned small_primes[] =
25{
26 0,
27 2,
28 3,
29 5,
30 7,
31 11,
32 13,
33 17,
34 19,
35 23,
36 29,
37 31,
38 37,
39 41,
40 43,
41 47,
42 53,
43 59,
44 61,
45 67,
46 71,
47 73,
48 79,
49 83,
50 89,
51 97,
52 101,
53 103,
54 107,
55 109,
56 113,
57 127,
58 131,
59 137,
60 139,
61 149,
62 151,
63 157,
64 163,
65 167,
66 173,
67 179,
68 181,
69 191,
70 193,
71 197,
72 199,
73 211
74};
75
76// potential primes = 210*k + indices[i], k >= 1
77// these numbers are not divisible by 2, 3, 5 or 7
78// (or any integer 2 <= j <= 10 for that matter).
79const unsigned indices[] =
80{
81 1,
82 11,
83 13,
84 17,
85 19,
86 23,
87 29,
88 31,
89 37,
90 41,
91 43,
92 47,
93 53,
94 59,
95 61,
96 67,
97 71,
98 73,
99 79,
100 83,
101 89,
102 97,
103 101,
104 103,
105 107,
106 109,
107 113,
108 121,
109 127,
110 131,
111 137,
112 139,
113 143,
114 149,
115 151,
116 157,
117 163,
118 167,
119 169,
120 173,
121 179,
122 181,
123 187,
124 191,
125 193,
126 197,
127 199,
128 209
129};
130
131}
132
133// Returns: If n == 0, returns 0. Else returns the lowest prime number that
134// is greater than or equal to n.
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000135//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000136// The algorithm creates a list of small primes, plus an open-ended list of
137// potential primes. All prime numbers are potential prime numbers. However
138// some potential prime numbers are not prime. In an ideal world, all potential
139// prime numbers would be prime. Candiate prime numbers are chosen as the next
140// highest potential prime. Then this number is tested for prime by dividing it
141// by all potential prime numbers less than the sqrt of the candidate.
Howard Hinnant16e6e1d2010-08-22 00:03:27 +0000142//
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000143// This implementation defines potential primes as those numbers not divisible
144// by 2, 3, 5, and 7. Other (common) implementations define potential primes
145// as those not divisible by 2. A few other implementations define potential
146// primes as those not divisible by 2 or 3. By raising the number of small
147// primes which the potential prime is not divisible by, the set of potential
148// primes more closely approximates the set of prime numbers. And thus there
149// are fewer potential primes to search, and fewer potential primes to divide
150// against.
151
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000152template <size_t _Sz = sizeof(size_t)>
Howard Hinnante87ad172010-10-29 14:10:30 +0000153inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000154typename enable_if<_Sz == 4, void>::type
155__check_for_overflow(size_t N)
Howard Hinnante87ad172010-10-29 14:10:30 +0000156{
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000157#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante87ad172010-10-29 14:10:30 +0000158 if (N > 0xFFFFFFFB)
159 throw overflow_error("__next_prime overflow");
Howard Hinnantdb4d4782013-03-28 18:56:26 +0000160#else
161 (void)N;
Howard Hinnante87ad172010-10-29 14:10:30 +0000162#endif
163}
164
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000165template <size_t _Sz = sizeof(size_t)>
Howard Hinnante87ad172010-10-29 14:10:30 +0000166inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000167typename enable_if<_Sz == 8, void>::type
168__check_for_overflow(size_t N)
Howard Hinnante87ad172010-10-29 14:10:30 +0000169{
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000170#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante87ad172010-10-29 14:10:30 +0000171 if (N > 0xFFFFFFFFFFFFFFC5ull)
172 throw overflow_error("__next_prime overflow");
Howard Hinnantdb4d4782013-03-28 18:56:26 +0000173#else
174 (void)N;
Howard Hinnante87ad172010-10-29 14:10:30 +0000175#endif
176}
177
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000178size_t
179__next_prime(size_t n)
180{
181 const size_t L = 210;
182 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
183 // If n is small enough, search in small_primes
184 if (n <= small_primes[N-1])
185 return *std::lower_bound(small_primes, small_primes + N, n);
186 // Else n > largest small_primes
Howard Hinnante87ad172010-10-29 14:10:30 +0000187 // Check for overflow
Howard Hinnant0aa900e2012-12-27 18:59:05 +0000188 __check_for_overflow(n);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000189 // Start searching list of potential primes: L * k0 + indices[in]
190 const size_t M = sizeof(indices) / sizeof(indices[0]);
191 // Select first potential prime >= n
192 // Known a-priori n >= L
193 size_t k0 = n / L;
Howard Hinnantec3773c2011-12-01 20:21:04 +0000194 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
195 - indices);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000196 n = L * k0 + indices[in];
197 while (true)
198 {
199 // Divide n by all primes or potential primes (i) until:
200 // 1. The division is even, so try next potential prime.
201 // 2. The i > sqrt(n), in which case n is prime.
202 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
203 // so don't test those (j == 5 -> divide by 11 first). And the
204 // potential primes start with 211, so don't test against the last
205 // small prime.
206 for (size_t j = 5; j < N - 1; ++j)
207 {
Howard Hinnantd2a92512010-09-13 01:43:27 +0000208 const std::size_t p = small_primes[j];
209 const std::size_t q = n / p;
210 if (q < p)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000211 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000212 if (n == q * p)
213 goto next;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000214 }
215 // n wasn't divisible by small primes, try potential primes
216 {
217 size_t i = 211;
218 while (true)
219 {
Howard Hinnantd2a92512010-09-13 01:43:27 +0000220 std::size_t q = n / i;
221 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000222 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000223 if (n == q * i)
224 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000225
226 i += 10;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000227 q = n / i;
228 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000229 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000230 if (n == q * i)
231 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000232
233 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000234 q = n / i;
235 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000236 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000237 if (n == q * i)
238 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000239
240 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000241 q = n / i;
242 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000243 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000244 if (n == q * i)
245 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000246
247 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000248 q = n / i;
249 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000250 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000251 if (n == q * i)
252 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000253
254 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000255 q = n / i;
256 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000257 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000258 if (n == q * i)
259 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000260
261 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000262 q = n / i;
263 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000264 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000265 if (n == q * i)
266 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000267
268 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000269 q = n / i;
270 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000271 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000272 if (n == q * i)
273 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000274
275 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000276 q = n / i;
277 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000278 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000279 if (n == q * i)
280 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000281
282 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000283 q = n / i;
284 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000285 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000286 if (n == q * i)
287 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000288
289 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000290 q = n / i;
291 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000292 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000293 if (n == q * i)
294 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000295
296 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000297 q = n / i;
298 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000299 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000300 if (n == q * i)
301 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000302
303 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000304 q = n / i;
305 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000306 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000307 if (n == q * i)
308 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000309
310 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000311 q = n / i;
312 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000313 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000314 if (n == q * i)
315 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000316
317 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000318 q = n / i;
319 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000320 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000321 if (n == q * i)
322 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000323
324 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000325 q = n / i;
326 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000327 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000328 if (n == q * i)
329 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000330
331 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000332 q = n / i;
333 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000334 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000335 if (n == q * i)
336 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000337
338 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000339 q = n / i;
340 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000341 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000342 if (n == q * i)
343 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000344
345 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000346 q = n / i;
347 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000348 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000349 if (n == q * i)
350 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000351
352 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000353 q = n / i;
354 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000355 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000356 if (n == q * i)
357 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000358
359 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000360 q = n / i;
361 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000362 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000363 if (n == q * i)
364 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000365
366 i += 8;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000367 q = n / i;
368 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000369 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000370 if (n == q * i)
371 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000372
373 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000374 q = n / i;
375 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000376 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000377 if (n == q * i)
378 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000379
380 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000381 q = n / i;
382 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000383 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000384 if (n == q * i)
385 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000386
387 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000388 q = n / i;
389 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000390 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000391 if (n == q * i)
392 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000393
394 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000395 q = n / i;
396 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000397 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000398 if (n == q * i)
399 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000400
401 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000402 q = n / i;
403 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000404 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000405 if (n == q * i)
406 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000407
408 i += 8;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000409 q = n / i;
410 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000411 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000412 if (n == q * i)
413 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000414
415 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000416 q = n / i;
417 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000418 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000419 if (n == q * i)
420 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000421
422 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000423 q = n / i;
424 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000425 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000426 if (n == q * i)
427 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000428
429 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000430 q = n / i;
431 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000432 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000433 if (n == q * i)
434 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000435
436 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000437 q = n / i;
438 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000439 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000440 if (n == q * i)
441 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000442
443 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000444 q = n / i;
445 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000446 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000447 if (n == q * i)
448 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000449
450 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000451 q = n / i;
452 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000453 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000454 if (n == q * i)
455 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000456
457 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000458 q = n / i;
459 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000460 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000461 if (n == q * i)
462 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000463
464 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000465 q = n / i;
466 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000467 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000468 if (n == q * i)
469 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000470
471 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000472 q = n / i;
473 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000474 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000475 if (n == q * i)
476 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000477
478 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000479 q = n / i;
480 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000481 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000482 if (n == q * i)
483 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000484
485 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000486 q = n / i;
487 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000488 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000489 if (n == q * i)
490 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000491
492 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000493 q = n / i;
494 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000495 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000496 if (n == q * i)
497 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000498
499 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000500 q = n / i;
501 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000502 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000503 if (n == q * i)
504 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000505
506 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000507 q = n / i;
508 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000509 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000510 if (n == q * i)
511 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000512
513 i += 6;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000514 q = n / i;
515 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000516 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000517 if (n == q * i)
518 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000519
520 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000521 q = n / i;
522 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000523 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000524 if (n == q * i)
525 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000526
527 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000528 q = n / i;
529 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000530 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000531 if (n == q * i)
532 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000533
534 i += 4;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000535 q = n / i;
536 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000537 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000538 if (n == q * i)
539 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000540
541 i += 2;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000542 q = n / i;
543 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000544 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000545 if (n == q * i)
546 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000547
548 i += 10;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000549 q = n / i;
550 if (q < i)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000551 return n;
Howard Hinnantd2a92512010-09-13 01:43:27 +0000552 if (n == q * i)
553 break;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000554
555 // This will loop i to the next "plane" of potential primes
556 i += 2;
557 }
558 }
559next:
560 // n is not prime. Increment n to next potential prime.
561 if (++in == M)
562 {
563 ++k0;
564 in = 0;
565 }
566 n = L * k0 + indices[in];
567 }
568}
569
570_LIBCPP_END_NAMESPACE_STD