int fmpz_moebius_mu(const fmpz_t n) { fmpz_factor_t factors; long i; int mu; if (fmpz_abs_fits_ui(n)) return n_moebius_mu(fmpz_get_ui(n)); fmpz_factor_init(factors); fmpz_factor(factors, n); mu = 1; for (i = 0; i < factors->num; i++) { if (fmpz_get_ui(factors->exp + i) != 1UL) { mu = 0; break; } } if (factors->num % 2) mu = -mu; fmpz_factor_clear(factors); return mu; }
static void check(fmpz_t x, int expected) { if (fmpz_abs_fits_ui(x) != expected) { printf("FAIL:\n\n"); printf("x = "), fmpz_print(x), printf("\n"); abort(); } }
/* Returns $\ord_p(N!)$. Note that since $N$ fits into an \code{unsigned long}, so does $\ord_p(N!)$ since $\ord_p{N!) \leq (N - 1) / (p - 1)$. */ ulong padic_val_fac_ui(ulong N, const fmpz_t p) { if (fmpz_abs_fits_ui(p)) { ulong q = fmpz_get_ui(p), s = 0, t = N; do { t /= q; s += t; } while (t); return s; } else { return 0; } }
void arith_euler_phi(fmpz_t res, const fmpz_t n) { fmpz_factor_t factors; fmpz_t t; ulong exp; slong i; if (fmpz_sgn(n) <= 0) { fmpz_zero(res); return; } if (fmpz_abs_fits_ui(n)) { fmpz_set_ui(res, n_euler_phi(fmpz_get_ui(n))); return; } fmpz_factor_init(factors); fmpz_factor(factors, n); fmpz_one(res); fmpz_init(t); for (i = 0; i < factors->num; i++) { fmpz_sub_ui(t, factors->p + i, UWORD(1)); fmpz_mul(res, res, t); exp = factors->exp[i]; if (exp != 1) { fmpz_pow_ui(t, factors->p + i, exp - UWORD(1)); fmpz_mul(res, res, t); } } fmpz_clear(t); fmpz_factor_clear(factors); }