blob: dc90f789c6b81e200cbd2307a8440a3a5b566bb8 [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
Joerg Sonnenbergerff3ce2b2013-04-27 19:10:15 +000015#ifdef __clang__
Howard Hinnant43d978e2012-12-27 18:59:05 +000016#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Joerg Sonnenbergerff3ce2b2013-04-27 19:10:15 +000017#endif
Howard Hinnant3e519522010-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 Hinnant940e2112010-08-22 00:03:27 +0000135//
Howard Hinnant3e519522010-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
Alp Tokerf03763a2014-05-15 11:27:39 +0000139// prime numbers would be prime. Candidate prime numbers are chosen as the next
Howard Hinnant3e519522010-05-11 19:42:16 +0000140// 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 Hinnant940e2112010-08-22 00:03:27 +0000142//
Howard Hinnant3e519522010-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 Hinnant43d978e2012-12-27 18:59:05 +0000152template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000153inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000154typename enable_if<_Sz == 4, void>::type
155__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000156{
Howard Hinnant43d978e2012-12-27 18:59:05 +0000157#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5ec18262010-10-29 14:10:30 +0000158 if (N > 0xFFFFFFFB)
159 throw overflow_error("__next_prime overflow");
Howard Hinnante00e6f22013-03-28 18:56:26 +0000160#else
161 (void)N;
Howard Hinnant5ec18262010-10-29 14:10:30 +0000162#endif
163}
164
Howard Hinnant43d978e2012-12-27 18:59:05 +0000165template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5ec18262010-10-29 14:10:30 +0000166inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant43d978e2012-12-27 18:59:05 +0000167typename enable_if<_Sz == 8, void>::type
168__check_for_overflow(size_t N)
Howard Hinnant5ec18262010-10-29 14:10:30 +0000169{
Howard Hinnant43d978e2012-12-27 18:59:05 +0000170#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5ec18262010-10-29 14:10:30 +0000171 if (N > 0xFFFFFFFFFFFFFFC5ull)
172 throw overflow_error("__next_prime overflow");
Howard Hinnante00e6f22013-03-28 18:56:26 +0000173#else
174 (void)N;
Howard Hinnant5ec18262010-10-29 14:10:30 +0000175#endif
176}
177
Howard Hinnant3e519522010-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 Hinnant5ec18262010-10-29 14:10:30 +0000187 // Check for overflow
Howard Hinnant43d978e2012-12-27 18:59:05 +0000188 __check_for_overflow(n);
Howard Hinnant3e519522010-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 Hinnantc2063662011-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 Hinnant3e519522010-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 Hinnant8fb62e32010-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 Hinnant3e519522010-05-11 19:42:16 +0000211 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000212 if (n == q * p)
213 goto next;
Howard Hinnant3e519522010-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 Hinnant8fb62e32010-09-13 01:43:27 +0000220 std::size_t q = n / i;
221 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000222 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000223 if (n == q * i)
224 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000225
226 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000227 q = n / i;
228 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000229 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000230 if (n == q * i)
231 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000232
233 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000234 q = n / i;
235 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000236 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000237 if (n == q * i)
238 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000239
240 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000241 q = n / i;
242 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000243 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000244 if (n == q * i)
245 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000246
247 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000248 q = n / i;
249 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000250 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000251 if (n == q * i)
252 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000253
254 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000255 q = n / i;
256 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000257 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000258 if (n == q * i)
259 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000260
261 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000262 q = n / i;
263 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000264 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000265 if (n == q * i)
266 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000267
268 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000269 q = n / i;
270 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000271 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000272 if (n == q * i)
273 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000274
275 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000276 q = n / i;
277 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000278 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000279 if (n == q * i)
280 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000281
282 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000283 q = n / i;
284 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000285 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000286 if (n == q * i)
287 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000288
289 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000290 q = n / i;
291 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000292 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000293 if (n == q * i)
294 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000295
296 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000297 q = n / i;
298 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000299 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000300 if (n == q * i)
301 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000302
303 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000304 q = n / i;
305 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000306 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000307 if (n == q * i)
308 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000309
310 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000311 q = n / i;
312 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000313 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000314 if (n == q * i)
315 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000316
317 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000318 q = n / i;
319 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000320 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000321 if (n == q * i)
322 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000323
324 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000325 q = n / i;
326 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000327 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000328 if (n == q * i)
329 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000330
331 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000332 q = n / i;
333 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000334 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000335 if (n == q * i)
336 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000337
338 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000339 q = n / i;
340 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000341 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000342 if (n == q * i)
343 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000344
345 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000346 q = n / i;
347 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000348 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000349 if (n == q * i)
350 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000351
352 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000353 q = n / i;
354 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000355 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000356 if (n == q * i)
357 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000358
359 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000360 q = n / i;
361 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000362 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000363 if (n == q * i)
364 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000365
366 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000367 q = n / i;
368 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000369 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000370 if (n == q * i)
371 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000372
373 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000374 q = n / i;
375 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000376 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000377 if (n == q * i)
378 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000379
380 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000381 q = n / i;
382 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000383 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000384 if (n == q * i)
385 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000386
387 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000388 q = n / i;
389 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000390 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000391 if (n == q * i)
392 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000393
394 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000395 q = n / i;
396 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000397 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000398 if (n == q * i)
399 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000400
401 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000402 q = n / i;
403 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000404 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000405 if (n == q * i)
406 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000407
408 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000409 q = n / i;
410 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000411 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000412 if (n == q * i)
413 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000414
415 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000416 q = n / i;
417 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000418 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000419 if (n == q * i)
420 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000421
422 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000423 q = n / i;
424 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000425 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000426 if (n == q * i)
427 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000428
429 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000430 q = n / i;
431 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000432 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000433 if (n == q * i)
434 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000435
436 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000437 q = n / i;
438 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000439 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000440 if (n == q * i)
441 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000442
443 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000444 q = n / i;
445 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000446 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000447 if (n == q * i)
448 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000449
450 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000451 q = n / i;
452 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000453 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000454 if (n == q * i)
455 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000456
457 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000458 q = n / i;
459 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000460 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000461 if (n == q * i)
462 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000463
464 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000465 q = n / i;
466 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000467 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000468 if (n == q * i)
469 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000470
471 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000472 q = n / i;
473 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000474 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000475 if (n == q * i)
476 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000477
478 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000479 q = n / i;
480 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000481 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000482 if (n == q * i)
483 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000484
485 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000486 q = n / i;
487 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000488 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000489 if (n == q * i)
490 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000491
492 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000493 q = n / i;
494 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000495 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000496 if (n == q * i)
497 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000498
499 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000500 q = n / i;
501 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000502 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000503 if (n == q * i)
504 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000505
506 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000507 q = n / i;
508 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000509 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000510 if (n == q * i)
511 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000512
513 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000514 q = n / i;
515 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000516 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000517 if (n == q * i)
518 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000519
520 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000521 q = n / i;
522 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000523 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000524 if (n == q * i)
525 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000526
527 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000528 q = n / i;
529 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000530 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000531 if (n == q * i)
532 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000533
534 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000535 q = n / i;
536 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000537 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000538 if (n == q * i)
539 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000540
541 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000542 q = n / i;
543 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000544 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000545 if (n == q * i)
546 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000547
548 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000549 q = n / i;
550 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000551 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000552 if (n == q * i)
553 break;
Howard Hinnant3e519522010-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