#ifndef MPU_UTIL_H
#define MPU_UTIL_H
#include "ptypes.h"
extern int _XS_get_verbose(void);
extern void _XS_set_verbose(int v);
extern int _XS_get_callgmp(void);
extern void _XS_set_callgmp(int v);
extern int _XS_is_prime(UV x);
extern UV _XS_next_prime(UV x);
extern UV _XS_prev_prime(UV x);
extern UV _XS_prime_count(UV low, UV high);
extern UV _XS_nth_prime(UV x);
extern signed char* _moebius_range(UV low, UV high);
extern UV* _totient_range(UV low, UV high);
extern IV _XS_mertens(UV n);
extern double _XS_chebyshev_theta(UV n);
extern double _XS_chebyshev_psi(UV n);
extern double _XS_ExponentialIntegral(double x);
extern double _XS_LogarithmicIntegral(double x);
extern long double ld_riemann_zeta(long double x);
extern double _XS_RiemannR(double x);
/* Above this value, is_prime will do deterministic Miller-Rabin */
/* With 64-bit math, we can do much faster mulmods from 2^16-2^32 */
#if (BITS_PER_WORD == 64) || HAVE_STD_U64
#define MPU_PROB_PRIME_BEST UVCONST(100000)
#else
#define MPU_PROB_PRIME_BEST UVCONST(100000000)
#endif
static UV isqrt(UV n) {
UV root;
#if BITS_PER_WORD == 32
if (n >= UVCONST(4294836225)) return UVCONST(65535);
#else
if (n >= UVCONST(18446744065119617025)) return UVCONST(4294967295);
#endif
root = (UV) sqrt((double)n);
while (root*root > n) root--;
while ((root+1)*(root+1) <= n) root++;
return root;
}
#endif