void padic_poly_sub(padic_poly_t f, const padic_poly_t g, const padic_poly_t h, const padic_ctx_t ctx) { const slong lenG = g->length; const slong lenH = h->length; const slong lenF = FLINT_MAX(lenG, lenH); if (lenG == 0) { padic_poly_neg(f, h, ctx); return; } if (lenH == 0) { padic_poly_set(f, g, ctx); return; } if ((lenG == 0 && lenH == 0) || (FLINT_MIN(g->val, h->val) >= f->N)) { padic_poly_zero(f); return; } padic_poly_fit_length(f, lenF); _padic_poly_sub(f->coeffs, &(f->val), f->N, g->coeffs, g->val, lenG, g->N, h->coeffs, h->val, lenH, h->N, ctx); _padic_poly_set_length(f, lenF); _padic_poly_normalise(f); }
int qadic_exp_balanced(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx) { const slong N = qadic_prec(rop); const slong v = op->val; const fmpz *p = (&ctx->pctx)->p; if (padic_poly_is_zero(op)) { padic_poly_one(rop); return 1; } if ((*p == WORD(2) && v <= 1) || (v <= 0)) { return 0; } else { if (v < N) { const slong d = qadic_ctx_degree(ctx); fmpz_t pN; int alloc; alloc = _padic_ctx_pow_ui(pN, N, &ctx->pctx); padic_poly_fit_length(rop, d); _qadic_exp_balanced(rop->coeffs, op->coeffs, v, op->length, ctx->a, ctx->j, ctx->len, p, N, pN); rop->val = 0; _padic_poly_set_length(rop, d); _padic_poly_normalise(rop); if (alloc) fmpz_clear(pN); } else { padic_poly_one(rop); } return 1; } }
void padic_poly_randtest_val(padic_poly_t f, flint_rand_t state, slong val, slong len, const padic_ctx_t ctx) { const slong N = padic_poly_prec(f); if (len == 0) return; if (val >= N) { padic_poly_zero(f); } else { slong i; fmpz_t pow; int alloc; f->val = val; padic_poly_fit_length(f, len); alloc = _padic_ctx_pow_ui(pow, N - f->val, ctx); for (i = 0; i < len; i++) fmpz_randm(f->coeffs + i, state, pow); if (alloc) fmpz_clear(pow); for (i = 0; i < len; i++) if (!fmpz_divisible(f->coeffs + i, ctx->p)) break; if (i == len) fmpz_one(f->coeffs + n_randint(state, len)); _padic_poly_set_length(f, len); _padic_poly_normalise(f); padic_poly_reduce(f, ctx); } }
static void fmpz_poly_evaluate_qadic(qadic_t rop, const fmpz_poly_t op1, const qadic_t op2, const qadic_ctx_t ctx) { const long N = qadic_prec(rop); const long d = qadic_ctx_degree(ctx); if (N <= 0 || op2->val != 0 || rop == op2) { printf("Exception (fmpz_poly_evaluate_qadic):\n"); printf("Currently assumes that N > 0 and op2->val == 0, \n"); printf("and does not support aliasing.\n"); abort(); } if (fmpz_poly_is_zero(op1)) { qadic_zero(rop); } else if (qadic_is_zero(op2)) { padic_poly_set_fmpz(rop, op1->coeffs + 0, &ctx->pctx); } else { fmpz_t pN; fmpz_init(pN); fmpz_pow_ui(pN, (&ctx->pctx)->p, N); padic_poly_fit_length(rop, d); _fmpz_mod_poly_compose_smod(rop->coeffs, op1->coeffs, op1->length, op2->coeffs, op2->length, ctx->a, ctx->j, ctx->len, pN); _padic_poly_set_length(rop, d); qadic_reduce(rop, ctx); fmpz_clear(pN); } }
void padic_poly_randtest_not_zero(padic_poly_t f, flint_rand_t state, slong len, const padic_ctx_t ctx) { slong i; if (len == 0) { flint_printf("Exception (padic_poly_randtest_not_zero). len == 0.\n"); abort(); } padic_poly_randtest(f, state, len, ctx); for (i = 0; !padic_poly_is_zero(f) && (i < 10); i++) padic_poly_randtest(f, state, len, ctx); if (padic_poly_is_zero(f)) { padic_poly_fit_length(f, 1); _padic_poly_set_length(f, 1); fmpz_one(f->coeffs + 0); f->val = f->N - 1; } }
int qadic_exp(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx) { const slong N = qadic_prec(rop); const slong v = op->val; const fmpz *p = (&ctx->pctx)->p; if (padic_poly_is_zero(op)) { padic_poly_one(rop); return 1; } if ((*p == WORD(2) && v <= 1) || (v <= 0)) { return 0; } else { if (v < N) { const slong d = qadic_ctx_degree(ctx); fmpz *t; fmpz_t pN; int alloc; alloc = _padic_ctx_pow_ui(pN, N, &ctx->pctx); if (rop == op) { t = _fmpz_vec_init(2 * d - 1); } else { padic_poly_fit_length(rop, 2 * d - 1); t = rop->coeffs; } _qadic_exp(t, op->coeffs, v, op->length, ctx->a, ctx->j, ctx->len, p, N, pN); rop->val = 0; if (rop == op) { _fmpz_vec_clear(rop->coeffs, rop->alloc); rop->coeffs = t; rop->alloc = 2 * d - 1; rop->length = d; } _padic_poly_set_length(rop, d); _padic_poly_normalise(rop); if (alloc) fmpz_clear(pN); } else { padic_poly_one(rop); } return 1; } }
int main(void) { int i, result; padic_ctx_t ctx; fmpz_t p; slong N; FLINT_TEST_INIT(state); flint_printf("inv_series... "); fflush(stdout); /* Check aliasing */ for (i = 0; i < 1000; i++) { padic_poly_t a, b, c; slong n; fmpz_init_set_ui(p, n_randtest_prime(state, 0)); N = n_randint(state, PADIC_TEST_PREC_MAX - PADIC_TEST_PREC_MIN) + PADIC_TEST_PREC_MIN; padic_ctx_init(ctx, p, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), PADIC_SERIES); padic_poly_init2(a, 0, N); padic_poly_init2(b, 0, N); padic_poly_init2(c, 0, N); padic_poly_randtest(a, state, n_randint(state, 100) + 1, ctx); if (fmpz_is_zero(a->coeffs)) { fmpz_randtest_not_zero(a->coeffs, state, 20); fmpz_remove(a->coeffs, a->coeffs, p); padic_poly_reduce(a, ctx); } else fmpz_remove(a->coeffs, a->coeffs, p); padic_poly_set(b, a, ctx); n = n_randint(state, 100) + 1; padic_poly_inv_series(c, b, n, ctx); padic_poly_inv_series(b, b, n, ctx); result = (padic_poly_equal(b, c) && padic_poly_is_reduced(b, ctx)); if (!result) { flint_printf("FAIL:\n"); flint_printf("a = "), padic_poly_print(a, ctx), flint_printf("\n\n"); flint_printf("b = "), padic_poly_print(b, ctx), flint_printf("\n\n"); flint_printf("c = "), padic_poly_print(c, ctx), flint_printf("\n\n"); abort(); } padic_poly_clear(a); padic_poly_clear(b); padic_poly_clear(c); padic_ctx_clear(ctx); fmpz_clear(p); } /* Check correctness: If ord_p(a) = v then we can compute b = a^{-1} mod p^N and we will have a b = 1 mod p^{N-|v|}. Thus, require that N - |v| > 0. */ for (i = 0; i < 1000; i++) { padic_poly_t a, b, c; slong n, N2; fmpz_init_set_ui(p, n_randtest_prime(state, 0)); N = n_randint(state, PADIC_TEST_PREC_MAX - 1) + 1; padic_ctx_init(ctx, p, FLINT_MAX(0, N-10), FLINT_MAX(0, N+10), PADIC_SERIES); padic_poly_init2(a, 0, N); padic_poly_init2(b, 0, N); { slong i, len = n_randint(state, 10) + 1; int alloc; fmpz_t pow; padic_poly_fit_length(a, len); _padic_poly_set_length(a, len); a->val = n_randint(state, N); if (n_randint(state, 2)) a->val = - a->val; alloc = _padic_ctx_pow_ui(pow, N - a->val, ctx); for (i = 0; i < len; i++) fmpz_randm(a->coeffs + i, state, pow); while (fmpz_is_zero(a->coeffs)) fmpz_randm(a->coeffs, state, pow); fmpz_remove(a->coeffs, a->coeffs, p); _padic_poly_normalise(a); if (alloc) fmpz_clear(pow); } n = n_randint(state, 100) + 1; N2 = N - FLINT_ABS(a->val); padic_poly_init2(c, 0, N2); padic_poly_inv_series(b, a, n, ctx); padic_poly_mul(c, a, b, ctx); padic_poly_truncate(c, n, p); result = (padic_poly_is_one(c) && padic_poly_is_reduced(b, ctx)); if (!result) { flint_printf("FAIL:\n"); flint_printf("a = "), padic_poly_print(a, ctx), flint_printf("\n\n"); flint_printf("b = "), padic_poly_print(b, ctx), flint_printf("\n\n"); flint_printf("c = "), padic_poly_print(c, ctx), flint_printf("\n\n"); flint_printf("N = %wd\n", N); flint_printf("N2 = %wd\n", N2); abort(); } padic_poly_clear(a); padic_poly_clear(b); padic_poly_clear(c); padic_ctx_clear(ctx); fmpz_clear(p); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return EXIT_SUCCESS; }