blob: d785f1a16b08ccb561d5a6c4415b854ba470b9ff [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 Hinnant8765fc32012-12-27 18:59:05 +000013#include "type_traits"
14
15#pragma clang diagnostic push
16#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Howard Hinnantc51e1022010-05-11 19:42:16 +000017
18_LIBCPP_BEGIN_NAMESPACE_STD
19
20namespace {
21
22// handle all next_prime(i) for i in [1, 210), special case 0
23const unsigned small_primes[] =
24{
25 0,
26 2,
27 3,
28 5,
29 7,
30 11,
31 13,
32 17,
33 19,
34 23,
35 29,
36 31,
37 37,
38 41,
39 43,
40 47,
41 53,
42 59,
43 61,
44 67,
45 71,
46 73,
47 79,
48 83,
49 89,
50 97,
51 101,
52 103,
53 107,
54 109,
55 113,
56 127,
57 131,
58 137,
59 139,
60 149,
61 151,
62 157,
63 163,
64 167,
65 173,
66 179,
67 181,
68 191,
69 193,
70 197,
71 199,
72 211
73};
74
75// potential primes = 210*k + indices[i], k >= 1
76// these numbers are not divisible by 2, 3, 5 or 7
77// (or any integer 2 <= j <= 10 for that matter).
78const unsigned indices[] =
79{
80 1,
81 11,
82 13,
83 17,
84 19,
85 23,
86 29,
87 31,
88 37,
89 41,
90 43,
91 47,
92 53,
93 59,
94 61,
95 67,
96 71,
97 73,
98 79,
99 83,
100 89,
101 97,
102 101,
103 103,
104 107,
105 109,
106 113,
107 121,
108 127,
109 131,
110 137,
111 139,
112 143,
113 149,
114 151,
115 157,
116 163,
117 167,
118 169,
119 173,
120 179,
121 181,
122 187,
123 191,
124 193,
125 197,
126 199,
127 209
128};
129
130}
131
132// Returns: If n == 0, returns 0. Else returns the lowest prime number that
133// is greater than or equal to n.
Howard Hinnantffb308e2010-08-22 00:03:27 +0000134//
Howard Hinnantc51e1022010-05-11 19:42:16 +0000135// The algorithm creates a list of small primes, plus an open-ended list of
136// potential primes. All prime numbers are potential prime numbers. However
137// some potential prime numbers are not prime. In an ideal world, all potential
138// prime numbers would be prime. Candiate prime numbers are chosen as the next
139// highest potential prime. Then this number is tested for prime by dividing it
140// by all potential prime numbers less than the sqrt of the candidate.
Howard Hinnantffb308e2010-08-22 00:03:27 +0000141//
Howard Hinnantc51e1022010-05-11 19:42:16 +0000142// This implementation defines potential primes as those numbers not divisible
143// by 2, 3, 5, and 7. Other (common) implementations define potential primes
144// as those not divisible by 2. A few other implementations define potential
145// primes as those not divisible by 2 or 3. By raising the number of small
146// primes which the potential prime is not divisible by, the set of potential
147// primes more closely approximates the set of prime numbers. And thus there
148// are fewer potential primes to search, and fewer potential primes to divide
149// against.
150
Howard Hinnant8765fc32012-12-27 18:59:05 +0000151template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000152inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000153typename enable_if<_Sz == 4, void>::type
154__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000155{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000156#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000157 if (N > 0xFFFFFFFB)
158 throw overflow_error("__next_prime overflow");
159#endif
160}
161
Howard Hinnant8765fc32012-12-27 18:59:05 +0000162template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000163inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000164typename enable_if<_Sz == 8, void>::type
165__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000166{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000167#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000168 if (N > 0xFFFFFFFFFFFFFFC5ull)
169 throw overflow_error("__next_prime overflow");
170#endif
171}
172
Howard Hinnantc51e1022010-05-11 19:42:16 +0000173size_t
174__next_prime(size_t n)
175{
176 const size_t L = 210;
177 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
178 // If n is small enough, search in small_primes
179 if (n <= small_primes[N-1])
180 return *std::lower_bound(small_primes, small_primes + N, n);
181 // Else n > largest small_primes
Howard Hinnant5d5da682010-10-29 14:10:30 +0000182 // Check for overflow
Howard Hinnant8765fc32012-12-27 18:59:05 +0000183 __check_for_overflow(n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000184 // Start searching list of potential primes: L * k0 + indices[in]
185 const size_t M = sizeof(indices) / sizeof(indices[0]);
186 // Select first potential prime >= n
187 // Known a-priori n >= L
188 size_t k0 = n / L;
Howard Hinnant28b24882011-12-01 20:21:04 +0000189 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
190 - indices);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000191 n = L * k0 + indices[in];
192 while (true)
193 {
194 // Divide n by all primes or potential primes (i) until:
195 // 1. The division is even, so try next potential prime.
196 // 2. The i > sqrt(n), in which case n is prime.
197 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
198 // so don't test those (j == 5 -> divide by 11 first). And the
199 // potential primes start with 211, so don't test against the last
200 // small prime.
201 for (size_t j = 5; j < N - 1; ++j)
202 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000203 const std::size_t p = small_primes[j];
204 const std::size_t q = n / p;
205 if (q < p)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000206 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000207 if (n == q * p)
208 goto next;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000209 }
210 // n wasn't divisible by small primes, try potential primes
211 {
212 size_t i = 211;
213 while (true)
214 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000215 std::size_t q = n / i;
216 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000217 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000218 if (n == q * i)
219 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000220
221 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000222 q = n / i;
223 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000225 if (n == q * i)
226 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000227
228 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000229 q = n / i;
230 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000231 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000232 if (n == q * i)
233 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234
235 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000236 q = n / i;
237 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000238 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000239 if (n == q * i)
240 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241
242 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000243 q = n / i;
244 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000246 if (n == q * i)
247 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248
249 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000250 q = n / i;
251 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000252 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000253 if (n == q * i)
254 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255
256 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000257 q = n / i;
258 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000259 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000260 if (n == q * i)
261 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000262
263 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000264 q = n / i;
265 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000266 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000267 if (n == q * i)
268 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000269
270 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000271 q = n / i;
272 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000273 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000274 if (n == q * i)
275 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276
277 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000278 q = n / i;
279 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000281 if (n == q * i)
282 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283
284 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000285 q = n / i;
286 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000287 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000288 if (n == q * i)
289 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000290
291 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000292 q = n / i;
293 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000294 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000295 if (n == q * i)
296 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000297
298 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000299 q = n / i;
300 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000302 if (n == q * i)
303 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304
305 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000306 q = n / i;
307 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000308 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000309 if (n == q * i)
310 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311
312 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000313 q = n / i;
314 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000315 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000316 if (n == q * i)
317 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318
319 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000320 q = n / i;
321 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000322 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000323 if (n == q * i)
324 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325
326 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000327 q = n / i;
328 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000330 if (n == q * i)
331 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332
333 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000334 q = n / i;
335 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000336 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000337 if (n == q * i)
338 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339
340 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000341 q = n / i;
342 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000343 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000344 if (n == q * i)
345 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346
347 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000348 q = n / i;
349 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000350 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000351 if (n == q * i)
352 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353
354 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000355 q = n / i;
356 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000357 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000358 if (n == q * i)
359 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360
361 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000362 q = n / i;
363 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000364 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000365 if (n == q * i)
366 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367
368 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000369 q = n / i;
370 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000372 if (n == q * i)
373 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374
375 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000376 q = n / i;
377 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000379 if (n == q * i)
380 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000381
382 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000383 q = n / i;
384 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000385 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000386 if (n == q * i)
387 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388
389 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000390 q = n / i;
391 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000392 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000393 if (n == q * i)
394 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395
396 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000397 q = n / i;
398 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000400 if (n == q * i)
401 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000402
403 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000404 q = n / i;
405 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000407 if (n == q * i)
408 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409
410 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000411 q = n / i;
412 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000413 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000414 if (n == q * i)
415 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416
417 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000418 q = n / i;
419 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000421 if (n == q * i)
422 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423
424 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000425 q = n / i;
426 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000427 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000428 if (n == q * i)
429 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000430
431 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000432 q = n / i;
433 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000434 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000435 if (n == q * i)
436 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437
438 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000439 q = n / i;
440 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000442 if (n == q * i)
443 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444
445 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000446 q = n / i;
447 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000448 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000449 if (n == q * i)
450 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000451
452 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000453 q = n / i;
454 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000455 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000456 if (n == q * i)
457 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000458
459 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000460 q = n / i;
461 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000462 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000463 if (n == q * i)
464 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465
466 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000467 q = n / i;
468 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000469 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000470 if (n == q * i)
471 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000472
473 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000474 q = n / i;
475 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000477 if (n == q * i)
478 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479
480 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000481 q = n / i;
482 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000483 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000484 if (n == q * i)
485 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486
487 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000488 q = n / i;
489 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000491 if (n == q * i)
492 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000493
494 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000495 q = n / i;
496 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000498 if (n == q * i)
499 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500
501 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000502 q = n / i;
503 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000504 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000505 if (n == q * i)
506 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507
508 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000509 q = n / i;
510 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000511 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000512 if (n == q * i)
513 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514
515 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000516 q = n / i;
517 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000519 if (n == q * i)
520 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521
522 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000523 q = n / i;
524 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000525 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000526 if (n == q * i)
527 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528
529 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000530 q = n / i;
531 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000533 if (n == q * i)
534 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535
536 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000537 q = n / i;
538 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000539 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000540 if (n == q * i)
541 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542
543 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000544 q = n / i;
545 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000547 if (n == q * i)
548 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000549
550 // This will loop i to the next "plane" of potential primes
551 i += 2;
552 }
553 }
554next:
555 // n is not prime. Increment n to next potential prime.
556 if (++in == M)
557 {
558 ++k0;
559 in = 0;
560 }
561 n = L * k0 + indices[in];
562 }
563}
564
565_LIBCPP_END_NAMESPACE_STD