blob: 6f30d5a60581b4dea1570240842086ec20789f23 [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 Hinnantc2063662011-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 Hinnant3e519522010-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 Hinnant8fb62e32010-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 Hinnant3e519522010-05-11 19:42:16 +0000201 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000202 if (n == q * p)
203 goto next;
Howard Hinnant3e519522010-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 Hinnant8fb62e32010-09-13 01:43:27 +0000210 std::size_t q = n / i;
211 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000212 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000213 if (n == q * i)
214 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000215
216 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000217 q = n / i;
218 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000219 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000220 if (n == q * i)
221 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000222
223 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000224 q = n / i;
225 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000226 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000227 if (n == q * i)
228 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000229
230 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000231 q = n / i;
232 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000233 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000234 if (n == q * i)
235 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000236
237 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000238 q = n / i;
239 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000240 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000241 if (n == q * i)
242 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000243
244 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000245 q = n / i;
246 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000247 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000248 if (n == q * i)
249 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000250
251 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000252 q = n / i;
253 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000254 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000255 if (n == q * i)
256 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000257
258 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000259 q = n / i;
260 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000261 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000262 if (n == q * i)
263 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000264
265 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000266 q = n / i;
267 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000268 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000269 if (n == q * i)
270 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000271
272 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000273 q = n / i;
274 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000275 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000276 if (n == q * i)
277 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000278
279 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000280 q = n / i;
281 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000282 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000283 if (n == q * i)
284 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000285
286 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000287 q = n / i;
288 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000289 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000290 if (n == q * i)
291 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000292
293 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000294 q = n / i;
295 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000296 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000297 if (n == q * i)
298 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000299
300 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000301 q = n / i;
302 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000303 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000304 if (n == q * i)
305 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000306
307 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000308 q = n / i;
309 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000310 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000311 if (n == q * i)
312 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000313
314 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000315 q = n / i;
316 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000317 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000318 if (n == q * i)
319 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000320
321 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000322 q = n / i;
323 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000324 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000325 if (n == q * i)
326 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000327
328 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000329 q = n / i;
330 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000331 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000332 if (n == q * i)
333 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000334
335 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000336 q = n / i;
337 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000338 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000339 if (n == q * i)
340 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000341
342 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000343 q = n / i;
344 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000345 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000346 if (n == q * i)
347 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000348
349 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000350 q = n / i;
351 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000352 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000353 if (n == q * i)
354 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000355
356 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000357 q = n / i;
358 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000359 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000360 if (n == q * i)
361 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000362
363 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000364 q = n / i;
365 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000366 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000367 if (n == q * i)
368 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000369
370 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000371 q = n / i;
372 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000373 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000374 if (n == q * i)
375 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000376
377 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000378 q = n / i;
379 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000380 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000381 if (n == q * i)
382 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000383
384 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000385 q = n / i;
386 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000387 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000388 if (n == q * i)
389 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000390
391 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000392 q = n / i;
393 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000394 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000395 if (n == q * i)
396 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000397
398 i += 8;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000399 q = n / i;
400 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000401 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000402 if (n == q * i)
403 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000404
405 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000406 q = n / i;
407 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000408 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000409 if (n == q * i)
410 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000411
412 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000413 q = n / i;
414 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000415 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000416 if (n == q * i)
417 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000418
419 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000420 q = n / i;
421 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000422 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000423 if (n == q * i)
424 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000425
426 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000427 q = n / i;
428 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000429 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000430 if (n == q * i)
431 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000432
433 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000434 q = n / i;
435 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000436 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000437 if (n == q * i)
438 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000439
440 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000441 q = n / i;
442 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000443 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000444 if (n == q * i)
445 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000446
447 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000448 q = n / i;
449 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000450 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000451 if (n == q * i)
452 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000453
454 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000455 q = n / i;
456 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000457 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000458 if (n == q * i)
459 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000460
461 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000462 q = n / i;
463 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000464 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000465 if (n == q * i)
466 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000467
468 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000469 q = n / i;
470 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000471 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000472 if (n == q * i)
473 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000474
475 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000476 q = n / i;
477 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000478 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000479 if (n == q * i)
480 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000481
482 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000483 q = n / i;
484 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000485 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000486 if (n == q * i)
487 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000488
489 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000490 q = n / i;
491 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000492 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000493 if (n == q * i)
494 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000495
496 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000497 q = n / i;
498 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000499 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000500 if (n == q * i)
501 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000502
503 i += 6;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000504 q = n / i;
505 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000506 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000507 if (n == q * i)
508 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000509
510 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000511 q = n / i;
512 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000513 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000514 if (n == q * i)
515 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000516
517 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000518 q = n / i;
519 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000520 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000521 if (n == q * i)
522 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000523
524 i += 4;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000525 q = n / i;
526 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000527 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000528 if (n == q * i)
529 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000530
531 i += 2;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000532 q = n / i;
533 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000534 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000535 if (n == q * i)
536 break;
Howard Hinnant3e519522010-05-11 19:42:16 +0000537
538 i += 10;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000539 q = n / i;
540 if (q < i)
Howard Hinnant3e519522010-05-11 19:42:16 +0000541 return n;
Howard Hinnant8fb62e32010-09-13 01:43:27 +0000542 if (n == q * i)
543 break;
Howard Hinnant3e519522010-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