17a984708SDavid Chisnall //===-------------------------- hash.cpp ----------------------------------===//
27a984708SDavid Chisnall //
37a984708SDavid Chisnall // The LLVM Compiler Infrastructure
47a984708SDavid Chisnall //
57a984708SDavid Chisnall // This file is dual licensed under the MIT and the University of Illinois Open
67a984708SDavid Chisnall // Source Licenses. See LICENSE.TXT for details.
77a984708SDavid Chisnall //
87a984708SDavid Chisnall //===----------------------------------------------------------------------===//
97a984708SDavid Chisnall
107a984708SDavid Chisnall #include "__hash_table"
117a984708SDavid Chisnall #include "algorithm"
127a984708SDavid Chisnall #include "stdexcept"
13cfdf2879SDavid Chisnall #include "type_traits"
14cfdf2879SDavid Chisnall
15cfdf2879SDavid Chisnall #ifdef __clang__
16cfdf2879SDavid Chisnall #pragma clang diagnostic ignored "-Wtautological-constant-out-of-range-compare"
17cfdf2879SDavid Chisnall #endif
187a984708SDavid Chisnall
197a984708SDavid Chisnall _LIBCPP_BEGIN_NAMESPACE_STD
207a984708SDavid Chisnall
217a984708SDavid Chisnall namespace {
227a984708SDavid Chisnall
237a984708SDavid Chisnall // handle all next_prime(i) for i in [1, 210), special case 0
247a984708SDavid Chisnall const unsigned small_primes[] =
257a984708SDavid Chisnall {
267a984708SDavid Chisnall 0,
277a984708SDavid Chisnall 2,
287a984708SDavid Chisnall 3,
297a984708SDavid Chisnall 5,
307a984708SDavid Chisnall 7,
317a984708SDavid Chisnall 11,
327a984708SDavid Chisnall 13,
337a984708SDavid Chisnall 17,
347a984708SDavid Chisnall 19,
357a984708SDavid Chisnall 23,
367a984708SDavid Chisnall 29,
377a984708SDavid Chisnall 31,
387a984708SDavid Chisnall 37,
397a984708SDavid Chisnall 41,
407a984708SDavid Chisnall 43,
417a984708SDavid Chisnall 47,
427a984708SDavid Chisnall 53,
437a984708SDavid Chisnall 59,
447a984708SDavid Chisnall 61,
457a984708SDavid Chisnall 67,
467a984708SDavid Chisnall 71,
477a984708SDavid Chisnall 73,
487a984708SDavid Chisnall 79,
497a984708SDavid Chisnall 83,
507a984708SDavid Chisnall 89,
517a984708SDavid Chisnall 97,
527a984708SDavid Chisnall 101,
537a984708SDavid Chisnall 103,
547a984708SDavid Chisnall 107,
557a984708SDavid Chisnall 109,
567a984708SDavid Chisnall 113,
577a984708SDavid Chisnall 127,
587a984708SDavid Chisnall 131,
597a984708SDavid Chisnall 137,
607a984708SDavid Chisnall 139,
617a984708SDavid Chisnall 149,
627a984708SDavid Chisnall 151,
637a984708SDavid Chisnall 157,
647a984708SDavid Chisnall 163,
657a984708SDavid Chisnall 167,
667a984708SDavid Chisnall 173,
677a984708SDavid Chisnall 179,
687a984708SDavid Chisnall 181,
697a984708SDavid Chisnall 191,
707a984708SDavid Chisnall 193,
717a984708SDavid Chisnall 197,
727a984708SDavid Chisnall 199,
737a984708SDavid Chisnall 211
747a984708SDavid Chisnall };
757a984708SDavid Chisnall
767a984708SDavid Chisnall // potential primes = 210*k + indices[i], k >= 1
777a984708SDavid Chisnall // these numbers are not divisible by 2, 3, 5 or 7
787a984708SDavid Chisnall // (or any integer 2 <= j <= 10 for that matter).
797a984708SDavid Chisnall const unsigned indices[] =
807a984708SDavid Chisnall {
817a984708SDavid Chisnall 1,
827a984708SDavid Chisnall 11,
837a984708SDavid Chisnall 13,
847a984708SDavid Chisnall 17,
857a984708SDavid Chisnall 19,
867a984708SDavid Chisnall 23,
877a984708SDavid Chisnall 29,
887a984708SDavid Chisnall 31,
897a984708SDavid Chisnall 37,
907a984708SDavid Chisnall 41,
917a984708SDavid Chisnall 43,
927a984708SDavid Chisnall 47,
937a984708SDavid Chisnall 53,
947a984708SDavid Chisnall 59,
957a984708SDavid Chisnall 61,
967a984708SDavid Chisnall 67,
977a984708SDavid Chisnall 71,
987a984708SDavid Chisnall 73,
997a984708SDavid Chisnall 79,
1007a984708SDavid Chisnall 83,
1017a984708SDavid Chisnall 89,
1027a984708SDavid Chisnall 97,
1037a984708SDavid Chisnall 101,
1047a984708SDavid Chisnall 103,
1057a984708SDavid Chisnall 107,
1067a984708SDavid Chisnall 109,
1077a984708SDavid Chisnall 113,
1087a984708SDavid Chisnall 121,
1097a984708SDavid Chisnall 127,
1107a984708SDavid Chisnall 131,
1117a984708SDavid Chisnall 137,
1127a984708SDavid Chisnall 139,
1137a984708SDavid Chisnall 143,
1147a984708SDavid Chisnall 149,
1157a984708SDavid Chisnall 151,
1167a984708SDavid Chisnall 157,
1177a984708SDavid Chisnall 163,
1187a984708SDavid Chisnall 167,
1197a984708SDavid Chisnall 169,
1207a984708SDavid Chisnall 173,
1217a984708SDavid Chisnall 179,
1227a984708SDavid Chisnall 181,
1237a984708SDavid Chisnall 187,
1247a984708SDavid Chisnall 191,
1257a984708SDavid Chisnall 193,
1267a984708SDavid Chisnall 197,
1277a984708SDavid Chisnall 199,
1287a984708SDavid Chisnall 209
1297a984708SDavid Chisnall };
1307a984708SDavid Chisnall
1317a984708SDavid Chisnall }
1327a984708SDavid Chisnall
1337a984708SDavid Chisnall // Returns: If n == 0, returns 0. Else returns the lowest prime number that
1347a984708SDavid Chisnall // is greater than or equal to n.
1357a984708SDavid Chisnall //
1367a984708SDavid Chisnall // The algorithm creates a list of small primes, plus an open-ended list of
1377a984708SDavid Chisnall // potential primes. All prime numbers are potential prime numbers. However
1387a984708SDavid Chisnall // some potential prime numbers are not prime. In an ideal world, all potential
139*d72607e9SDimitry Andric // prime numbers would be prime. Candidate prime numbers are chosen as the next
1407a984708SDavid Chisnall // highest potential prime. Then this number is tested for prime by dividing it
1417a984708SDavid Chisnall // by all potential prime numbers less than the sqrt of the candidate.
1427a984708SDavid Chisnall //
1437a984708SDavid Chisnall // This implementation defines potential primes as those numbers not divisible
1447a984708SDavid Chisnall // by 2, 3, 5, and 7. Other (common) implementations define potential primes
1457a984708SDavid Chisnall // as those not divisible by 2. A few other implementations define potential
1467a984708SDavid Chisnall // primes as those not divisible by 2 or 3. By raising the number of small
1477a984708SDavid Chisnall // primes which the potential prime is not divisible by, the set of potential
1487a984708SDavid Chisnall // primes more closely approximates the set of prime numbers. And thus there
1497a984708SDavid Chisnall // are fewer potential primes to search, and fewer potential primes to divide
1507a984708SDavid Chisnall // against.
1517a984708SDavid Chisnall
152cfdf2879SDavid Chisnall template <size_t _Sz = sizeof(size_t)>
1537a984708SDavid Chisnall inline _LIBCPP_INLINE_VISIBILITY
154cfdf2879SDavid Chisnall typename enable_if<_Sz == 4, void>::type
__check_for_overflow(size_t N)155cfdf2879SDavid Chisnall __check_for_overflow(size_t N)
1567a984708SDavid Chisnall {
1577a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
1587a984708SDavid Chisnall if (N > 0xFFFFFFFB)
1597a984708SDavid Chisnall throw overflow_error("__next_prime overflow");
1601bf9f7c1SDimitry Andric #else
1611bf9f7c1SDimitry Andric (void)N;
1627a984708SDavid Chisnall #endif
1637a984708SDavid Chisnall }
1647a984708SDavid Chisnall
165cfdf2879SDavid Chisnall template <size_t _Sz = sizeof(size_t)>
1667a984708SDavid Chisnall inline _LIBCPP_INLINE_VISIBILITY
167cfdf2879SDavid Chisnall typename enable_if<_Sz == 8, void>::type
__check_for_overflow(size_t N)168cfdf2879SDavid Chisnall __check_for_overflow(size_t N)
1697a984708SDavid Chisnall {
1707a984708SDavid Chisnall #ifndef _LIBCPP_NO_EXCEPTIONS
1717a984708SDavid Chisnall if (N > 0xFFFFFFFFFFFFFFC5ull)
1727a984708SDavid Chisnall throw overflow_error("__next_prime overflow");
1731bf9f7c1SDimitry Andric #else
1741bf9f7c1SDimitry Andric (void)N;
1757a984708SDavid Chisnall #endif
1767a984708SDavid Chisnall }
1777a984708SDavid Chisnall
1787a984708SDavid Chisnall size_t
__next_prime(size_t n)1797a984708SDavid Chisnall __next_prime(size_t n)
1807a984708SDavid Chisnall {
1817a984708SDavid Chisnall const size_t L = 210;
1827a984708SDavid Chisnall const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
1837a984708SDavid Chisnall // If n is small enough, search in small_primes
1847a984708SDavid Chisnall if (n <= small_primes[N-1])
1857a984708SDavid Chisnall return *std::lower_bound(small_primes, small_primes + N, n);
1867a984708SDavid Chisnall // Else n > largest small_primes
1877a984708SDavid Chisnall // Check for overflow
188cfdf2879SDavid Chisnall __check_for_overflow(n);
1897a984708SDavid Chisnall // Start searching list of potential primes: L * k0 + indices[in]
1907a984708SDavid Chisnall const size_t M = sizeof(indices) / sizeof(indices[0]);
1917a984708SDavid Chisnall // Select first potential prime >= n
1927a984708SDavid Chisnall // Known a-priori n >= L
1937a984708SDavid Chisnall size_t k0 = n / L;
19494e3ee44SDavid Chisnall size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L)
19594e3ee44SDavid Chisnall - indices);
1967a984708SDavid Chisnall n = L * k0 + indices[in];
1977a984708SDavid Chisnall while (true)
1987a984708SDavid Chisnall {
1997a984708SDavid Chisnall // Divide n by all primes or potential primes (i) until:
2007a984708SDavid Chisnall // 1. The division is even, so try next potential prime.
2017a984708SDavid Chisnall // 2. The i > sqrt(n), in which case n is prime.
2027a984708SDavid Chisnall // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
2037a984708SDavid Chisnall // so don't test those (j == 5 -> divide by 11 first). And the
2047a984708SDavid Chisnall // potential primes start with 211, so don't test against the last
2057a984708SDavid Chisnall // small prime.
2067a984708SDavid Chisnall for (size_t j = 5; j < N - 1; ++j)
2077a984708SDavid Chisnall {
2087a984708SDavid Chisnall const std::size_t p = small_primes[j];
2097a984708SDavid Chisnall const std::size_t q = n / p;
2107a984708SDavid Chisnall if (q < p)
2117a984708SDavid Chisnall return n;
2127a984708SDavid Chisnall if (n == q * p)
2137a984708SDavid Chisnall goto next;
2147a984708SDavid Chisnall }
2157a984708SDavid Chisnall // n wasn't divisible by small primes, try potential primes
2167a984708SDavid Chisnall {
2177a984708SDavid Chisnall size_t i = 211;
2187a984708SDavid Chisnall while (true)
2197a984708SDavid Chisnall {
2207a984708SDavid Chisnall std::size_t q = n / i;
2217a984708SDavid Chisnall if (q < i)
2227a984708SDavid Chisnall return n;
2237a984708SDavid Chisnall if (n == q * i)
2247a984708SDavid Chisnall break;
2257a984708SDavid Chisnall
2267a984708SDavid Chisnall i += 10;
2277a984708SDavid Chisnall q = n / i;
2287a984708SDavid Chisnall if (q < i)
2297a984708SDavid Chisnall return n;
2307a984708SDavid Chisnall if (n == q * i)
2317a984708SDavid Chisnall break;
2327a984708SDavid Chisnall
2337a984708SDavid Chisnall i += 2;
2347a984708SDavid Chisnall q = n / i;
2357a984708SDavid Chisnall if (q < i)
2367a984708SDavid Chisnall return n;
2377a984708SDavid Chisnall if (n == q * i)
2387a984708SDavid Chisnall break;
2397a984708SDavid Chisnall
2407a984708SDavid Chisnall i += 4;
2417a984708SDavid Chisnall q = n / i;
2427a984708SDavid Chisnall if (q < i)
2437a984708SDavid Chisnall return n;
2447a984708SDavid Chisnall if (n == q * i)
2457a984708SDavid Chisnall break;
2467a984708SDavid Chisnall
2477a984708SDavid Chisnall i += 2;
2487a984708SDavid Chisnall q = n / i;
2497a984708SDavid Chisnall if (q < i)
2507a984708SDavid Chisnall return n;
2517a984708SDavid Chisnall if (n == q * i)
2527a984708SDavid Chisnall break;
2537a984708SDavid Chisnall
2547a984708SDavid Chisnall i += 4;
2557a984708SDavid Chisnall q = n / i;
2567a984708SDavid Chisnall if (q < i)
2577a984708SDavid Chisnall return n;
2587a984708SDavid Chisnall if (n == q * i)
2597a984708SDavid Chisnall break;
2607a984708SDavid Chisnall
2617a984708SDavid Chisnall i += 6;
2627a984708SDavid Chisnall q = n / i;
2637a984708SDavid Chisnall if (q < i)
2647a984708SDavid Chisnall return n;
2657a984708SDavid Chisnall if (n == q * i)
2667a984708SDavid Chisnall break;
2677a984708SDavid Chisnall
2687a984708SDavid Chisnall i += 2;
2697a984708SDavid Chisnall q = n / i;
2707a984708SDavid Chisnall if (q < i)
2717a984708SDavid Chisnall return n;
2727a984708SDavid Chisnall if (n == q * i)
2737a984708SDavid Chisnall break;
2747a984708SDavid Chisnall
2757a984708SDavid Chisnall i += 6;
2767a984708SDavid Chisnall q = n / i;
2777a984708SDavid Chisnall if (q < i)
2787a984708SDavid Chisnall return n;
2797a984708SDavid Chisnall if (n == q * i)
2807a984708SDavid Chisnall break;
2817a984708SDavid Chisnall
2827a984708SDavid Chisnall i += 4;
2837a984708SDavid Chisnall q = n / i;
2847a984708SDavid Chisnall if (q < i)
2857a984708SDavid Chisnall return n;
2867a984708SDavid Chisnall if (n == q * i)
2877a984708SDavid Chisnall break;
2887a984708SDavid Chisnall
2897a984708SDavid Chisnall i += 2;
2907a984708SDavid Chisnall q = n / i;
2917a984708SDavid Chisnall if (q < i)
2927a984708SDavid Chisnall return n;
2937a984708SDavid Chisnall if (n == q * i)
2947a984708SDavid Chisnall break;
2957a984708SDavid Chisnall
2967a984708SDavid Chisnall i += 4;
2977a984708SDavid Chisnall q = n / i;
2987a984708SDavid Chisnall if (q < i)
2997a984708SDavid Chisnall return n;
3007a984708SDavid Chisnall if (n == q * i)
3017a984708SDavid Chisnall break;
3027a984708SDavid Chisnall
3037a984708SDavid Chisnall i += 6;
3047a984708SDavid Chisnall q = n / i;
3057a984708SDavid Chisnall if (q < i)
3067a984708SDavid Chisnall return n;
3077a984708SDavid Chisnall if (n == q * i)
3087a984708SDavid Chisnall break;
3097a984708SDavid Chisnall
3107a984708SDavid Chisnall i += 6;
3117a984708SDavid Chisnall q = n / i;
3127a984708SDavid Chisnall if (q < i)
3137a984708SDavid Chisnall return n;
3147a984708SDavid Chisnall if (n == q * i)
3157a984708SDavid Chisnall break;
3167a984708SDavid Chisnall
3177a984708SDavid Chisnall i += 2;
3187a984708SDavid Chisnall q = n / i;
3197a984708SDavid Chisnall if (q < i)
3207a984708SDavid Chisnall return n;
3217a984708SDavid Chisnall if (n == q * i)
3227a984708SDavid Chisnall break;
3237a984708SDavid Chisnall
3247a984708SDavid Chisnall i += 6;
3257a984708SDavid Chisnall q = n / i;
3267a984708SDavid Chisnall if (q < i)
3277a984708SDavid Chisnall return n;
3287a984708SDavid Chisnall if (n == q * i)
3297a984708SDavid Chisnall break;
3307a984708SDavid Chisnall
3317a984708SDavid Chisnall i += 4;
3327a984708SDavid Chisnall q = n / i;
3337a984708SDavid Chisnall if (q < i)
3347a984708SDavid Chisnall return n;
3357a984708SDavid Chisnall if (n == q * i)
3367a984708SDavid Chisnall break;
3377a984708SDavid Chisnall
3387a984708SDavid Chisnall i += 2;
3397a984708SDavid Chisnall q = n / i;
3407a984708SDavid Chisnall if (q < i)
3417a984708SDavid Chisnall return n;
3427a984708SDavid Chisnall if (n == q * i)
3437a984708SDavid Chisnall break;
3447a984708SDavid Chisnall
3457a984708SDavid Chisnall i += 6;
3467a984708SDavid Chisnall q = n / i;
3477a984708SDavid Chisnall if (q < i)
3487a984708SDavid Chisnall return n;
3497a984708SDavid Chisnall if (n == q * i)
3507a984708SDavid Chisnall break;
3517a984708SDavid Chisnall
3527a984708SDavid Chisnall i += 4;
3537a984708SDavid Chisnall q = n / i;
3547a984708SDavid Chisnall if (q < i)
3557a984708SDavid Chisnall return n;
3567a984708SDavid Chisnall if (n == q * i)
3577a984708SDavid Chisnall break;
3587a984708SDavid Chisnall
3597a984708SDavid Chisnall i += 6;
3607a984708SDavid Chisnall q = n / i;
3617a984708SDavid Chisnall if (q < i)
3627a984708SDavid Chisnall return n;
3637a984708SDavid Chisnall if (n == q * i)
3647a984708SDavid Chisnall break;
3657a984708SDavid Chisnall
3667a984708SDavid Chisnall i += 8;
3677a984708SDavid Chisnall q = n / i;
3687a984708SDavid Chisnall if (q < i)
3697a984708SDavid Chisnall return n;
3707a984708SDavid Chisnall if (n == q * i)
3717a984708SDavid Chisnall break;
3727a984708SDavid Chisnall
3737a984708SDavid Chisnall i += 4;
3747a984708SDavid Chisnall q = n / i;
3757a984708SDavid Chisnall if (q < i)
3767a984708SDavid Chisnall return n;
3777a984708SDavid Chisnall if (n == q * i)
3787a984708SDavid Chisnall break;
3797a984708SDavid Chisnall
3807a984708SDavid Chisnall i += 2;
3817a984708SDavid Chisnall q = n / i;
3827a984708SDavid Chisnall if (q < i)
3837a984708SDavid Chisnall return n;
3847a984708SDavid Chisnall if (n == q * i)
3857a984708SDavid Chisnall break;
3867a984708SDavid Chisnall
3877a984708SDavid Chisnall i += 4;
3887a984708SDavid Chisnall q = n / i;
3897a984708SDavid Chisnall if (q < i)
3907a984708SDavid Chisnall return n;
3917a984708SDavid Chisnall if (n == q * i)
3927a984708SDavid Chisnall break;
3937a984708SDavid Chisnall
3947a984708SDavid Chisnall i += 2;
3957a984708SDavid Chisnall q = n / i;
3967a984708SDavid Chisnall if (q < i)
3977a984708SDavid Chisnall return n;
3987a984708SDavid Chisnall if (n == q * i)
3997a984708SDavid Chisnall break;
4007a984708SDavid Chisnall
4017a984708SDavid Chisnall i += 4;
4027a984708SDavid Chisnall q = n / i;
4037a984708SDavid Chisnall if (q < i)
4047a984708SDavid Chisnall return n;
4057a984708SDavid Chisnall if (n == q * i)
4067a984708SDavid Chisnall break;
4077a984708SDavid Chisnall
4087a984708SDavid Chisnall i += 8;
4097a984708SDavid Chisnall q = n / i;
4107a984708SDavid Chisnall if (q < i)
4117a984708SDavid Chisnall return n;
4127a984708SDavid Chisnall if (n == q * i)
4137a984708SDavid Chisnall break;
4147a984708SDavid Chisnall
4157a984708SDavid Chisnall i += 6;
4167a984708SDavid Chisnall q = n / i;
4177a984708SDavid Chisnall if (q < i)
4187a984708SDavid Chisnall return n;
4197a984708SDavid Chisnall if (n == q * i)
4207a984708SDavid Chisnall break;
4217a984708SDavid Chisnall
4227a984708SDavid Chisnall i += 4;
4237a984708SDavid Chisnall q = n / i;
4247a984708SDavid Chisnall if (q < i)
4257a984708SDavid Chisnall return n;
4267a984708SDavid Chisnall if (n == q * i)
4277a984708SDavid Chisnall break;
4287a984708SDavid Chisnall
4297a984708SDavid Chisnall i += 6;
4307a984708SDavid Chisnall q = n / i;
4317a984708SDavid Chisnall if (q < i)
4327a984708SDavid Chisnall return n;
4337a984708SDavid Chisnall if (n == q * i)
4347a984708SDavid Chisnall break;
4357a984708SDavid Chisnall
4367a984708SDavid Chisnall i += 2;
4377a984708SDavid Chisnall q = n / i;
4387a984708SDavid Chisnall if (q < i)
4397a984708SDavid Chisnall return n;
4407a984708SDavid Chisnall if (n == q * i)
4417a984708SDavid Chisnall break;
4427a984708SDavid Chisnall
4437a984708SDavid Chisnall i += 4;
4447a984708SDavid Chisnall q = n / i;
4457a984708SDavid Chisnall if (q < i)
4467a984708SDavid Chisnall return n;
4477a984708SDavid Chisnall if (n == q * i)
4487a984708SDavid Chisnall break;
4497a984708SDavid Chisnall
4507a984708SDavid Chisnall i += 6;
4517a984708SDavid Chisnall q = n / i;
4527a984708SDavid Chisnall if (q < i)
4537a984708SDavid Chisnall return n;
4547a984708SDavid Chisnall if (n == q * i)
4557a984708SDavid Chisnall break;
4567a984708SDavid Chisnall
4577a984708SDavid Chisnall i += 2;
4587a984708SDavid Chisnall q = n / i;
4597a984708SDavid Chisnall if (q < i)
4607a984708SDavid Chisnall return n;
4617a984708SDavid Chisnall if (n == q * i)
4627a984708SDavid Chisnall break;
4637a984708SDavid Chisnall
4647a984708SDavid Chisnall i += 6;
4657a984708SDavid Chisnall q = n / i;
4667a984708SDavid Chisnall if (q < i)
4677a984708SDavid Chisnall return n;
4687a984708SDavid Chisnall if (n == q * i)
4697a984708SDavid Chisnall break;
4707a984708SDavid Chisnall
4717a984708SDavid Chisnall i += 6;
4727a984708SDavid Chisnall q = n / i;
4737a984708SDavid Chisnall if (q < i)
4747a984708SDavid Chisnall return n;
4757a984708SDavid Chisnall if (n == q * i)
4767a984708SDavid Chisnall break;
4777a984708SDavid Chisnall
4787a984708SDavid Chisnall i += 4;
4797a984708SDavid Chisnall q = n / i;
4807a984708SDavid Chisnall if (q < i)
4817a984708SDavid Chisnall return n;
4827a984708SDavid Chisnall if (n == q * i)
4837a984708SDavid Chisnall break;
4847a984708SDavid Chisnall
4857a984708SDavid Chisnall i += 2;
4867a984708SDavid Chisnall q = n / i;
4877a984708SDavid Chisnall if (q < i)
4887a984708SDavid Chisnall return n;
4897a984708SDavid Chisnall if (n == q * i)
4907a984708SDavid Chisnall break;
4917a984708SDavid Chisnall
4927a984708SDavid Chisnall i += 4;
4937a984708SDavid Chisnall q = n / i;
4947a984708SDavid Chisnall if (q < i)
4957a984708SDavid Chisnall return n;
4967a984708SDavid Chisnall if (n == q * i)
4977a984708SDavid Chisnall break;
4987a984708SDavid Chisnall
4997a984708SDavid Chisnall i += 6;
5007a984708SDavid Chisnall q = n / i;
5017a984708SDavid Chisnall if (q < i)
5027a984708SDavid Chisnall return n;
5037a984708SDavid Chisnall if (n == q * i)
5047a984708SDavid Chisnall break;
5057a984708SDavid Chisnall
5067a984708SDavid Chisnall i += 2;
5077a984708SDavid Chisnall q = n / i;
5087a984708SDavid Chisnall if (q < i)
5097a984708SDavid Chisnall return n;
5107a984708SDavid Chisnall if (n == q * i)
5117a984708SDavid Chisnall break;
5127a984708SDavid Chisnall
5137a984708SDavid Chisnall i += 6;
5147a984708SDavid Chisnall q = n / i;
5157a984708SDavid Chisnall if (q < i)
5167a984708SDavid Chisnall return n;
5177a984708SDavid Chisnall if (n == q * i)
5187a984708SDavid Chisnall break;
5197a984708SDavid Chisnall
5207a984708SDavid Chisnall i += 4;
5217a984708SDavid Chisnall q = n / i;
5227a984708SDavid Chisnall if (q < i)
5237a984708SDavid Chisnall return n;
5247a984708SDavid Chisnall if (n == q * i)
5257a984708SDavid Chisnall break;
5267a984708SDavid Chisnall
5277a984708SDavid Chisnall i += 2;
5287a984708SDavid Chisnall q = n / i;
5297a984708SDavid Chisnall if (q < i)
5307a984708SDavid Chisnall return n;
5317a984708SDavid Chisnall if (n == q * i)
5327a984708SDavid Chisnall break;
5337a984708SDavid Chisnall
5347a984708SDavid Chisnall i += 4;
5357a984708SDavid Chisnall q = n / i;
5367a984708SDavid Chisnall if (q < i)
5377a984708SDavid Chisnall return n;
5387a984708SDavid Chisnall if (n == q * i)
5397a984708SDavid Chisnall break;
5407a984708SDavid Chisnall
5417a984708SDavid Chisnall i += 2;
5427a984708SDavid Chisnall q = n / i;
5437a984708SDavid Chisnall if (q < i)
5447a984708SDavid Chisnall return n;
5457a984708SDavid Chisnall if (n == q * i)
5467a984708SDavid Chisnall break;
5477a984708SDavid Chisnall
5487a984708SDavid Chisnall i += 10;
5497a984708SDavid Chisnall q = n / i;
5507a984708SDavid Chisnall if (q < i)
5517a984708SDavid Chisnall return n;
5527a984708SDavid Chisnall if (n == q * i)
5537a984708SDavid Chisnall break;
5547a984708SDavid Chisnall
5557a984708SDavid Chisnall // This will loop i to the next "plane" of potential primes
5567a984708SDavid Chisnall i += 2;
5577a984708SDavid Chisnall }
5587a984708SDavid Chisnall }
5597a984708SDavid Chisnall next:
5607a984708SDavid Chisnall // n is not prime. Increment n to next potential prime.
5617a984708SDavid Chisnall if (++in == M)
5627a984708SDavid Chisnall {
5637a984708SDavid Chisnall ++k0;
5647a984708SDavid Chisnall in = 0;
5657a984708SDavid Chisnall }
5667a984708SDavid Chisnall n = L * k0 + indices[in];
5677a984708SDavid Chisnall }
5687a984708SDavid Chisnall }
5697a984708SDavid Chisnall
5707a984708SDavid Chisnall _LIBCPP_END_NAMESPACE_STD
571