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 21*cb14a3feSDimitry Andric const unsigned small_primes[] = { 22*cb14a3feSDimitry Andric 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 23*cb14a3feSDimitry Andric 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 24*cb14a3feSDimitry 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). 29*cb14a3feSDimitry Andric const unsigned indices[] = { 30*cb14a3feSDimitry Andric 1, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 31*cb14a3feSDimitry Andric 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 121, 127, 131, 137, 139, 32*cb14a3feSDimitry Andric 143, 149, 151, 157, 163, 167, 169, 173, 179, 181, 187, 191, 193, 197, 199, 209}; 330b57cec5SDimitry Andric 34*cb14a3feSDimitry 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)> 56*cb14a3feSDimitry 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)> 62*cb14a3feSDimitry 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 67*cb14a3feSDimitry 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; 81*cb14a3feSDimitry 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]; 83*cb14a3feSDimitry 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. 91*cb14a3feSDimitry 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; 102*cb14a3feSDimitry 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. 444*cb14a3feSDimitry 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