void padic_val_fac(fmpz_t rop, const fmpz_t op, const fmpz_t p) { fmpz_t t, q, pow; if (fmpz_sgn(op) <= 0) { printf("Exception (padic_val_fac). op is non-positive.\n"); abort(); } fmpz_init(t); fmpz_init(q); fmpz_init(pow); fmpz_one(pow); do { fmpz_mul(pow, pow, p); fmpz_fdiv_q(q, op, pow); fmpz_add(t, t, q); } while (!fmpz_is_zero(q)); fmpz_swap(rop, t); fmpz_clear(t); fmpz_clear(q); fmpz_clear(pow); }
/* quotient of absolute value, rounded up */ static __inline__ void fmpz_cdiv_abs_q(fmpz_t q, const fmpz_t x, const fmpz_t y) { if (fmpz_sgn(x) == fmpz_sgn(y)) { fmpz_cdiv_q(q, x, y); } else { fmpz_fdiv_q(q, x, y); fmpz_neg(q, q); } }
mpz_class renf_elem_class::floor() const noexcept { fmpz_t tmp; fmpz_init(tmp); if (nf == nullptr) fmpz_fdiv_q(tmp, fmpq_numref(b), fmpq_denref(b)); else renf_elem_floor(tmp, a, nf->renf_t()); mpz_class z; fmpz_get_mpz(z.get_mpz_t(), tmp); fmpz_clear(tmp); return z; }
mpz_class renf_elem_class::ceil() const noexcept { fmpz_t tmp; fmpz_init(tmp); if (nf == nullptr) { fmpz_add(tmp, fmpq_numref(b), fmpq_denref(b)); fmpz_sub_ui(tmp, tmp, 1); fmpz_fdiv_q(tmp, tmp, fmpq_denref(b)); } else renf_elem_ceil(tmp, a, nf->renf_t()); mpz_class z; fmpz_get_mpz(z.get_mpz_t(), tmp); fmpz_clear(tmp); return z; }
int main() { slong iter; flint_rand_t state; flint_printf("floor...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 100000; iter++) { arb_t a, b; fmpq_t x; fmpz_t y; slong prec; arb_init(a); arb_init(b); fmpq_init(x); fmpz_init(y); arb_randtest(a, state, 1 + n_randint(state, 200), 10); arb_randtest(b, state, 1 + n_randint(state, 200), 10); prec = 2 + n_randint(state, 200); arb_get_rand_fmpq(x, state, a, 1 + n_randint(state, 200)); arb_floor(b, a, prec); fmpz_fdiv_q(y, fmpq_numref(x), fmpq_denref(x)); if (!arb_contains_fmpz(b, y)) { flint_printf("FAIL: containment\n\n"); flint_printf("a = "); arb_print(a); flint_printf("\n\n"); flint_printf("x = "); fmpq_print(x); flint_printf("\n\n"); flint_printf("b = "); arb_print(b); flint_printf("\n\n"); flint_printf("y = "); fmpz_print(y); flint_printf("\n\n"); abort(); } arb_floor(a, a, prec); if (!arb_equal(a, b)) { flint_printf("FAIL: aliasing\n\n"); flint_printf("a = "); arb_print(a); flint_printf("\n\n"); flint_printf("b = "); arb_print(b); flint_printf("\n\n"); abort(); } arb_clear(a); arb_clear(b); fmpq_clear(x); fmpz_clear(y); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }