1349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
981ad6265SDimitry Andric #include <__hash_table>
1081ad6265SDimitry Andric #include <algorithm>
1181ad6265SDimitry Andric #include <stdexcept>
1281ad6265SDimitry Andric #include <type_traits>
130b57cec5SDimitry Andric 
1481ad6265SDimitry Andric _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wtautological-constant-out-of-range-compare")
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric namespace {
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric // handle all next_prime(i) for i in [1, 210), special case 0
21cb14a3feSDimitry Andric const unsigned small_primes[] = {
22cb14a3feSDimitry Andric     0,   2,   3,   5,   7,   11,  13,  17,  19,  23,  29,  31,  37,  41,  43,  47,
23cb14a3feSDimitry Andric     53,  59,  61,  67,  71,  73,  79,  83,  89,  97,  101, 103, 107, 109, 113, 127,
24cb14a3feSDimitry Andric     131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211};
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric // potential primes = 210*k + indices[i], k >= 1
270b57cec5SDimitry Andric //   these numbers are not divisible by 2, 3, 5 or 7
280b57cec5SDimitry Andric //   (or any integer 2 <= j <= 10 for that matter).
29cb14a3feSDimitry Andric const unsigned indices[] = {
30cb14a3feSDimitry Andric     1,   11,  13,  17,  19,  23,  29,  31,  37,  41,  43,  47,  53,  59,  61,  67,
31cb14a3feSDimitry Andric     71,  73,  79,  83,  89,  97,  101, 103, 107, 109, 113, 121, 127, 131, 137, 139,
32cb14a3feSDimitry Andric     143, 149, 151, 157, 163, 167, 169, 173, 179, 181, 187, 191, 193, 197, 199, 209};
330b57cec5SDimitry Andric 
34cb14a3feSDimitry Andric } // namespace
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric // Returns:  If n == 0, returns 0.  Else returns the lowest prime number that
370b57cec5SDimitry Andric // is greater than or equal to n.
380b57cec5SDimitry Andric //
390b57cec5SDimitry Andric // The algorithm creates a list of small primes, plus an open-ended list of
400b57cec5SDimitry Andric // potential primes.  All prime numbers are potential prime numbers.  However
410b57cec5SDimitry Andric // some potential prime numbers are not prime.  In an ideal world, all potential
420b57cec5SDimitry Andric // prime numbers would be prime.  Candidate prime numbers are chosen as the next
430b57cec5SDimitry Andric // highest potential prime.  Then this number is tested for prime by dividing it
440b57cec5SDimitry Andric // by all potential prime numbers less than the sqrt of the candidate.
450b57cec5SDimitry Andric //
460b57cec5SDimitry Andric // This implementation defines potential primes as those numbers not divisible
470b57cec5SDimitry Andric // by 2, 3, 5, and 7.  Other (common) implementations define potential primes
480b57cec5SDimitry Andric // as those not divisible by 2.  A few other implementations define potential
490b57cec5SDimitry Andric // primes as those not divisible by 2 or 3.  By raising the number of small
500b57cec5SDimitry Andric // primes which the potential prime is not divisible by, the set of potential
510b57cec5SDimitry Andric // primes more closely approximates the set of prime numbers.  And thus there
520b57cec5SDimitry Andric // are fewer potential primes to search, and fewer potential primes to divide
530b57cec5SDimitry Andric // against.
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric template <size_t _Sz = sizeof(size_t)>
__check_for_overflow(size_t N)56cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI typename enable_if<_Sz == 4, void>::type __check_for_overflow(size_t N) {
570b57cec5SDimitry Andric   if (N > 0xFFFFFFFB)
580b57cec5SDimitry Andric     __throw_overflow_error("__next_prime overflow");
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric template <size_t _Sz = sizeof(size_t)>
__check_for_overflow(size_t N)62cb14a3feSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI typename enable_if<_Sz == 8, void>::type __check_for_overflow(size_t N) {
630b57cec5SDimitry Andric   if (N > 0xFFFFFFFFFFFFFFC5ull)
640b57cec5SDimitry Andric     __throw_overflow_error("__next_prime overflow");
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
__next_prime(size_t n)67cb14a3feSDimitry Andric size_t __next_prime(size_t n) {
680b57cec5SDimitry Andric   const size_t L = 210;
690b57cec5SDimitry Andric   const size_t N = sizeof(small_primes) / sizeof(small_primes[0]);
700b57cec5SDimitry Andric   // If n is small enough, search in small_primes
710b57cec5SDimitry Andric   if (n <= small_primes[N - 1])
720b57cec5SDimitry Andric     return *std::lower_bound(small_primes, small_primes + N, n);
730b57cec5SDimitry Andric   // Else n > largest small_primes
740b57cec5SDimitry Andric   // Check for overflow
750b57cec5SDimitry Andric   __check_for_overflow(n);
760b57cec5SDimitry Andric   // Start searching list of potential primes: L * k0 + indices[in]
770b57cec5SDimitry Andric   const size_t M = sizeof(indices) / sizeof(indices[0]);
780b57cec5SDimitry Andric   // Select first potential prime >= n
790b57cec5SDimitry Andric   //   Known a-priori n >= L
800b57cec5SDimitry Andric   size_t k0 = n / L;
81cb14a3feSDimitry Andric   size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) - indices);
820b57cec5SDimitry Andric   n         = L * k0 + indices[in];
83cb14a3feSDimitry Andric   while (true) {
840b57cec5SDimitry Andric     // Divide n by all primes or potential primes (i) until:
850b57cec5SDimitry Andric     //    1.  The division is even, so try next potential prime.
860b57cec5SDimitry Andric     //    2.  The i > sqrt(n), in which case n is prime.
870b57cec5SDimitry Andric     // It is known a-priori that n is not divisible by 2, 3, 5 or 7,
880b57cec5SDimitry Andric     //    so don't test those (j == 5 ->  divide by 11 first).  And the
890b57cec5SDimitry Andric     //    potential primes start with 211, so don't test against the last
900b57cec5SDimitry Andric     //    small prime.
91cb14a3feSDimitry Andric     for (size_t j = 5; j < N - 1; ++j) {
920b57cec5SDimitry Andric       const std::size_t p = small_primes[j];
930b57cec5SDimitry Andric       const std::size_t q = n / p;
940b57cec5SDimitry Andric       if (q < p)
950b57cec5SDimitry Andric         return n;
960b57cec5SDimitry Andric       if (n == q * p)
970b57cec5SDimitry Andric         goto next;
980b57cec5SDimitry Andric     }
990b57cec5SDimitry Andric     // n wasn't divisible by small primes, try potential primes
1000b57cec5SDimitry Andric     {
1010b57cec5SDimitry Andric       size_t i = 211;
102cb14a3feSDimitry Andric       while (true) {
1030b57cec5SDimitry Andric         std::size_t q = n / i;
1040b57cec5SDimitry Andric         if (q < i)
1050b57cec5SDimitry Andric           return n;
1060b57cec5SDimitry Andric         if (n == q * i)
1070b57cec5SDimitry Andric           break;
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric         i += 10;
1100b57cec5SDimitry Andric         q = n / i;
1110b57cec5SDimitry Andric         if (q < i)
1120b57cec5SDimitry Andric           return n;
1130b57cec5SDimitry Andric         if (n == q * i)
1140b57cec5SDimitry Andric           break;
1150b57cec5SDimitry Andric 
1160b57cec5SDimitry Andric         i += 2;
1170b57cec5SDimitry Andric         q = n / i;
1180b57cec5SDimitry Andric         if (q < i)
1190b57cec5SDimitry Andric           return n;
1200b57cec5SDimitry Andric         if (n == q * i)
1210b57cec5SDimitry Andric           break;
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric         i += 4;
1240b57cec5SDimitry Andric         q = n / i;
1250b57cec5SDimitry Andric         if (q < i)
1260b57cec5SDimitry Andric           return n;
1270b57cec5SDimitry Andric         if (n == q * i)
1280b57cec5SDimitry Andric           break;
1290b57cec5SDimitry Andric 
1300b57cec5SDimitry Andric         i += 2;
1310b57cec5SDimitry Andric         q = n / i;
1320b57cec5SDimitry Andric         if (q < i)
1330b57cec5SDimitry Andric           return n;
1340b57cec5SDimitry Andric         if (n == q * i)
1350b57cec5SDimitry Andric           break;
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric         i += 4;
1380b57cec5SDimitry Andric         q = n / i;
1390b57cec5SDimitry Andric         if (q < i)
1400b57cec5SDimitry Andric           return n;
1410b57cec5SDimitry Andric         if (n == q * i)
1420b57cec5SDimitry Andric           break;
1430b57cec5SDimitry Andric 
1440b57cec5SDimitry Andric         i += 6;
1450b57cec5SDimitry Andric         q = n / i;
1460b57cec5SDimitry Andric         if (q < i)
1470b57cec5SDimitry Andric           return n;
1480b57cec5SDimitry Andric         if (n == q * i)
1490b57cec5SDimitry Andric           break;
1500b57cec5SDimitry Andric 
1510b57cec5SDimitry Andric         i += 2;
1520b57cec5SDimitry Andric         q = n / i;
1530b57cec5SDimitry Andric         if (q < i)
1540b57cec5SDimitry Andric           return n;
1550b57cec5SDimitry Andric         if (n == q * i)
1560b57cec5SDimitry Andric           break;
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric         i += 6;
1590b57cec5SDimitry Andric         q = n / i;
1600b57cec5SDimitry Andric         if (q < i)
1610b57cec5SDimitry Andric           return n;
1620b57cec5SDimitry Andric         if (n == q * i)
1630b57cec5SDimitry Andric           break;
1640b57cec5SDimitry Andric 
1650b57cec5SDimitry Andric         i += 4;
1660b57cec5SDimitry Andric         q = n / i;
1670b57cec5SDimitry Andric         if (q < i)
1680b57cec5SDimitry Andric           return n;
1690b57cec5SDimitry Andric         if (n == q * i)
1700b57cec5SDimitry Andric           break;
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric         i += 2;
1730b57cec5SDimitry Andric         q = n / i;
1740b57cec5SDimitry Andric         if (q < i)
1750b57cec5SDimitry Andric           return n;
1760b57cec5SDimitry Andric         if (n == q * i)
1770b57cec5SDimitry Andric           break;
1780b57cec5SDimitry Andric 
1790b57cec5SDimitry Andric         i += 4;
1800b57cec5SDimitry Andric         q = n / i;
1810b57cec5SDimitry Andric         if (q < i)
1820b57cec5SDimitry Andric           return n;
1830b57cec5SDimitry Andric         if (n == q * i)
1840b57cec5SDimitry Andric           break;
1850b57cec5SDimitry Andric 
1860b57cec5SDimitry Andric         i += 6;
1870b57cec5SDimitry Andric         q = n / i;
1880b57cec5SDimitry Andric         if (q < i)
1890b57cec5SDimitry Andric           return n;
1900b57cec5SDimitry Andric         if (n == q * i)
1910b57cec5SDimitry Andric           break;
1920b57cec5SDimitry Andric 
1930b57cec5SDimitry Andric         i += 6;
1940b57cec5SDimitry Andric         q = n / i;
1950b57cec5SDimitry Andric         if (q < i)
1960b57cec5SDimitry Andric           return n;
1970b57cec5SDimitry Andric         if (n == q * i)
1980b57cec5SDimitry Andric           break;
1990b57cec5SDimitry Andric 
2000b57cec5SDimitry Andric         i += 2;
2010b57cec5SDimitry Andric         q = n / i;
2020b57cec5SDimitry Andric         if (q < i)
2030b57cec5SDimitry Andric           return n;
2040b57cec5SDimitry Andric         if (n == q * i)
2050b57cec5SDimitry Andric           break;
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric         i += 6;
2080b57cec5SDimitry Andric         q = n / i;
2090b57cec5SDimitry Andric         if (q < i)
2100b57cec5SDimitry Andric           return n;
2110b57cec5SDimitry Andric         if (n == q * i)
2120b57cec5SDimitry Andric           break;
2130b57cec5SDimitry Andric 
2140b57cec5SDimitry Andric         i += 4;
2150b57cec5SDimitry Andric         q = n / i;
2160b57cec5SDimitry Andric         if (q < i)
2170b57cec5SDimitry Andric           return n;
2180b57cec5SDimitry Andric         if (n == q * i)
2190b57cec5SDimitry Andric           break;
2200b57cec5SDimitry Andric 
2210b57cec5SDimitry Andric         i += 2;
2220b57cec5SDimitry Andric         q = n / i;
2230b57cec5SDimitry Andric         if (q < i)
2240b57cec5SDimitry Andric           return n;
2250b57cec5SDimitry Andric         if (n == q * i)
2260b57cec5SDimitry Andric           break;
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric         i += 6;
2290b57cec5SDimitry Andric         q = n / i;
2300b57cec5SDimitry Andric         if (q < i)
2310b57cec5SDimitry Andric           return n;
2320b57cec5SDimitry Andric         if (n == q * i)
2330b57cec5SDimitry Andric           break;
2340b57cec5SDimitry Andric 
2350b57cec5SDimitry Andric         i += 4;
2360b57cec5SDimitry Andric         q = n / i;
2370b57cec5SDimitry Andric         if (q < i)
2380b57cec5SDimitry Andric           return n;
2390b57cec5SDimitry Andric         if (n == q * i)
2400b57cec5SDimitry Andric           break;
2410b57cec5SDimitry Andric 
2420b57cec5SDimitry Andric         i += 6;
2430b57cec5SDimitry Andric         q = n / i;
2440b57cec5SDimitry Andric         if (q < i)
2450b57cec5SDimitry Andric           return n;
2460b57cec5SDimitry Andric         if (n == q * i)
2470b57cec5SDimitry Andric           break;
2480b57cec5SDimitry Andric 
2490b57cec5SDimitry Andric         i += 8;
2500b57cec5SDimitry Andric         q = n / i;
2510b57cec5SDimitry Andric         if (q < i)
2520b57cec5SDimitry Andric           return n;
2530b57cec5SDimitry Andric         if (n == q * i)
2540b57cec5SDimitry Andric           break;
2550b57cec5SDimitry Andric 
2560b57cec5SDimitry Andric         i += 4;
2570b57cec5SDimitry Andric         q = n / i;
2580b57cec5SDimitry Andric         if (q < i)
2590b57cec5SDimitry Andric           return n;
2600b57cec5SDimitry Andric         if (n == q * i)
2610b57cec5SDimitry Andric           break;
2620b57cec5SDimitry Andric 
2630b57cec5SDimitry Andric         i += 2;
2640b57cec5SDimitry Andric         q = n / i;
2650b57cec5SDimitry Andric         if (q < i)
2660b57cec5SDimitry Andric           return n;
2670b57cec5SDimitry Andric         if (n == q * i)
2680b57cec5SDimitry Andric           break;
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric         i += 4;
2710b57cec5SDimitry Andric         q = n / i;
2720b57cec5SDimitry Andric         if (q < i)
2730b57cec5SDimitry Andric           return n;
2740b57cec5SDimitry Andric         if (n == q * i)
2750b57cec5SDimitry Andric           break;
2760b57cec5SDimitry Andric 
2770b57cec5SDimitry Andric         i += 2;
2780b57cec5SDimitry Andric         q = n / i;
2790b57cec5SDimitry Andric         if (q < i)
2800b57cec5SDimitry Andric           return n;
2810b57cec5SDimitry Andric         if (n == q * i)
2820b57cec5SDimitry Andric           break;
2830b57cec5SDimitry Andric 
2840b57cec5SDimitry Andric         i += 4;
2850b57cec5SDimitry Andric         q = n / i;
2860b57cec5SDimitry Andric         if (q < i)
2870b57cec5SDimitry Andric           return n;
2880b57cec5SDimitry Andric         if (n == q * i)
2890b57cec5SDimitry Andric           break;
2900b57cec5SDimitry Andric 
2910b57cec5SDimitry Andric         i += 8;
2920b57cec5SDimitry Andric         q = n / i;
2930b57cec5SDimitry Andric         if (q < i)
2940b57cec5SDimitry Andric           return n;
2950b57cec5SDimitry Andric         if (n == q * i)
2960b57cec5SDimitry Andric           break;
2970b57cec5SDimitry Andric 
2980b57cec5SDimitry Andric         i += 6;
2990b57cec5SDimitry Andric         q = n / i;
3000b57cec5SDimitry Andric         if (q < i)
3010b57cec5SDimitry Andric           return n;
3020b57cec5SDimitry Andric         if (n == q * i)
3030b57cec5SDimitry Andric           break;
3040b57cec5SDimitry Andric 
3050b57cec5SDimitry Andric         i += 4;
3060b57cec5SDimitry Andric         q = n / i;
3070b57cec5SDimitry Andric         if (q < i)
3080b57cec5SDimitry Andric           return n;
3090b57cec5SDimitry Andric         if (n == q * i)
3100b57cec5SDimitry Andric           break;
3110b57cec5SDimitry Andric 
3120b57cec5SDimitry Andric         i += 6;
3130b57cec5SDimitry Andric         q = n / i;
3140b57cec5SDimitry Andric         if (q < i)
3150b57cec5SDimitry Andric           return n;
3160b57cec5SDimitry Andric         if (n == q * i)
3170b57cec5SDimitry Andric           break;
3180b57cec5SDimitry Andric 
3190b57cec5SDimitry Andric         i += 2;
3200b57cec5SDimitry Andric         q = n / i;
3210b57cec5SDimitry Andric         if (q < i)
3220b57cec5SDimitry Andric           return n;
3230b57cec5SDimitry Andric         if (n == q * i)
3240b57cec5SDimitry Andric           break;
3250b57cec5SDimitry Andric 
3260b57cec5SDimitry Andric         i += 4;
3270b57cec5SDimitry Andric         q = n / i;
3280b57cec5SDimitry Andric         if (q < i)
3290b57cec5SDimitry Andric           return n;
3300b57cec5SDimitry Andric         if (n == q * i)
3310b57cec5SDimitry Andric           break;
3320b57cec5SDimitry Andric 
3330b57cec5SDimitry Andric         i += 6;
3340b57cec5SDimitry Andric         q = n / i;
3350b57cec5SDimitry Andric         if (q < i)
3360b57cec5SDimitry Andric           return n;
3370b57cec5SDimitry Andric         if (n == q * i)
3380b57cec5SDimitry Andric           break;
3390b57cec5SDimitry Andric 
3400b57cec5SDimitry Andric         i += 2;
3410b57cec5SDimitry Andric         q = n / i;
3420b57cec5SDimitry Andric         if (q < i)
3430b57cec5SDimitry Andric           return n;
3440b57cec5SDimitry Andric         if (n == q * i)
3450b57cec5SDimitry Andric           break;
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric         i += 6;
3480b57cec5SDimitry Andric         q = n / i;
3490b57cec5SDimitry Andric         if (q < i)
3500b57cec5SDimitry Andric           return n;
3510b57cec5SDimitry Andric         if (n == q * i)
3520b57cec5SDimitry Andric           break;
3530b57cec5SDimitry Andric 
3540b57cec5SDimitry Andric         i += 6;
3550b57cec5SDimitry Andric         q = n / i;
3560b57cec5SDimitry Andric         if (q < i)
3570b57cec5SDimitry Andric           return n;
3580b57cec5SDimitry Andric         if (n == q * i)
3590b57cec5SDimitry Andric           break;
3600b57cec5SDimitry Andric 
3610b57cec5SDimitry Andric         i += 4;
3620b57cec5SDimitry Andric         q = n / i;
3630b57cec5SDimitry Andric         if (q < i)
3640b57cec5SDimitry Andric           return n;
3650b57cec5SDimitry Andric         if (n == q * i)
3660b57cec5SDimitry Andric           break;
3670b57cec5SDimitry Andric 
3680b57cec5SDimitry Andric         i += 2;
3690b57cec5SDimitry Andric         q = n / i;
3700b57cec5SDimitry Andric         if (q < i)
3710b57cec5SDimitry Andric           return n;
3720b57cec5SDimitry Andric         if (n == q * i)
3730b57cec5SDimitry Andric           break;
3740b57cec5SDimitry Andric 
3750b57cec5SDimitry Andric         i += 4;
3760b57cec5SDimitry Andric         q = n / i;
3770b57cec5SDimitry Andric         if (q < i)
3780b57cec5SDimitry Andric           return n;
3790b57cec5SDimitry Andric         if (n == q * i)
3800b57cec5SDimitry Andric           break;
3810b57cec5SDimitry Andric 
3820b57cec5SDimitry Andric         i += 6;
3830b57cec5SDimitry Andric         q = n / i;
3840b57cec5SDimitry Andric         if (q < i)
3850b57cec5SDimitry Andric           return n;
3860b57cec5SDimitry Andric         if (n == q * i)
3870b57cec5SDimitry Andric           break;
3880b57cec5SDimitry Andric 
3890b57cec5SDimitry Andric         i += 2;
3900b57cec5SDimitry Andric         q = n / i;
3910b57cec5SDimitry Andric         if (q < i)
3920b57cec5SDimitry Andric           return n;
3930b57cec5SDimitry Andric         if (n == q * i)
3940b57cec5SDimitry Andric           break;
3950b57cec5SDimitry Andric 
3960b57cec5SDimitry Andric         i += 6;
3970b57cec5SDimitry Andric         q = n / i;
3980b57cec5SDimitry Andric         if (q < i)
3990b57cec5SDimitry Andric           return n;
4000b57cec5SDimitry Andric         if (n == q * i)
4010b57cec5SDimitry Andric           break;
4020b57cec5SDimitry Andric 
4030b57cec5SDimitry Andric         i += 4;
4040b57cec5SDimitry Andric         q = n / i;
4050b57cec5SDimitry Andric         if (q < i)
4060b57cec5SDimitry Andric           return n;
4070b57cec5SDimitry Andric         if (n == q * i)
4080b57cec5SDimitry Andric           break;
4090b57cec5SDimitry Andric 
4100b57cec5SDimitry Andric         i += 2;
4110b57cec5SDimitry Andric         q = n / i;
4120b57cec5SDimitry Andric         if (q < i)
4130b57cec5SDimitry Andric           return n;
4140b57cec5SDimitry Andric         if (n == q * i)
4150b57cec5SDimitry Andric           break;
4160b57cec5SDimitry Andric 
4170b57cec5SDimitry Andric         i += 4;
4180b57cec5SDimitry Andric         q = n / i;
4190b57cec5SDimitry Andric         if (q < i)
4200b57cec5SDimitry Andric           return n;
4210b57cec5SDimitry Andric         if (n == q * i)
4220b57cec5SDimitry Andric           break;
4230b57cec5SDimitry Andric 
4240b57cec5SDimitry Andric         i += 2;
4250b57cec5SDimitry Andric         q = n / i;
4260b57cec5SDimitry Andric         if (q < i)
4270b57cec5SDimitry Andric           return n;
4280b57cec5SDimitry Andric         if (n == q * i)
4290b57cec5SDimitry Andric           break;
4300b57cec5SDimitry Andric 
4310b57cec5SDimitry Andric         i += 10;
4320b57cec5SDimitry Andric         q = n / i;
4330b57cec5SDimitry Andric         if (q < i)
4340b57cec5SDimitry Andric           return n;
4350b57cec5SDimitry Andric         if (n == q * i)
4360b57cec5SDimitry Andric           break;
4370b57cec5SDimitry Andric 
4380b57cec5SDimitry Andric         // This will loop i to the next "plane" of potential primes
4390b57cec5SDimitry Andric         i += 2;
4400b57cec5SDimitry Andric       }
4410b57cec5SDimitry Andric     }
4420b57cec5SDimitry Andric   next:
4430b57cec5SDimitry Andric     // n is not prime.  Increment n to next potential prime.
444cb14a3feSDimitry Andric     if (++in == M) {
4450b57cec5SDimitry Andric       ++k0;
4460b57cec5SDimitry Andric       in = 0;
4470b57cec5SDimitry Andric     }
4480b57cec5SDimitry Andric     n = L * k0 + indices[in];
4490b57cec5SDimitry Andric   }
4500b57cec5SDimitry Andric }
4510b57cec5SDimitry Andric 
4520b57cec5SDimitry Andric _LIBCPP_END_NAMESPACE_STD
453