| |
| |
| |
| |
| |
| |
| |
|
|
| #include <__hash_table> |
| #include <algorithm> |
| #include <stdexcept> |
|
|
| _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wtautological-constant-out-of-range-compare") |
|
|
| _LIBCPP_BEGIN_NAMESPACE_STD |
|
|
| namespace { |
|
|
| |
| const unsigned small_primes[] = { |
| 0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, |
| 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, |
| 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211}; |
|
|
| |
| |
| |
| const unsigned indices[] = { |
| 1, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, |
| 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 121, 127, 131, 137, 139, |
| 143, 149, 151, 157, 163, 167, 169, 173, 179, 181, 187, 191, 193, 197, 199, 209}; |
|
|
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| inline void __check_for_overflow(size_t N) { |
| if constexpr (sizeof(size_t) == 4) { |
| if (N > 0xFFFFFFFB) |
| std::__throw_overflow_error("__next_prime overflow"); |
| } else { |
| if (N > 0xFFFFFFFFFFFFFFC5ull) |
| std::__throw_overflow_error("__next_prime overflow"); |
| } |
| } |
|
|
| size_t __next_prime(size_t n) { |
| const size_t L = 210; |
| const size_t N = sizeof(small_primes) / sizeof(small_primes[0]); |
| |
| if (n <= small_primes[N - 1]) |
| return *std::lower_bound(small_primes, small_primes + N, n); |
| |
| |
| __check_for_overflow(n); |
| |
| const size_t M = sizeof(indices) / sizeof(indices[0]); |
| |
| |
| size_t k0 = n / L; |
| size_t in = static_cast<size_t>(std::lower_bound(indices, indices + M, n - k0 * L) - indices); |
| n = L * k0 + indices[in]; |
| while (true) { |
| |
| |
| |
| |
| |
| |
| |
| for (size_t j = 5; j < N - 1; ++j) { |
| const std::size_t p = small_primes[j]; |
| const std::size_t q = n / p; |
| if (q < p) |
| return n; |
| if (n == q * p) |
| goto next; |
| } |
| |
| { |
| size_t i = 211; |
| while (true) { |
| std::size_t q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 10; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 8; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 8; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 6; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 4; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 2; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| i += 10; |
| q = n / i; |
| if (q < i) |
| return n; |
| if (n == q * i) |
| break; |
|
|
| |
| i += 2; |
| } |
| } |
| next: |
| |
| if (++in == M) { |
| ++k0; |
| in = 0; |
| } |
| n = L * k0 + indices[in]; |
| } |
| } |
|
|
| _LIBCPP_END_NAMESPACE_STD |
|
|