blob: 728b9bd3831b3fea266fe5daa65d7181b9c845bb [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 Hinnant3e519522010-05-11 19:42:16 +000013
14_LIBCPP_BEGIN_NAMESPACE_STD
15
16namespace {
17
18// handle all next_prime(i) for i in [1, 210), special case 0
19const unsigned small_primes[] =
20{
21 0,
22 2,
23 3,
24 5,
25 7,
26 11,
27 13,
28 17,
29 19,
30 23,
31 29,
32 31,
33 37,
34 41,
35 43,
36 47,
37 53,
38 59,
39 61,
40 67,
41 71,
42 73,
43 79,
44 83,
45 89,
46 97,
47 101,
48 103,
49 107,
50 109,
51 113,
52 127,
53 131,
54 137,
55 139,
56 149,
57 151,
58 157,
59 163,
60 167,
61 173,
62 179,
63 181,
64 191,
65 193,
66 197,
67 199,
68 211
69};
70
71// potential primes = 210*k + indices[i], k >= 1
72// these numbers are not divisible by 2, 3, 5 or 7
73// (or any integer 2 <= j <= 10 for that matter).
74const unsigned indices[] =
75{
76 1,
77 11,
78 13,
79 17,
80 19,
81 23,
82 29,
83 31,
84 37,
85 41,
86 43,
87 47,
88 53,
89 59,
90 61,
91 67,
92 71,
93 73,
94 79,
95 83,
96 89,
97 97,
98 101,
99 103,
100 107,
101 109,
102 113,
103 121,
104 127,
105 131,
106 137,
107 139,
108 143,
109 149,
110 151,
111 157,
112 163,
113 167,
114 169,
115 173,
116 179,
117 181,
118 187,
119 191,
120 193,
121 197,
122 199,
123 209
124};
125
126}
127
128// Returns: If n == 0, returns 0. Else returns the lowest prime number that
129// is greater than or equal to n.
Howard Hinnant940e2112010-08-22 00:03:27 +0000130//
Howard Hinnant3e519522010-05-11 19:42:16 +0000131// The algorithm creates a list of small primes, plus an open-ended list of
132// potential primes. All prime numbers are potential prime numbers. However
133// some potential prime numbers are not prime. In an ideal world, all potential
134// prime numbers would be prime. Candiate prime numbers are chosen as the next
135// highest potential prime. Then this number is tested for prime by dividing it
136// by all potential prime numbers less than the sqrt of the candidate.
Howard Hinnant940e2112010-08-22 00:03:27 +0000137//
Howard Hinnant3e519522010-05-11 19:42:16 +0000138// This implementation defines potential primes as those numbers not divisible
139// by 2, 3, 5, and 7. Other (common) implementations define potential primes
140// as those not divisible by 2. A few other implementations define potential
141// primes as those not divisible by 2 or 3. By raising the number of small
142// primes which the potential prime is not divisible by, the set of potential
143// primes more closely approximates the set of prime numbers. And thus there
144// are fewer potential primes to search, and fewer potential primes to divide
145// against.
146
Howard Hinnant5ec18262010-10-29 14:10:30 +0000147inline _LIBCPP_INLINE_VISIBILITY
148void
149__check_for_overflow(size_t N, integral_constant<size_t, 32>)
150{
151#ifndef _LIBCPP_NO_EXCEPTIONS
152 if (N > 0xFFFFFFFB)
153 throw overflow_error("__next_prime overflow");
154#endif
155}
156
157inline _LIBCPP_INLINE_VISIBILITY
158void
159__check_for_overflow(size_t N, integral_constant<size_t, 64>)
160{
161#ifndef _LIBCPP_NO_EXCEPTIONS
162 if (N > 0xFFFFFFFFFFFFFFC5ull)
163 throw overflow_error("__next_prime overflow");
164#endif
165}
166
Howard Hinnant3e519522010-05-11 19:42:16 +0000167size_t
168__next_prime(size_t n)
169{
170 const size_t L = 210;
171 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
172 // If n is small enough, search in small_primes
173 if (n <= small_primes[N-1])
174 return *std::lower_bound(small_primes, small_primes + N, n);
175 // Else n > largest small_primes
Howard Hinnant5ec18262010-10-29 14:10:30 +0000176 // Check for overflow
177 __check_for_overflow(n, integral_constant<size_t,
178 sizeof(n) * __CHAR_BIT__>());
Howard Hinnant3e519522010-05-11 19:42:16 +0000179 // Start searching list of potential primes: L * k0 + indices[in]
180 const size_t M = sizeof(indices) / sizeof(indices[0]);
181 // Select first potential prime >= n
182 // Known a-priori n >= L
183 size_t k0 = n / L;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000184 size_t in = std::lower_bound(indices, indices + M, n - k0 * L) - indices;
Howard Hinnant3e519522010-05-11 19:42:16 +0000185 n = L * k0 + indices[in];
186 while (true)
187 {
188 // Divide n by all primes or potential primes (i) until:
189 // 1. The division is even, so try next potential prime.
190 // 2. The i > sqrt(n), in which case n is prime.
191 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
192 // so don't test those (j == 5 -> divide by 11 first). And the
193 // potential primes start with 211, so don't test against the last
194 // small prime.
195 for (size_t j = 5; j < N - 1; ++j)
196 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000197 const std::size_t p = small_primes[j];
198 const std::size_t q = n / p;
199 if (q < p)
Howard Hinnant3e519522010-05-11 19:42:16 +0000200 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000201 if (n == q * p)
202 goto next;
Howard Hinnant3e519522010-05-11 19:42:16 +0000203 }
204 // n wasn't divisible by small primes, try potential primes
205 {
206 size_t i = 211;
207 while (true)
208 {
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000209 std::size_t q = n / i;
210 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000211 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000212 if (n == q * i)
213 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000214
215 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000216 q = n / i;
217 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000218 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000219 if (n == q * i)
220 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000221
222 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000223 q = n / i;
224 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000225 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000226 if (n == q * i)
227 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000228
229 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000230 q = n / i;
231 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000232 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000233 if (n == q * i)
234 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000235
236 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000237 q = n / i;
238 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000239 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000240 if (n == q * i)
241 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000242
243 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000244 q = n / i;
245 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000246 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000247 if (n == q * i)
248 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000249
250 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000251 q = n / i;
252 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000253 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000254 if (n == q * i)
255 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000256
257 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000258 q = n / i;
259 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000260 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000261 if (n == q * i)
262 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000263
264 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000265 q = n / i;
266 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000267 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000268 if (n == q * i)
269 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000270
271 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000272 q = n / i;
273 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000274 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000275 if (n == q * i)
276 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000277
278 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000279 q = n / i;
280 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000281 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000282 if (n == q * i)
283 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000284
285 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000286 q = n / i;
287 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000288 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000289 if (n == q * i)
290 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000291
292 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000293 q = n / i;
294 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000295 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000296 if (n == q * i)
297 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000298
299 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000300 q = n / i;
301 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000302 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000303 if (n == q * i)
304 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000305
306 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000307 q = n / i;
308 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000309 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000310 if (n == q * i)
311 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000312
313 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000314 q = n / i;
315 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000316 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000317 if (n == q * i)
318 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000319
320 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000321 q = n / i;
322 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000323 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000324 if (n == q * i)
325 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000326
327 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000328 q = n / i;
329 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000330 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000331 if (n == q * i)
332 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000333
334 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000335 q = n / i;
336 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000337 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000338 if (n == q * i)
339 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000340
341 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000342 q = n / i;
343 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000344 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000345 if (n == q * i)
346 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000347
348 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000349 q = n / i;
350 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000351 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000352 if (n == q * i)
353 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000354
355 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000356 q = n / i;
357 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000358 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000359 if (n == q * i)
360 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000361
362 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000363 q = n / i;
364 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000365 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000366 if (n == q * i)
367 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000368
369 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000370 q = n / i;
371 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000372 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000373 if (n == q * i)
374 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000375
376 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000377 q = n / i;
378 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000379 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000380 if (n == q * i)
381 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000382
383 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000384 q = n / i;
385 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000386 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000387 if (n == q * i)
388 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000389
390 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000391 q = n / i;
392 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000393 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000394 if (n == q * i)
395 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000396
397 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000398 q = n / i;
399 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000400 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000401 if (n == q * i)
402 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000403
404 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000405 q = n / i;
406 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000407 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000408 if (n == q * i)
409 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000410
411 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000412 q = n / i;
413 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000414 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000415 if (n == q * i)
416 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000417
418 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000419 q = n / i;
420 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000421 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000422 if (n == q * i)
423 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000424
425 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000426 q = n / i;
427 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000428 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000429 if (n == q * i)
430 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000431
432 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000433 q = n / i;
434 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000435 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000436 if (n == q * i)
437 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000438
439 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000440 q = n / i;
441 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000442 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000443 if (n == q * i)
444 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000445
446 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000447 q = n / i;
448 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000449 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000450 if (n == q * i)
451 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000452
453 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000454 q = n / i;
455 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000456 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000457 if (n == q * i)
458 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000459
460 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000461 q = n / i;
462 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000463 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000464 if (n == q * i)
465 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000466
467 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000468 q = n / i;
469 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000470 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000471 if (n == q * i)
472 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000473
474 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000475 q = n / i;
476 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000477 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000478 if (n == q * i)
479 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000480
481 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000482 q = n / i;
483 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000484 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000485 if (n == q * i)
486 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000487
488 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000489 q = n / i;
490 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000491 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000492 if (n == q * i)
493 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000494
495 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000496 q = n / i;
497 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000498 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000499 if (n == q * i)
500 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000501
502 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000503 q = n / i;
504 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000505 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000506 if (n == q * i)
507 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000508
509 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000510 q = n / i;
511 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000512 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000513 if (n == q * i)
514 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000515
516 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000517 q = n / i;
518 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000519 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000520 if (n == q * i)
521 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000522
523 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000524 q = n / i;
525 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000526 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000527 if (n == q * i)
528 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000529
530 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000531 q = n / i;
532 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000533 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000534 if (n == q * i)
535 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000536
537 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000538 q = n / i;
539 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000540 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000541 if (n == q * i)
542 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000543
544 // This will loop i to the next "plane" of potential primes
545 i += 2;
546 }
547 }
548next:
549 // n is not prime. Increment n to next potential prime.
550 if (++in == M)
551 {
552 ++k0;
553 in = 0;
554 }
555 n = L * k0 + indices[in];
556 }
557}
558
559_LIBCPP_END_NAMESPACE_STD