blob: 6f30d5a60581b4dea1570240842086ec20789f23 [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 Hinnant28b24882011-12-01 20:21:04 +0000184 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
185 - indices);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000186 n = L * k0 + indices[in];
187 while (true)
188 {
189 // Divide n by all primes or potential primes (i) until:
190 // 1. The division is even, so try next potential prime.
191 // 2. The i > sqrt(n), in which case n is prime.
192 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
193 // so don't test those (j == 5 -> divide by 11 first). And the
194 // potential primes start with 211, so don't test against the last
195 // small prime.
196 for (size_t j = 5; j < N - 1; ++j)
197 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000198 const std::size_t p = small_primes[j];
199 const std::size_t q = n / p;
200 if (q < p)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000201 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000202 if (n == q * p)
203 goto next;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000204 }
205 // n wasn't divisible by small primes, try potential primes
206 {
207 size_t i = 211;
208 while (true)
209 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000210 std::size_t q = n / i;
211 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000212 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000213 if (n == q * i)
214 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000215
216 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000217 q = n / i;
218 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000219 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000220 if (n == q * i)
221 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222
223 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000224 q = n / i;
225 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000226 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000227 if (n == q * i)
228 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000229
230 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000231 q = n / i;
232 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000233 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000234 if (n == q * i)
235 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000236
237 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000238 q = n / i;
239 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000240 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000241 if (n == q * i)
242 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243
244 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000245 q = n / i;
246 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000248 if (n == q * i)
249 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000250
251 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000252 q = n / i;
253 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000254 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000255 if (n == q * i)
256 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000257
258 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000259 q = n / i;
260 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000261 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000262 if (n == q * i)
263 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000264
265 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000266 q = n / i;
267 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000268 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000269 if (n == q * i)
270 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000271
272 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000273 q = n / i;
274 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000275 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000276 if (n == q * i)
277 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000278
279 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000280 q = n / i;
281 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000282 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000283 if (n == q * i)
284 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000285
286 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000287 q = n / i;
288 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000289 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000290 if (n == q * i)
291 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292
293 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000294 q = n / i;
295 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000296 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000297 if (n == q * i)
298 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000299
300 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000301 q = n / i;
302 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000303 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000304 if (n == q * i)
305 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306
307 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000308 q = n / i;
309 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000310 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000311 if (n == q * i)
312 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000313
314 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000315 q = n / i;
316 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000317 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000318 if (n == q * i)
319 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320
321 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000322 q = n / i;
323 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000325 if (n == q * i)
326 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000327
328 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000329 q = n / i;
330 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000331 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000332 if (n == q * i)
333 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000334
335 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000336 q = n / i;
337 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000338 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000339 if (n == q * i)
340 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341
342 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000343 q = n / i;
344 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000346 if (n == q * i)
347 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348
349 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000350 q = n / i;
351 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000353 if (n == q * i)
354 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355
356 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000357 q = n / i;
358 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000360 if (n == q * i)
361 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362
363 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000364 q = n / i;
365 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000366 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000367 if (n == q * i)
368 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000369
370 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000371 q = n / i;
372 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000374 if (n == q * i)
375 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376
377 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000378 q = n / i;
379 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000381 if (n == q * i)
382 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383
384 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000385 q = n / i;
386 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000388 if (n == q * i)
389 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390
391 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000392 q = n / i;
393 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000395 if (n == q * i)
396 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000397
398 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000399 q = n / i;
400 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000402 if (n == q * i)
403 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404
405 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000406 q = n / i;
407 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000408 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000409 if (n == q * i)
410 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411
412 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000413 q = n / i;
414 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000415 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000416 if (n == q * i)
417 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000418
419 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000420 q = n / i;
421 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000423 if (n == q * i)
424 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425
426 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000427 q = n / i;
428 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000429 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000430 if (n == q * i)
431 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432
433 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000434 q = n / i;
435 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000436 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000437 if (n == q * i)
438 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000439
440 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000441 q = n / i;
442 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000443 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000444 if (n == q * i)
445 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446
447 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000448 q = n / i;
449 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000450 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000451 if (n == q * i)
452 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453
454 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000455 q = n / i;
456 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000458 if (n == q * i)
459 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460
461 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000462 q = n / i;
463 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000465 if (n == q * i)
466 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000467
468 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000469 q = n / i;
470 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000472 if (n == q * i)
473 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474
475 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000476 q = n / i;
477 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000478 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000479 if (n == q * i)
480 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481
482 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000483 q = n / i;
484 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000486 if (n == q * i)
487 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488
489 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000490 q = n / i;
491 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000493 if (n == q * i)
494 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000495
496 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000497 q = n / i;
498 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000499 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000500 if (n == q * i)
501 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502
503 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000504 q = n / i;
505 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000506 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000507 if (n == q * i)
508 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509
510 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000511 q = n / i;
512 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000514 if (n == q * i)
515 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000516
517 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000518 q = n / i;
519 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000520 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000521 if (n == q * i)
522 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000523
524 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000525 q = n / i;
526 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000528 if (n == q * i)
529 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530
531 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000532 q = n / i;
533 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000535 if (n == q * i)
536 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000537
538 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000539 q = n / i;
540 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000542 if (n == q * i)
543 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544
545 // This will loop i to the next "plane" of potential primes
546 i += 2;
547 }
548 }
549next:
550 // n is not prime. Increment n to next potential prime.
551 if (++in == M)
552 {
553 ++k0;
554 in = 0;
555 }
556 n = L * k0 + indices[in];
557 }
558}
559
560_LIBCPP_END_NAMESPACE_STD