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