blob: 89bb736c86c22460f81b9d84c938b091e1c6c128 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001//===-------------------------- hash.cpp ----------------------------------===//
2//
Chandler Carruthd2012102019-01-19 10:56:40 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "__hash_table"
10#include "algorithm"
Howard Hinnant5d5da682010-10-29 14:10:30 +000011#include "stdexcept"
Howard Hinnant8765fc32012-12-27 18:59:05 +000012#include "type_traits"
13
Joerg Sonnenberger3cf67aa2013-04-27 19:10:15 +000014#ifdef __clang__
Howard Hinnant8765fc32012-12-27 18:59:05 +000015#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Joerg Sonnenberger3cf67aa2013-04-27 19:10:15 +000016#endif
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
Alp Tokerb8a95f52014-05-15 11:27:39 +0000138// prime numbers would be prime. Candidate prime numbers are chosen as the next
Howard Hinnantc51e1022010-05-11 19:42:16 +0000139// 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 Hinnant5d5da682010-10-29 14:10:30 +0000156 if (N > 0xFFFFFFFB)
Louis Dionne2b239162019-02-12 16:06:02 +0000157 __throw_overflow_error("__next_prime overflow");
Howard Hinnant5d5da682010-10-29 14:10:30 +0000158}
159
Howard Hinnant8765fc32012-12-27 18:59:05 +0000160template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000161inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000162typename enable_if<_Sz == 8, void>::type
163__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000164{
Howard Hinnant5d5da682010-10-29 14:10:30 +0000165 if (N > 0xFFFFFFFFFFFFFFC5ull)
Louis Dionne2b239162019-02-12 16:06:02 +0000166 __throw_overflow_error("__next_prime overflow");
Howard Hinnant5d5da682010-10-29 14:10:30 +0000167}
168
Howard Hinnantc51e1022010-05-11 19:42:16 +0000169size_t
170__next_prime(size_t n)
171{
172 const size_t L = 210;
173 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
174 // If n is small enough, search in small_primes
175 if (n <= small_primes[N-1])
176 return *std::lower_bound(small_primes, small_primes + N, n);
177 // Else n > largest small_primes
Howard Hinnant5d5da682010-10-29 14:10:30 +0000178 // Check for overflow
Howard Hinnant8765fc32012-12-27 18:59:05 +0000179 __check_for_overflow(n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000180 // Start searching list of potential primes: L * k0 + indices[in]
181 const size_t M = sizeof(indices) / sizeof(indices[0]);
182 // Select first potential prime >= n
183 // Known a-priori n >= L
184 size_t k0 = n / L;
Howard Hinnant28b24882011-12-01 20:21:04 +0000185 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
186 - indices);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000187 n = L * k0 + indices[in];
188 while (true)
189 {
190 // Divide n by all primes or potential primes (i) until:
191 // 1. The division is even, so try next potential prime.
192 // 2. The i > sqrt(n), in which case n is prime.
193 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
194 // so don't test those (j == 5 -> divide by 11 first). And the
195 // potential primes start with 211, so don't test against the last
196 // small prime.
197 for (size_t j = 5; j < N - 1; ++j)
198 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000199 const std::size_t p = small_primes[j];
200 const std::size_t q = n / p;
201 if (q < p)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000202 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000203 if (n == q * p)
204 goto next;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000205 }
206 // n wasn't divisible by small primes, try potential primes
207 {
208 size_t i = 211;
209 while (true)
210 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000211 std::size_t q = n / i;
212 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000213 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000214 if (n == q * i)
215 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000216
217 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000218 q = n / i;
219 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000220 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000221 if (n == q * i)
222 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000223
224 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000225 q = n / i;
226 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000227 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000228 if (n == q * i)
229 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000230
231 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000232 q = n / i;
233 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000235 if (n == q * i)
236 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237
238 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000239 q = n / i;
240 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000241 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000242 if (n == q * i)
243 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000244
245 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000246 q = n / i;
247 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000248 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000249 if (n == q * i)
250 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000251
252 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000253 q = n / i;
254 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000256 if (n == q * i)
257 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000258
259 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000260 q = n / i;
261 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000262 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000263 if (n == q * i)
264 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000265
266 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000267 q = n / i;
268 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000269 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000270 if (n == q * i)
271 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000272
273 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000274 q = n / i;
275 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000276 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000277 if (n == q * i)
278 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000279
280 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000281 q = n / i;
282 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000284 if (n == q * i)
285 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000286
287 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000288 q = n / i;
289 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000290 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000291 if (n == q * i)
292 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000293
294 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000295 q = n / i;
296 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000297 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000298 if (n == q * i)
299 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000300
301 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000302 q = n / i;
303 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000304 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000305 if (n == q * i)
306 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307
308 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000309 q = n / i;
310 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000312 if (n == q * i)
313 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000314
315 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000316 q = n / i;
317 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000319 if (n == q * i)
320 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000321
322 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000323 q = n / i;
324 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000325 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000326 if (n == q * i)
327 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000328
329 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000330 q = n / i;
331 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000333 if (n == q * i)
334 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000335
336 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000337 q = n / i;
338 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000340 if (n == q * i)
341 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342
343 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000344 q = n / i;
345 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000346 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000347 if (n == q * i)
348 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349
350 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000351 q = n / i;
352 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000354 if (n == q * i)
355 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000356
357 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000358 q = n / i;
359 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000361 if (n == q * i)
362 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363
364 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000365 q = n / i;
366 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000368 if (n == q * i)
369 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370
371 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000372 q = n / i;
373 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000375 if (n == q * i)
376 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377
378 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000379 q = n / i;
380 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000381 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000382 if (n == q * i)
383 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384
385 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000386 q = n / i;
387 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000388 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000389 if (n == q * i)
390 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391
392 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000393 q = n / i;
394 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000396 if (n == q * i)
397 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398
399 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000400 q = n / i;
401 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000402 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000403 if (n == q * i)
404 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405
406 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000407 q = n / i;
408 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000410 if (n == q * i)
411 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412
413 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000414 q = n / i;
415 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000417 if (n == q * i)
418 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419
420 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000421 q = n / i;
422 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000424 if (n == q * i)
425 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426
427 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000428 q = n / i;
429 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000430 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000431 if (n == q * i)
432 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433
434 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000435 q = n / i;
436 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000438 if (n == q * i)
439 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440
441 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000442 q = n / i;
443 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000445 if (n == q * i)
446 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000447
448 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000449 q = n / i;
450 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000451 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000452 if (n == q * i)
453 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454
455 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000456 q = n / i;
457 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000458 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000459 if (n == q * i)
460 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461
462 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000463 q = n / i;
464 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000466 if (n == q * i)
467 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000468
469 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000470 q = n / i;
471 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000472 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000473 if (n == q * i)
474 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475
476 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000477 q = n / i;
478 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000480 if (n == q * i)
481 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482
483 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000484 q = n / i;
485 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000487 if (n == q * i)
488 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000489
490 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000491 q = n / i;
492 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000493 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000494 if (n == q * i)
495 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000496
497 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000498 q = n / i;
499 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000501 if (n == q * i)
502 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000503
504 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000505 q = n / i;
506 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000508 if (n == q * i)
509 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510
511 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000512 q = n / i;
513 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000515 if (n == q * i)
516 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000517
518 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000519 q = n / i;
520 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000521 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000522 if (n == q * i)
523 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524
525 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000526 q = n / i;
527 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000529 if (n == q * i)
530 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531
532 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000533 q = n / i;
534 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000536 if (n == q * i)
537 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538
539 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000540 q = n / i;
541 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000543 if (n == q * i)
544 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545
546 // This will loop i to the next "plane" of potential primes
547 i += 2;
548 }
549 }
550next:
551 // n is not prime. Increment n to next potential prime.
552 if (++in == M)
553 {
554 ++k0;
555 in = 0;
556 }
557 n = L * k0 + indices[in];
558 }
559}
560
561_LIBCPP_END_NAMESPACE_STD