#include template struct Sqrt { template struct Helper { static const int mid = (lo + hi + 1) / 2; static const int value = std::conditional < (N / mid < mid), Helper < lo, mid - 1 >, Helper >::type::value; }; template struct Helper { static const int value = n; }; static const int value = Helper <0, N>::value; }; template struct is_prime_to_max_odd { static bool const value = x % max_odd != 0 && is_prime_to_max_odd::value; }; template struct is_prime_to_max_odd : std::true_type {}; template struct max_prime_compare { static long const tmp = Sqrt::value, value = tmp % 2 == 0 ? tmp + 1 : tmp + 2; }; template struct check_odd { static bool const value = is_prime_to_max_odd::value>::value; }; template struct check_odd { static bool const value = false; }; template struct is_prime { static bool const value = check_odd::value; }; template <> struct is_prime <1> : std::false_type {}; template <> struct is_prime <2> : std::true_type {}; int main() { bool b49991 = is_prime<49991>::value; bool b49992 = is_prime<49992>::value; bool b49993 = is_prime<49993>::value; return 0; }