blob: 728b9bd3831b3fea266fe5daa65d7181b9c845bb [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 Hinnantc51e1022010-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 Hinnantffb308e2010-08-22 00:03:27 +0000130//
Howard Hinnantc51e1022010-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 Hinnantffb308e2010-08-22 00:03:27 +0000137//
Howard Hinnantc51e1022010-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 Hinnant5d5da682010-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 Hinnantc51e1022010-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 Hinnant5d5da682010-10-29 14:10:30 +0000176 // Check for overflow
177 __check_for_overflow(n, integral_constant<size_t,
178 sizeof(n) * __CHAR_BIT__>());
Howard Hinnantc51e1022010-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 Hinnant7bf565c2010-09-13 01:43:27 +0000184 size_t in = std::lower_bound(indices, indices + M, n - k0 * L) - indices;
Howard Hinnantc51e1022010-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 Hinnant7bf565c2010-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 Hinnantc51e1022010-05-11 19:42:16 +0000200 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000201 if (n == q * p)
202 goto next;
Howard Hinnantc51e1022010-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 Hinnant7bf565c2010-09-13 01:43:27 +0000209 std::size_t q = n / i;
210 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000212 if (n == q * i)
213 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214
215 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000216 q = n / i;
217 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000218 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000219 if (n == q * i)
220 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000221
222 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000223 q = n / i;
224 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000226 if (n == q * i)
227 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000228
229 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000230 q = n / i;
231 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000232 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000233 if (n == q * i)
234 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000235
236 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000237 q = n / i;
238 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000240 if (n == q * i)
241 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000242
243 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000244 q = n / i;
245 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000246 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000247 if (n == q * i)
248 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000249
250 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000251 q = n / i;
252 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000253 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000254 if (n == q * i)
255 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000256
257 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000258 q = n / i;
259 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000261 if (n == q * i)
262 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000263
264 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000265 q = n / i;
266 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000267 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000268 if (n == q * i)
269 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000270
271 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000272 q = n / i;
273 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000275 if (n == q * i)
276 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000277
278 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000279 q = n / i;
280 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000281 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000282 if (n == q * i)
283 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000284
285 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000286 q = n / i;
287 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000288 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000289 if (n == q * i)
290 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000291
292 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000293 q = n / i;
294 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000295 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000296 if (n == q * i)
297 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000298
299 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000300 q = n / i;
301 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000302 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000303 if (n == q * i)
304 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000305
306 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000307 q = n / i;
308 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000309 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000310 if (n == q * i)
311 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312
313 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000314 q = n / i;
315 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000316 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000317 if (n == q * i)
318 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000319
320 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000321 q = n / i;
322 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000324 if (n == q * i)
325 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000326
327 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000328 q = n / i;
329 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000331 if (n == q * i)
332 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000333
334 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000335 q = n / i;
336 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000338 if (n == q * i)
339 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000340
341 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000342 q = n / i;
343 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000345 if (n == q * i)
346 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000347
348 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000349 q = n / i;
350 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000352 if (n == q * i)
353 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354
355 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000356 q = n / i;
357 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000358 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000359 if (n == q * i)
360 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000361
362 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000363 q = n / i;
364 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000365 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000366 if (n == q * i)
367 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368
369 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000370 q = n / i;
371 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000373 if (n == q * i)
374 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375
376 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000377 q = n / i;
378 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000380 if (n == q * i)
381 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382
383 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000384 q = n / i;
385 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000387 if (n == q * i)
388 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389
390 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000391 q = n / i;
392 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000394 if (n == q * i)
395 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000396
397 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000398 q = n / i;
399 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000401 if (n == q * i)
402 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403
404 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000405 q = n / i;
406 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000408 if (n == q * i)
409 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410
411 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000412 q = n / i;
413 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000414 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000415 if (n == q * i)
416 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000417
418 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000419 q = n / i;
420 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000422 if (n == q * i)
423 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424
425 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000426 q = n / i;
427 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000429 if (n == q * i)
430 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431
432 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000433 q = n / i;
434 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000435 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000436 if (n == q * i)
437 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438
439 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000440 q = n / i;
441 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000443 if (n == q * i)
444 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000445
446 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000447 q = n / i;
448 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000450 if (n == q * i)
451 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000452
453 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000454 q = n / i;
455 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000457 if (n == q * i)
458 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000459
460 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000461 q = n / i;
462 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000464 if (n == q * i)
465 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000466
467 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000468 q = n / i;
469 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000470 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000471 if (n == q * i)
472 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000473
474 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000475 q = n / i;
476 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000477 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000478 if (n == q * i)
479 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000480
481 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000482 q = n / i;
483 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000484 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000485 if (n == q * i)
486 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487
488 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000489 q = n / i;
490 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000491 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000492 if (n == q * i)
493 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494
495 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000496 q = n / i;
497 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000498 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000499 if (n == q * i)
500 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000501
502 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000503 q = n / i;
504 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000505 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000506 if (n == q * i)
507 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000508
509 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000510 q = n / i;
511 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000513 if (n == q * i)
514 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515
516 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000517 q = n / i;
518 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000520 if (n == q * i)
521 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522
523 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000524 q = n / i;
525 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000526 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000527 if (n == q * i)
528 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529
530 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000531 q = n / i;
532 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000534 if (n == q * i)
535 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536
537 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000538 q = n / i;
539 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000541 if (n == q * i)
542 break;
Howard Hinnantc51e1022010-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