blob: 388ab2ebe17574b747a0609ee84b8527c1266a56 [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
Joerg Sonnenberger3cf67aa2013-04-27 19:10:15 +000015#ifdef __clang__
Howard Hinnant8765fc32012-12-27 18:59:05 +000016#pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
Joerg Sonnenberger3cf67aa2013-04-27 19:10:15 +000017#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +000018
19_LIBCPP_BEGIN_NAMESPACE_STD
20
21namespace {
22
23// handle all next_prime(i) for i in [1, 210), special case 0
24const unsigned small_primes[] =
25{
26 0,
27 2,
28 3,
29 5,
30 7,
31 11,
32 13,
33 17,
34 19,
35 23,
36 29,
37 31,
38 37,
39 41,
40 43,
41 47,
42 53,
43 59,
44 61,
45 67,
46 71,
47 73,
48 79,
49 83,
50 89,
51 97,
52 101,
53 103,
54 107,
55 109,
56 113,
57 127,
58 131,
59 137,
60 139,
61 149,
62 151,
63 157,
64 163,
65 167,
66 173,
67 179,
68 181,
69 191,
70 193,
71 197,
72 199,
73 211
74};
75
76// potential primes = 210*k + indices[i], k >= 1
77// these numbers are not divisible by 2, 3, 5 or 7
78// (or any integer 2 <= j <= 10 for that matter).
79const unsigned indices[] =
80{
81 1,
82 11,
83 13,
84 17,
85 19,
86 23,
87 29,
88 31,
89 37,
90 41,
91 43,
92 47,
93 53,
94 59,
95 61,
96 67,
97 71,
98 73,
99 79,
100 83,
101 89,
102 97,
103 101,
104 103,
105 107,
106 109,
107 113,
108 121,
109 127,
110 131,
111 137,
112 139,
113 143,
114 149,
115 151,
116 157,
117 163,
118 167,
119 169,
120 173,
121 179,
122 181,
123 187,
124 191,
125 193,
126 197,
127 199,
128 209
129};
130
131}
132
133// Returns: If n == 0, returns 0. Else returns the lowest prime number that
134// is greater than or equal to n.
Howard Hinnantffb308e2010-08-22 00:03:27 +0000135//
Howard Hinnantc51e1022010-05-11 19:42:16 +0000136// The algorithm creates a list of small primes, plus an open-ended list of
137// potential primes. All prime numbers are potential prime numbers. However
138// some potential prime numbers are not prime. In an ideal world, all potential
139// prime numbers would be prime. Candiate prime numbers are chosen as the next
140// highest potential prime. Then this number is tested for prime by dividing it
141// by all potential prime numbers less than the sqrt of the candidate.
Howard Hinnantffb308e2010-08-22 00:03:27 +0000142//
Howard Hinnantc51e1022010-05-11 19:42:16 +0000143// This implementation defines potential primes as those numbers not divisible
144// by 2, 3, 5, and 7. Other (common) implementations define potential primes
145// as those not divisible by 2. A few other implementations define potential
146// primes as those not divisible by 2 or 3. By raising the number of small
147// primes which the potential prime is not divisible by, the set of potential
148// primes more closely approximates the set of prime numbers. And thus there
149// are fewer potential primes to search, and fewer potential primes to divide
150// against.
151
Howard Hinnant8765fc32012-12-27 18:59:05 +0000152template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000153inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000154typename enable_if<_Sz == 4, void>::type
155__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000156{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000157#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000158 if (N > 0xFFFFFFFB)
159 throw overflow_error("__next_prime overflow");
Howard Hinnant417bc432013-03-28 18:56:26 +0000160#else
161 (void)N;
Howard Hinnant5d5da682010-10-29 14:10:30 +0000162#endif
163}
164
Howard Hinnant8765fc32012-12-27 18:59:05 +0000165template <size_t _Sz = sizeof(size_t)>
Howard Hinnant5d5da682010-10-29 14:10:30 +0000166inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8765fc32012-12-27 18:59:05 +0000167typename enable_if<_Sz == 8, void>::type
168__check_for_overflow(size_t N)
Howard Hinnant5d5da682010-10-29 14:10:30 +0000169{
Howard Hinnant8765fc32012-12-27 18:59:05 +0000170#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant5d5da682010-10-29 14:10:30 +0000171 if (N > 0xFFFFFFFFFFFFFFC5ull)
172 throw overflow_error("__next_prime overflow");
Howard Hinnant417bc432013-03-28 18:56:26 +0000173#else
174 (void)N;
Howard Hinnant5d5da682010-10-29 14:10:30 +0000175#endif
176}
177
Howard Hinnantc51e1022010-05-11 19:42:16 +0000178size_t
179__next_prime(size_t n)
180{
181 const size_t L = 210;
182 const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
183 // If n is small enough, search in small_primes
184 if (n <= small_primes[N-1])
185 return *std::lower_bound(small_primes, small_primes + N, n);
186 // Else n > largest small_primes
Howard Hinnant5d5da682010-10-29 14:10:30 +0000187 // Check for overflow
Howard Hinnant8765fc32012-12-27 18:59:05 +0000188 __check_for_overflow(n);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000189 // Start searching list of potential primes: L * k0 + indices[in]
190 const size_t M = sizeof(indices) / sizeof(indices[0]);
191 // Select first potential prime >= n
192 // Known a-priori n >= L
193 size_t k0 = n / L;
Howard Hinnant28b24882011-12-01 20:21:04 +0000194 size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
195 - indices);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000196 n = L * k0 + indices[in];
197 while (true)
198 {
199 // Divide n by all primes or potential primes (i) until:
200 // 1. The division is even, so try next potential prime.
201 // 2. The i > sqrt(n), in which case n is prime.
202 // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
203 // so don't test those (j == 5 -> divide by 11 first). And the
204 // potential primes start with 211, so don't test against the last
205 // small prime.
206 for (size_t j = 5; j < N - 1; ++j)
207 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000208 const std::size_t p = small_primes[j];
209 const std::size_t q = n / p;
210 if (q < p)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000212 if (n == q * p)
213 goto next;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000214 }
215 // n wasn't divisible by small primes, try potential primes
216 {
217 size_t i = 211;
218 while (true)
219 {
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000220 std::size_t q = n / i;
221 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000223 if (n == q * i)
224 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000225
226 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000227 q = n / i;
228 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000229 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000230 if (n == q * i)
231 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000232
233 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000234 q = n / i;
235 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000236 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000237 if (n == q * i)
238 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000239
240 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000241 q = n / i;
242 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000243 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000244 if (n == q * i)
245 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000246
247 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000248 q = n / i;
249 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000250 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000251 if (n == q * i)
252 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000253
254 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000255 q = n / i;
256 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000257 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000258 if (n == q * i)
259 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260
261 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000262 q = n / i;
263 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000264 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000265 if (n == q * i)
266 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000267
268 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000269 q = n / i;
270 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000271 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000272 if (n == q * i)
273 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000274
275 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000276 q = n / i;
277 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000278 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000279 if (n == q * i)
280 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000281
282 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000283 q = n / i;
284 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000285 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000286 if (n == q * i)
287 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000288
289 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000290 q = n / i;
291 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000292 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000293 if (n == q * i)
294 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000295
296 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000297 q = n / i;
298 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000299 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000300 if (n == q * i)
301 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000302
303 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000304 q = n / i;
305 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000306 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000307 if (n == q * i)
308 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000309
310 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000311 q = n / i;
312 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000313 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000314 if (n == q * i)
315 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000316
317 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000318 q = n / i;
319 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000321 if (n == q * i)
322 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000323
324 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000325 q = n / i;
326 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000327 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000328 if (n == q * i)
329 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330
331 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000332 q = n / i;
333 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000334 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000335 if (n == q * i)
336 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
338 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000339 q = n / i;
340 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000342 if (n == q * i)
343 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344
345 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000346 q = n / i;
347 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000349 if (n == q * i)
350 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351
352 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000353 q = n / i;
354 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000356 if (n == q * i)
357 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000358
359 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000360 q = n / i;
361 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000363 if (n == q * i)
364 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000365
366 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000367 q = n / i;
368 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000369 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000370 if (n == q * i)
371 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372
373 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000374 q = n / i;
375 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000377 if (n == q * i)
378 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379
380 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000381 q = n / i;
382 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000384 if (n == q * i)
385 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386
387 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000388 q = n / i;
389 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000391 if (n == q * i)
392 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393
394 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000395 q = n / i;
396 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000397 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000398 if (n == q * i)
399 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400
401 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000402 q = n / i;
403 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000405 if (n == q * i)
406 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407
408 i += 8;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000409 q = n / i;
410 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000412 if (n == q * i)
413 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000414
415 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000416 q = n / i;
417 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000418 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000419 if (n == q * i)
420 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421
422 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000423 q = n / i;
424 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000426 if (n == q * i)
427 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428
429 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000430 q = n / i;
431 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000433 if (n == q * i)
434 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000435
436 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000437 q = n / i;
438 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000439 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000440 if (n == q * i)
441 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442
443 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000444 q = n / i;
445 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000447 if (n == q * i)
448 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449
450 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000451 q = n / i;
452 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000453 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000454 if (n == q * i)
455 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456
457 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000458 q = n / i;
459 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000461 if (n == q * i)
462 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463
464 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000465 q = n / i;
466 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000467 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000468 if (n == q * i)
469 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000470
471 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000472 q = n / i;
473 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000475 if (n == q * i)
476 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000477
478 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000479 q = n / i;
480 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000482 if (n == q * i)
483 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000484
485 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000486 q = n / i;
487 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000489 if (n == q * i)
490 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000491
492 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000493 q = n / i;
494 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000495 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000496 if (n == q * i)
497 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000498
499 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000500 q = n / i;
501 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000503 if (n == q * i)
504 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000505
506 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000507 q = n / i;
508 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000510 if (n == q * i)
511 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512
513 i += 6;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000514 q = n / i;
515 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000516 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000517 if (n == q * i)
518 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519
520 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000521 q = n / i;
522 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000523 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000524 if (n == q * i)
525 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000526
527 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000528 q = n / i;
529 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000531 if (n == q * i)
532 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533
534 i += 4;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000535 q = n / i;
536 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000537 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000538 if (n == q * i)
539 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540
541 i += 2;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000542 q = n / i;
543 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000545 if (n == q * i)
546 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547
548 i += 10;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000549 q = n / i;
550 if (q < i)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551 return n;
Howard Hinnant7bf565c2010-09-13 01:43:27 +0000552 if (n == q * i)
553 break;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554
555 // This will loop i to the next "plane" of potential primes
556 i += 2;
557 }
558 }
559next:
560 // n is not prime. Increment n to next potential prime.
561 if (++in == M)
562 {
563 ++k0;
564 in = 0;
565 }
566 n = L * k0 + indices[in];
567 }
568}
569
570_LIBCPP_END_NAMESPACE_STD