int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("swap...."); fflush(stdout); for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, c; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(c, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest(b, state, n_randint(state, 100)); fmpz_mod_poly_set(c, b); fmpz_mod_poly_swap(a, b); result = (fmpz_mod_poly_equal(a, c)); if (!result) { flint_printf("FAIL:\n"); fmpz_mod_poly_print(a), flint_printf("\n\n"); fmpz_mod_poly_print(b), flint_printf("\n\n"); fmpz_mod_poly_print(c), flint_printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(c); fmpz_clear(p); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main(void) { int i, result; flint_rand_t state; printf("neg...."); fflush(stdout); flint_randinit(state); for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, c; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(c, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_neg(b, a); fmpz_mod_poly_neg(c, b); result = (fmpz_mod_poly_equal(a, c)); if (!result) { printf("FAIL:\n"); fmpz_mod_poly_print(a), printf("\n\n"); fmpz_mod_poly_print(b), printf("\n\n"); fmpz_mod_poly_print(c), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(c); fmpz_clear(p); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("zero...."); fflush(stdout); for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_zero(a); result = (fmpz_mod_poly_is_zero(a)); if (!result) { flint_printf("FAIL:\n"); flint_printf("a = "), fmpz_mod_poly_print(a), flint_printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_clear(p); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("divrem_f...."); fflush(stdout); /* Check q*b + r = a when gcd(lead(B),p) = 1, no aliasing */ for (i = 0; i < 5000; i++) { fmpz_t f, p; fmpz_mod_poly_t a, b, q, r, t; fmpz_init(f); fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(q, p); fmpz_mod_poly_init(r, p); fmpz_mod_poly_init(t, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest_not_zero(b, state, n_randint(state, 100) + 1); { fmpz_t d; fmpz *leadB = fmpz_mod_poly_lead(b); fmpz_init(d); fmpz_gcd(d, p, leadB); while (!fmpz_is_one(d)) { fmpz_divexact(leadB, leadB, d); fmpz_gcd(d, p, leadB); } fmpz_clear(d); } fmpz_mod_poly_divrem_f(f, q, r, a, b); fmpz_mod_poly_mul(t, q, b); fmpz_mod_poly_add(t, t, r); result = (fmpz_is_one(f) && fmpz_mod_poly_equal(a, t)); if (!result) { flint_printf("FAIL (divrem):\n"); flint_printf("p = "), fmpz_print(p), flint_printf("\n\n"); flint_printf("f = "), fmpz_print(f), flint_printf("\n\n"); flint_printf("a = "), fmpz_mod_poly_print(a), flint_printf("\n\n"); flint_printf("b = "), fmpz_mod_poly_print(b), flint_printf("\n\n"); flint_printf("q = "), fmpz_mod_poly_print(q), flint_printf("\n\n"); flint_printf("r = "), fmpz_mod_poly_print(r), flint_printf("\n\n"); flint_printf("t = "), fmpz_mod_poly_print(t), flint_printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(q); fmpz_mod_poly_clear(r); fmpz_mod_poly_clear(t); fmpz_clear(f); fmpz_clear(p); } /* Check f | p when gcd(lead(B),p) > 1 */ for (i = 0; i < 5000; i++) { fmpz_t f, p, q1, q2; fmpz_mod_poly_t a, b, q, r, t; fmpz_init(f); fmpz_init(p); fmpz_init(q1); fmpz_init(q2); fmpz_randtest_unsigned(q1, state, 2 * FLINT_BITS); fmpz_randtest_unsigned(q2, state, 2 * FLINT_BITS); fmpz_add_ui(q1, q1, 2); fmpz_add_ui(q2, q2, 2); fmpz_mul(p, q1, q2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(q, p); fmpz_mod_poly_init(r, p); fmpz_mod_poly_init(t, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest_not_zero(b, state, n_randint(state, 100) + 1); { fmpz_t d; fmpz *leadB = fmpz_mod_poly_lead(b); fmpz_init(d); fmpz_gcd(d, p, leadB); if (fmpz_is_one(d)) fmpz_set(leadB, q1); fmpz_clear(d); } fmpz_mod_poly_divrem_f(f, q, r, a, b); fmpz_mod_poly_mul(t, q, b); fmpz_mod_poly_add(t, t, r); result = (fmpz_cmp_ui(f, 1) > 0 && fmpz_cmp(f, p) < 0 && fmpz_divisible(p, f)); if (!result) { flint_printf("FAIL (factor):\n"); flint_printf("p = "), fmpz_print(p), flint_printf("\n\n"); flint_printf("f = "), fmpz_print(f), flint_printf("\n\n"); flint_printf("q1 = "), fmpz_print(q1), flint_printf("\n\n"); flint_printf("q2 = "), fmpz_print(q2), flint_printf("\n\n"); flint_printf("a = "), fmpz_mod_poly_print(a), flint_printf("\n\n"); flint_printf("b = "), fmpz_mod_poly_print(b), flint_printf("\n\n"); flint_printf("q = "), fmpz_mod_poly_print(q), flint_printf("\n\n"); flint_printf("r = "), fmpz_mod_poly_print(r), flint_printf("\n\n"); flint_printf("t = "), fmpz_mod_poly_print(t), flint_printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(q); fmpz_mod_poly_clear(r); fmpz_mod_poly_clear(t); fmpz_clear(f); fmpz_clear(p); fmpz_clear(q1); fmpz_clear(q2); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main() { slong n = 7; fmpz_t mod; fmpz* xs = _fmpz_vec_init(n); fmpz* ys = _fmpz_vec_init(n); fmpz_mod_poly_t res; fmpz_poly_t res2; fmpz_init(mod); fmpz_set_ui(mod, 11); fmpz_set_ui(xs, 0); fmpz_set_ui(xs+1, 1); fmpz_set_ui(xs+2, 2); fmpz_set_ui(xs+3, 3); fmpz_set_ui(xs+4, 4); fmpz_set_ui(xs+5, 5); fmpz_set_ui(xs+6, 6); fmpz_set_si(ys, 5); fmpz_set_si(ys+1, 1); fmpz_set_si(ys+2, 4); fmpz_set_si(ys+3, 8); fmpz_set_si(ys+4, 4); fmpz_set_si(ys+5, 1); fmpz_set_si(ys+6, 5); printf("xs :\n"); _fmpz_vec_print(xs,n); printf("\n"); printf("ys :\n"); _fmpz_vec_print(ys,n); printf("\n"); fmpz_mod_poly_init(res,mod); fmpz_mod_poly_interpolate_fmpz_vec_fast(res, xs, ys, n, mod); fmpz_poly_init(res2); fmpz_poly_interpolate_fmpz_vec(res2, xs, ys, n); printf("Nouvelle interpolation (f(xs) = ys) :\n"); fmpz_mod_poly_print(res); printf("\n"); fmpz* zs = _fmpz_vec_init(n); fmpz_poly_evaluate_fmpz_vec(zs, res2, xs, n); fmpz* as = _fmpz_vec_init(n); fmpz_mod_poly_evaluate_fmpz_vec(as, res, xs, n); printf("f(xs) :\n"); _fmpz_vec_print(as,n); printf("\n"); printf("FLINT :\n"); fmpz_poly_print(res2); printf("\n"); printf("f(xs) :\n"); _fmpz_vec_print(zs,n); printf("\n"); fmpz_clear(mod); _fmpz_vec_clear(xs,n); _fmpz_vec_clear(ys,n); return 0; }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("pow_trunc...."); fflush(stdout); /* Check aliasing */ for (i = 0; i < 10000; i++) { fmpz_mod_poly_t a, b, c; fmpz_t p; slong e, trunc; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(c, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 30)); e = n_randint(state, 20); trunc = n_randint(state, 30); fmpz_mod_poly_set(c, a); fmpz_mod_poly_pow_trunc(b, a, e, trunc); fmpz_mod_poly_pow_trunc(c, c, e, trunc); result = (fmpz_mod_poly_equal(b, c)); if (!result) { flint_printf("FAIL aliasing:\n"); flint_printf("a->length = %wd, p = %wu, exp = %wd, trunc = %wd\n", a->length, a->p, e, trunc); flint_printf("a:\n"); fmpz_mod_poly_print(a), flint_printf("\n\n"); flint_printf("b:\n"); fmpz_mod_poly_print(b), flint_printf("\n\n"); flint_printf("c:\n"); fmpz_mod_poly_print(c), flint_printf("\n\n"); abort(); } fmpz_clear(p); fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(c); } /* Check powering against naive method */ for (i = 0; i < 10000; i++) { fmpz_mod_poly_t a, b, c; fmpz_t p; slong e, trunc; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(c, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 30)); e = n_randint(state, 20); trunc = n_randint(state, 30); fmpz_mod_poly_pow_trunc(b, a, e, trunc); fmpz_mod_poly_pow(c, a, e); fmpz_mod_poly_truncate(c, trunc); result = (fmpz_mod_poly_equal(b, c) || (a->length == 0 && e == 0 && c->length == 1 && c->coeffs[0] == 1)); if (!result) { flint_printf("FAIL:\n"); flint_printf("a->length = %wd, p = %wu, exp = %wd, trunc = %wd\n", a->length, a->p, e, trunc); flint_printf("a:\n"); fmpz_mod_poly_print(a), flint_printf("\n\n"); flint_printf("b:\n"); fmpz_mod_poly_print(b), flint_printf("\n\n"); flint_printf("c:\n"); fmpz_mod_poly_print(c), flint_printf("\n\n"); abort(); } fmpz_clear(p); fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(c); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main(void) { int i, result; flint_rand_t state; printf("derivative...."); fflush(stdout); flint_randinit(state); /* Check aliasing */ for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, c; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(c, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_set(b, a); fmpz_mod_poly_derivative(c, b); fmpz_mod_poly_derivative(b, b); result = (fmpz_mod_poly_equal(b, c)); if (!result) { printf("FAIL (alias):\n"); fmpz_mod_poly_print(a), printf("\n\n"); fmpz_mod_poly_print(b), printf("\n\n"); fmpz_mod_poly_print(c), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(c); fmpz_clear(p); } /* Check constants have derivative zero */ for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a, b; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 2)); fmpz_mod_poly_derivative(b, a); result = (b->length == 0); if (!result) { printf("FAIL (da == 0):\n"); fmpz_mod_poly_print(a), printf("\n\n"); fmpz_mod_poly_print(b), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_clear(p); } /* Check (f g)' = f' g + f g' */ for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, c, d, lhs, rhs; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(c, p); fmpz_mod_poly_init(d, p); fmpz_mod_poly_init(lhs, p); fmpz_mod_poly_init(rhs, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest(b, state, n_randint(state, 100)); fmpz_mod_poly_mul(lhs, a, b); fmpz_mod_poly_derivative(lhs, lhs); fmpz_mod_poly_derivative(c, a); fmpz_mod_poly_derivative(d, b); fmpz_mod_poly_mul(c, c, b); fmpz_mod_poly_mul(d, a, d); fmpz_mod_poly_add(rhs, c, d); result = fmpz_mod_poly_equal(lhs, rhs); if (!result) { printf("FAIL (Leibniz):\n"); printf("a = "), fmpz_mod_poly_print(a), printf("\n\n"); printf("b = "), fmpz_mod_poly_print(b), printf("\n\n"); printf("(ab)' = "), fmpz_mod_poly_print(lhs), printf("\n\n"); printf("a'b + ab' = "), fmpz_mod_poly_print(rhs), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(c); fmpz_mod_poly_clear(d); fmpz_mod_poly_clear(lhs); fmpz_mod_poly_clear(rhs); fmpz_clear(p); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }
int main(void) { int i, result; flint_rand_t state; printf("div_basecase...."); fflush(stdout); flint_randinit(state); /* Compare to divrem_basecase */ for (i = 0; i < 5000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, q, q2, r2; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(q, p); fmpz_mod_poly_init(q2, p); fmpz_mod_poly_init(r2, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest_not_zero(b, state, n_randint(state, 100) + 1); { fmpz_t d; fmpz *leadB = fmpz_mod_poly_lead(b); fmpz_init(d); fmpz_gcd(d, p, leadB); while (!fmpz_is_one(d)) { fmpz_divexact(leadB, leadB, d); fmpz_gcd(d, p, leadB); } fmpz_clear(d); } fmpz_mod_poly_div_basecase(q, a, b); fmpz_mod_poly_divrem_basecase(q2, r2, a, b); result = (fmpz_mod_poly_equal(q, q2)); if (!result) { printf("FAIL:\n"); printf("p = "), fmpz_print(p), printf("\n\n"); printf("a = "), fmpz_mod_poly_print(a), printf("\n\n"); printf("b = "), fmpz_mod_poly_print(b), printf("\n\n"); printf("q = "), fmpz_mod_poly_print(q), printf("\n\n"); printf("q2 = "), fmpz_mod_poly_print(q2), printf("\n\n"); printf("r2 = "), fmpz_mod_poly_print(r2), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(q); fmpz_mod_poly_clear(q2); fmpz_mod_poly_clear(r2); fmpz_clear(p); } /* Alias a and q */ for (i = 0; i < 500; i++) { fmpz_t p; fmpz_mod_poly_t a, b, q; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(q, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest_not_zero(b, state, n_randint(state, 100) + 1); { fmpz_t d; fmpz *leadB = fmpz_mod_poly_lead(b); fmpz_init(d); fmpz_gcd(d, p, leadB); while (!fmpz_is_one(d)) { fmpz_divexact(leadB, leadB, d); fmpz_gcd(d, p, leadB); } fmpz_clear(d); } fmpz_mod_poly_div_basecase(q, a, b); fmpz_mod_poly_div_basecase(a, a, b); result = (fmpz_mod_poly_equal(q, a)); if (!result) { printf("FAIL:\n"); printf("p = "), fmpz_print(p), printf("\n\n"); printf("a = "), fmpz_mod_poly_print(a), printf("\n\n"); printf("b = "), fmpz_mod_poly_print(b), printf("\n\n"); printf("q = "), fmpz_mod_poly_print(q), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(q); fmpz_clear(p); } /* Alias b and q */ for (i = 0; i < 500; i++) { fmpz_t p; fmpz_mod_poly_t a, b, q; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(q, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest_not_zero(b, state, n_randint(state, 100) + 1); { fmpz_t d; fmpz *leadB = fmpz_mod_poly_lead(b); fmpz_init(d); fmpz_gcd(d, p, leadB); while (!fmpz_is_one(d)) { fmpz_divexact(leadB, leadB, d); fmpz_gcd(d, p, leadB); } fmpz_clear(d); } fmpz_mod_poly_div_basecase(q, a, b); fmpz_mod_poly_div_basecase(b, a, b); result = (fmpz_mod_poly_equal(q, b)); if (!result) { printf("FAIL:\n"); printf("p = "), fmpz_print(p), printf("\n\n"); printf("a = "), fmpz_mod_poly_print(a), printf("\n\n"); printf("b = "), fmpz_mod_poly_print(b), printf("\n\n"); printf("q = "), fmpz_mod_poly_print(q), printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(q); fmpz_clear(p); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }
FlintZZ_pX() { FlintZZ f_p(ZZ_p::modulus()); fmpz_mod_poly_init(value, f_p.value); }
void frob(const mpoly_t P, const ctx_t ctxFracQt, const qadic_t t1, const qadic_ctx_t Qq, prec_t *prec, const prec_t *prec_in, int verbose) { const padic_ctx_struct *Qp = &Qq->pctx; const fmpz *p = Qp->p; const long a = qadic_ctx_degree(Qq); const long n = P->n - 1; const long d = mpoly_degree(P, -1, ctxFracQt); const long b = gmc_basis_size(n, d); long i, j, k; /* Diagonal fibre */ padic_mat_t F0; /* Gauss--Manin Connection */ mat_t M; mon_t *bR, *bC; fmpz_poly_t r; /* Local solution */ fmpz_poly_mat_t C, Cinv; long vC, vCinv; /* Frobenius */ fmpz_poly_mat_t F; long vF; fmpz_poly_mat_t F1; long vF1; fmpz_poly_t cp; clock_t c0, c1; double c; if (verbose) { printf("Input:\n"); printf(" P = "), mpoly_print(P, ctxFracQt), printf("\n"); printf(" p = "), fmpz_print(p), printf("\n"); printf(" t1 = "), qadic_print_pretty(t1, Qq), printf("\n"); printf("\n"); fflush(stdout); } /* Step 1 {M, r} *********************************************************/ c0 = clock(); mat_init(M, b, b, ctxFracQt); fmpz_poly_init(r); gmc_compute(M, &bR, &bC, P, ctxFracQt); { fmpz_poly_t t; fmpz_poly_init(t); fmpz_poly_set_ui(r, 1); for (i = 0; i < M->m; i++) for (j = 0; j < M->n; j++) { fmpz_poly_lcm(t, r, fmpz_poly_q_denref( (fmpz_poly_q_struct *) mat_entry(M, i, j, ctxFracQt))); fmpz_poly_swap(r, t); } fmpz_poly_clear(t); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Gauss-Manin connection:\n"); printf(" r(t) = "), fmpz_poly_print_pretty(r, "t"), printf("\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } { qadic_t t; qadic_init2(t, 1); fmpz_poly_evaluate_qadic(t, r, t1, Qq); if (qadic_is_zero(t)) { printf("Exception (deformation_frob).\n"); printf("The resultant r evaluates to zero (mod p) at t1.\n"); abort(); } qadic_clear(t); } /* Precisions ************************************************************/ if (prec_in != NULL) { *prec = *prec_in; } else { deformation_precisions(prec, p, a, n, d, fmpz_poly_degree(r)); } if (verbose) { printf("Precisions:\n"); printf(" N0 = %ld\n", prec->N0); printf(" N1 = %ld\n", prec->N1); printf(" N2 = %ld\n", prec->N2); printf(" N3 = %ld\n", prec->N3); printf(" N3i = %ld\n", prec->N3i); printf(" N3w = %ld\n", prec->N3w); printf(" N3iw = %ld\n", prec->N3iw); printf(" N4 = %ld\n", prec->N4); printf(" m = %ld\n", prec->m); printf(" K = %ld\n", prec->K); printf(" r = %ld\n", prec->r); printf(" s = %ld\n", prec->s); printf("\n"); fflush(stdout); } /* Initialisation ********************************************************/ padic_mat_init2(F0, b, b, prec->N4); fmpz_poly_mat_init(C, b, b); fmpz_poly_mat_init(Cinv, b, b); fmpz_poly_mat_init(F, b, b); vF = 0; fmpz_poly_mat_init(F1, b, b); vF1 = 0; fmpz_poly_init(cp); /* Step 2 {F0} ***********************************************************/ { padic_ctx_t pctx_F0; fmpz *t; padic_ctx_init(pctx_F0, p, FLINT_MIN(prec->N4 - 10, 0), prec->N4, PADIC_VAL_UNIT); t = _fmpz_vec_init(n + 1); c0 = clock(); mpoly_diagonal_fibre(t, P, ctxFracQt); diagfrob(F0, t, n, d, prec->N4, pctx_F0, 0); padic_mat_transpose(F0, F0); c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Diagonal fibre:\n"); printf(" P(0) = {"), _fmpz_vec_print(t, n + 1), printf("}\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } _fmpz_vec_clear(t, n + 1); padic_ctx_clear(pctx_F0); } /* Step 3 {C, Cinv} ******************************************************/ /* Compute C as a matrix over Z_p[[t]]. A is the same but as a series of matrices over Z_p. Mt is the matrix -M^t, and Cinv is C^{-1}^t, the local solution of the differential equation replacing M by Mt. */ c0 = clock(); { const long K = prec->K; padic_mat_struct *A; gmde_solve(&A, K, p, prec->N3, prec->N3w, M, ctxFracQt); gmde_convert_soln(C, &vC, A, K, p); for(i = 0; i < K; i++) padic_mat_clear(A + i); free(A); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Local solution:\n"); printf(" Time for C = %f\n", c); fflush(stdout); } c0 = clock(); { const long K = (prec->K + (*p) - 1) / (*p); mat_t Mt; padic_mat_struct *Ainv; mat_init(Mt, b, b, ctxFracQt); mat_transpose(Mt, M, ctxFracQt); mat_neg(Mt, Mt, ctxFracQt); gmde_solve(&Ainv, K, p, prec->N3i, prec->N3iw, Mt, ctxFracQt); gmde_convert_soln(Cinv, &vCinv, Ainv, K, p); fmpz_poly_mat_transpose(Cinv, Cinv); fmpz_poly_mat_compose_pow(Cinv, Cinv, *p); for(i = 0; i < K; i++) padic_mat_clear(Ainv + i); free(Ainv); mat_clear(Mt, ctxFracQt); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf(" Time for C^{-1} = %f\n", c); printf("\n"); fflush(stdout); } /* Step 4 {F(t) := C(t) F(0) C(t^p)^{-1}} ********************************/ /* Computes the product C(t) F(0) C(t^p)^{-1} modulo (p^{N_2}, t^K). This is done by first computing the unit part of the product exactly over the integers modulo t^K. */ c0 = clock(); { fmpz_t pN; fmpz_poly_mat_t T; fmpz_init(pN); fmpz_poly_mat_init(T, b, b); for (i = 0; i < b; i++) { /* Find the unique k s.t. F0(i,k) is non-zero */ for (k = 0; k < b; k++) if (!fmpz_is_zero(padic_mat_entry(F0, i, k))) break; if (k == b) { printf("Exception (frob). F0 is singular.\n\n"); abort(); } for (j = 0; j < b; j++) { fmpz_poly_scalar_mul_fmpz(fmpz_poly_mat_entry(T, i, j), fmpz_poly_mat_entry(Cinv, k, j), padic_mat_entry(F0, i, k)); } } fmpz_poly_mat_mul(F, C, T); fmpz_poly_mat_truncate(F, prec->K); vF = vC + padic_mat_val(F0) + vCinv; /* Canonicalise (F, vF) */ { long v = fmpz_poly_mat_ord_p(F, p); if (v == LONG_MAX) { printf("ERROR (deformation_frob). F(t) == 0.\n"); abort(); } else if (v > 0) { fmpz_pow_ui(pN, p, v); fmpz_poly_mat_scalar_divexact_fmpz(F, F, pN); vF = vF + v; } } /* Reduce (F, vF) modulo p^{N2} */ fmpz_pow_ui(pN, p, prec->N2 - vF); fmpz_poly_mat_scalar_mod_fmpz(F, F, pN); fmpz_clear(pN); fmpz_poly_mat_clear(T); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Matrix for F(t):\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } /* Step 5 {G = r(t)^m F(t)} **********************************************/ c0 = clock(); { fmpz_t pN; fmpz_poly_t t; fmpz_init(pN); fmpz_poly_init(t); fmpz_pow_ui(pN, p, prec->N2 - vF); /* Compute r(t)^m mod p^{N2-vF} */ if (prec->denR == NULL) { fmpz_mod_poly_t _t; fmpz_mod_poly_init(_t, pN); fmpz_mod_poly_set_fmpz_poly(_t, r); fmpz_mod_poly_pow(_t, _t, prec->m); fmpz_mod_poly_get_fmpz_poly(t, _t); fmpz_mod_poly_clear(_t); } else { /* TODO: We don't really need a copy */ fmpz_poly_set(t, prec->denR); } fmpz_poly_mat_scalar_mul_fmpz_poly(F, F, t); fmpz_poly_mat_scalar_mod_fmpz(F, F, pN); /* TODO: This should not be necessary? */ fmpz_poly_mat_truncate(F, prec->K); fmpz_clear(pN); fmpz_poly_clear(t); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Analytic continuation:\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } /* Steps 6 and 7 *********************************************************/ if (a == 1) { /* Step 6 {F(1) = r(t_1)^{-m} G(t_1)} ********************************/ c0 = clock(); { const long N = prec->N2 - vF; fmpz_t f, g, t, pN; fmpz_init(f); fmpz_init(g); fmpz_init(t); fmpz_init(pN); fmpz_pow_ui(pN, p, N); /* f := \hat{t_1}, g := r(\hat{t_1})^{-m} */ _padic_teichmuller(f, t1->coeffs + 0, p, N); if (prec->denR == NULL) { _fmpz_mod_poly_evaluate_fmpz(g, r->coeffs, r->length, f, pN); fmpz_powm_ui(t, g, prec->m, pN); } else { _fmpz_mod_poly_evaluate_fmpz(t, prec->denR->coeffs, prec->denR->length, f, pN); } _padic_inv(g, t, p, N); /* F1 := g G(\hat{t_1}) */ for (i = 0; i < b; i++) for (j = 0; j < b; j++) { const fmpz_poly_struct *poly = fmpz_poly_mat_entry(F, i, j); const long len = poly->length; if (len == 0) { fmpz_poly_zero(fmpz_poly_mat_entry(F1, i, j)); } else { fmpz_poly_fit_length(fmpz_poly_mat_entry(F1, i, j), 1); _fmpz_mod_poly_evaluate_fmpz(t, poly->coeffs, len, f, pN); fmpz_mul(fmpz_poly_mat_entry(F1, i, j)->coeffs + 0, g, t); fmpz_mod(fmpz_poly_mat_entry(F1, i, j)->coeffs + 0, fmpz_poly_mat_entry(F1, i, j)->coeffs + 0, pN); _fmpz_poly_set_length(fmpz_poly_mat_entry(F1, i, j), 1); _fmpz_poly_normalise(fmpz_poly_mat_entry(F1, i, j)); } } vF1 = vF; fmpz_poly_mat_canonicalise(F1, &vF1, p); fmpz_clear(f); fmpz_clear(g); fmpz_clear(t); fmpz_clear(pN); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Evaluation:\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } } else { /* Step 6 {F(1) = r(t_1)^{-m} G(t_1)} ********************************/ c0 = clock(); { const long N = prec->N2 - vF; fmpz_t pN; fmpz *f, *g, *t; fmpz_init(pN); f = _fmpz_vec_init(a); g = _fmpz_vec_init(2 * a - 1); t = _fmpz_vec_init(2 * a - 1); fmpz_pow_ui(pN, p, N); /* f := \hat{t_1}, g := r(\hat{t_1})^{-m} */ _qadic_teichmuller(f, t1->coeffs, t1->length, Qq->a, Qq->j, Qq->len, p, N); if (prec->denR == NULL) { fmpz_t e; fmpz_init_set_ui(e, prec->m); _fmpz_mod_poly_compose_smod(g, r->coeffs, r->length, f, a, Qq->a, Qq->j, Qq->len, pN); _qadic_pow(t, g, a, e, Qq->a, Qq->j, Qq->len, pN); fmpz_clear(e); } else { _fmpz_mod_poly_reduce(prec->denR->coeffs, prec->denR->length, Qq->a, Qq->j, Qq->len, pN); _fmpz_poly_normalise(prec->denR); _fmpz_mod_poly_compose_smod(t, prec->denR->coeffs, prec->denR->length, f, a, Qq->a, Qq->j, Qq->len, pN); } _qadic_inv(g, t, a, Qq->a, Qq->j, Qq->len, p, N); /* F1 := g G(\hat{t_1}) */ for (i = 0; i < b; i++) for (j = 0; j < b; j++) { const fmpz_poly_struct *poly = fmpz_poly_mat_entry(F, i, j); const long len = poly->length; fmpz_poly_struct *poly2 = fmpz_poly_mat_entry(F1, i, j); if (len == 0) { fmpz_poly_zero(poly2); } else { _fmpz_mod_poly_compose_smod(t, poly->coeffs, len, f, a, Qq->a, Qq->j, Qq->len, pN); fmpz_poly_fit_length(poly2, 2 * a - 1); _fmpz_poly_mul(poly2->coeffs, g, a, t, a); _fmpz_mod_poly_reduce(poly2->coeffs, 2 * a - 1, Qq->a, Qq->j, Qq->len, pN); _fmpz_poly_set_length(poly2, a); _fmpz_poly_normalise(poly2); } } /* Now the matrix for p^{-1} F_p at t=t_1 is (F1, vF1). */ vF1 = vF; fmpz_poly_mat_canonicalise(F1, &vF1, p); fmpz_clear(pN); _fmpz_vec_clear(f, a); _fmpz_vec_clear(g, 2 * a - 1); _fmpz_vec_clear(t, 2 * a - 1); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Evaluation:\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } /* Step 7 {Norm} *****************************************************/ /* Computes the matrix for $q^{-1} F_q$ at $t = t_1$ as the product $F \sigma(F) \dotsm \sigma^{a-1}(F)$ up appropriate transpositions because our convention of columns vs rows is the opposite of that used by Gerkmann. Note that, in any case, transpositions do not affect the characteristic polynomial. */ c0 = clock(); { const long N = prec->N1 - a * vF1; fmpz_t pN; fmpz_poly_mat_t T; fmpz_init(pN); fmpz_poly_mat_init(T, b, b); fmpz_pow_ui(pN, p, N); fmpz_poly_mat_frobenius(T, F1, 1, p, N, Qq); _qadic_mat_mul(F1, F1, T, pN, Qq); for (i = 2; i < a; i++) { fmpz_poly_mat_frobenius(T, T, 1, p, N, Qq); _qadic_mat_mul(F1, F1, T, pN, Qq); } vF1 = a * vF1; fmpz_poly_mat_canonicalise(F1, &vF1, p); fmpz_clear(pN); fmpz_poly_mat_clear(T); } c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Norm:\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } } /* Step 8 {Reverse characteristic polynomial} ****************************/ c0 = clock(); deformation_revcharpoly(cp, F1, vF1, n, d, prec->N0, prec->r, prec->s, Qq); c1 = clock(); c = (double) (c1 - c0) / CLOCKS_PER_SEC; if (verbose) { printf("Reverse characteristic polynomial:\n"); printf(" p(T) = "), fmpz_poly_print_pretty(cp, "T"), printf("\n"); printf(" Time = %f\n", c); printf("\n"); fflush(stdout); } /* Clean up **************************************************************/ padic_mat_clear(F0); mat_clear(M, ctxFracQt); free(bR); free(bC); fmpz_poly_clear(r); fmpz_poly_mat_clear(C); fmpz_poly_mat_clear(Cinv); fmpz_poly_mat_clear(F); fmpz_poly_mat_clear(F1); fmpz_poly_clear(cp); }
int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("xgcd...."); fflush(stdout); /* Generic case, most likely co-prime arguments ******************************/ /* Compare with result from GCD and check correctness */ for (i = 0; i < 1000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, d, g, s, t, v, w; fmpz_init(p); fmpz_set_ui(p, n_randtest_prime(state, 0)); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(d, p); fmpz_mod_poly_init(g, p); fmpz_mod_poly_init(s, p); fmpz_mod_poly_init(t, p); fmpz_mod_poly_init(v, p); fmpz_mod_poly_init(w, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest(b, state, n_randint(state, 100)); fmpz_mod_poly_gcd(d, a, b); fmpz_mod_poly_xgcd(g, s, t, a, b); fmpz_mod_poly_mul(v, s, a); fmpz_mod_poly_mul(w, t, b); fmpz_mod_poly_add(w, v, w); result = (fmpz_mod_poly_equal(d, g) && fmpz_mod_poly_equal(g, w)); if (!result) { flint_printf("FAIL:\n"); fmpz_mod_poly_print(a), flint_printf("\n\n"); fmpz_mod_poly_print(b), flint_printf("\n\n"); fmpz_mod_poly_print(d), flint_printf("\n\n"); fmpz_mod_poly_print(g), flint_printf("\n\n"); fmpz_mod_poly_print(s), flint_printf("\n\n"); fmpz_mod_poly_print(t), flint_printf("\n\n"); fmpz_mod_poly_print(v), flint_printf("\n\n"); fmpz_mod_poly_print(w), flint_printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(d); fmpz_mod_poly_clear(g); fmpz_mod_poly_clear(s); fmpz_mod_poly_clear(t); fmpz_mod_poly_clear(v); fmpz_mod_poly_clear(w); fmpz_clear(p); } /* Special case, arguments share a factor ********************************/ /* Compare with result from GCD and check correctness */ for (i = 0; i < 1000; i++) { fmpz_t p; fmpz_mod_poly_t a, b, d, f, g, s, t, v, w; fmpz_init(p); fmpz_set_ui(p, n_randtest_prime(state, 0)); fmpz_mod_poly_init(a, p); fmpz_mod_poly_init(b, p); fmpz_mod_poly_init(d, p); fmpz_mod_poly_init(f, p); fmpz_mod_poly_init(g, p); fmpz_mod_poly_init(s, p); fmpz_mod_poly_init(t, p); fmpz_mod_poly_init(v, p); fmpz_mod_poly_init(w, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_randtest(b, state, n_randint(state, 100)); fmpz_mod_poly_randtest(f, state, n_randint(state, 20)); fmpz_mod_poly_mul(a, a, f); fmpz_mod_poly_mul(b, b, f); fmpz_mod_poly_gcd(d, a, b); fmpz_mod_poly_xgcd(g, s, t, a, b); fmpz_mod_poly_mul(v, s, a); fmpz_mod_poly_mul(w, t, b); fmpz_mod_poly_add(w, v, w); result = (fmpz_mod_poly_equal(d, g) && fmpz_mod_poly_equal(g, w)); if (!result) { flint_printf("FAIL:\n"); fmpz_mod_poly_print(a), flint_printf("\n\n"); fmpz_mod_poly_print(b), flint_printf("\n\n"); fmpz_mod_poly_print(d), flint_printf("\n\n"); fmpz_mod_poly_print(f), flint_printf("\n\n"); fmpz_mod_poly_print(g), flint_printf("\n\n"); fmpz_mod_poly_print(s), flint_printf("\n\n"); fmpz_mod_poly_print(t), flint_printf("\n\n"); fmpz_mod_poly_print(v), flint_printf("\n\n"); fmpz_mod_poly_print(w), flint_printf("\n\n"); abort(); } fmpz_mod_poly_clear(a); fmpz_mod_poly_clear(b); fmpz_mod_poly_clear(d); fmpz_mod_poly_clear(f); fmpz_mod_poly_clear(g); fmpz_mod_poly_clear(s); fmpz_mod_poly_clear(t); fmpz_mod_poly_clear(v); fmpz_mod_poly_clear(w); fmpz_clear(p); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int fmpz_mod_poly_is_irreducible_ddf(const fmpz_mod_poly_t poly) { fmpz_mod_poly_t f, v, vinv, reducedH0, tmp; fmpz_mod_poly_t *h, *H, *I; slong i, j, l, m, n, d; fmpz_t p; double beta; int result = 1; n = fmpz_mod_poly_degree(poly); if (n < 2) return 1; if (!fmpz_mod_poly_is_squarefree(poly)) return 0; beta = 0.5 * (1. - (log(2) / log(n))); l = ceil(pow(n, beta)); m = ceil(0.5 * n / l); /* initialization */ fmpz_init(p); fmpz_set(p, &poly->p); fmpz_mod_poly_init(f, p); fmpz_mod_poly_init(v, p); fmpz_mod_poly_init(vinv, p); fmpz_mod_poly_init(reducedH0, p); fmpz_mod_poly_init(tmp, p); if (!(h = flint_malloc((2 * m + l + 1) * sizeof(fmpz_mod_poly_struct)))) { flint_printf("Exception (fmpz_mod_poly_is_irreducible_ddf): \n"); flint_printf("Not enough memory.\n"); abort(); } H = h + (l + 1); I = H + m; for (i = 0; i < l + 1; i++) fmpz_mod_poly_init(h[i], p); for (i = 0; i < m; i++) { fmpz_mod_poly_init(H[i], p); fmpz_mod_poly_init(I[i], p); } fmpz_mod_poly_make_monic(v, poly); fmpz_mod_poly_reverse (vinv, v, v->length); fmpz_mod_poly_inv_series_newton (vinv, vinv, v->length); /* compute baby steps: h[i]=x^{p^i}mod v */ fmpz_mod_poly_set_coeff_ui(h[0], 1, 1); for (i = 1; i < l + 1; i++) fmpz_mod_poly_powmod_fmpz_binexp_preinv(h[i], h[i - 1], p, v, vinv); /* compute coarse distinct-degree factorisation */ fmpz_mod_poly_set(H[0], h[l]); fmpz_mod_poly_set(reducedH0, H[0]); d = 1; for (j = 0; j < m; j++) { /* compute giant steps: H[i]=x^{p^(li)}mod v */ if (j > 0) { fmpz_mod_poly_rem (reducedH0, reducedH0, v); fmpz_mod_poly_rem (tmp, H[j-1], v); fmpz_mod_poly_compose_mod_brent_kung_preinv(H[j], tmp, reducedH0, v, vinv); } /* compute interval polynomials */ fmpz_mod_poly_set_coeff_ui(I[j], 0, 1); for (i = l - 1; (i >= 0) && (2*d <= v->length - 1); i--, d++) { fmpz_mod_poly_rem(tmp, h[i], v); fmpz_mod_poly_sub(tmp, H[j], tmp); fmpz_mod_poly_mulmod_preinv (I[j], tmp, I[j], v, vinv); } /* compute F_j=f^{[j*l+1]} * ... * f^{[j*l+l]} */ /* F_j is stored on the place of I_j */ fmpz_mod_poly_gcd(I[j], v, I[j]); if (I[j]->length > 1) { result = 0; break; } } fmpz_clear(p); fmpz_mod_poly_clear(f); fmpz_mod_poly_clear(reducedH0); fmpz_mod_poly_clear(v); fmpz_mod_poly_clear(vinv); fmpz_mod_poly_clear(tmp); for (i = 0; i < l + 1; i++) fmpz_mod_poly_clear(h[i]); for (i = 0; i < m; i++) { fmpz_mod_poly_clear(H[i]); fmpz_mod_poly_clear(I[i]); } flint_free(h); return result; }
int main(void) { int iter; FLINT_TEST_INIT(state); flint_printf("factor_squarefree...."); fflush(stdout); for (iter = 0; iter < 300; iter++) { int result = 1; fmpz_mod_poly_t pol1, poly, quot, rem; fmpz_mod_poly_factor_t res; fmpz_t modulus; slong exp[5], prod1; slong length, i, j, num; fmpz_init_set_ui(modulus, n_randtest_prime(state, 0)); fmpz_mod_poly_init(pol1, modulus); fmpz_mod_poly_init(poly, modulus); fmpz_mod_poly_init(quot, modulus); fmpz_mod_poly_init(rem, modulus); fmpz_mod_poly_zero(pol1); fmpz_mod_poly_set_coeff_ui(pol1, 0, 1); length = n_randint(state, 7) + 2; do { fmpz_mod_poly_randtest(poly, state, length); fmpz_mod_poly_make_monic(poly, poly); } while ((!fmpz_mod_poly_is_irreducible(poly)) || (poly->length < 2)); exp[0] = n_randprime(state, 5, 0); prod1 = exp[0]; for (i = 0; i < exp[0]; i++) fmpz_mod_poly_mul(pol1, pol1, poly); num = n_randint(state, 5) + 1; for (i = 1; i < num; i++) { do { length = n_randint(state, 7) + 2; fmpz_mod_poly_randtest(poly, state, length); if (poly->length) { fmpz_mod_poly_make_monic(poly, poly); fmpz_mod_poly_divrem(quot, rem, pol1, poly); } } while ((!fmpz_mod_poly_is_irreducible(poly)) || (poly->length < 2) || (rem->length == 0)); do exp[i] = n_randprime(state, 5, 0); while (prod1 % exp[i] == 0); prod1 *= exp[i]; for (j = 0; j < exp[i]; j++) fmpz_mod_poly_mul(pol1, pol1, poly); } fmpz_mod_poly_factor_init(res); fmpz_mod_poly_factor_squarefree(res, pol1); result &= (res->num == num); if (result) { ulong prod2 = 1; for (i = 0; i < num; i++) prod2 *= res->exp[i]; result &= (prod1 == prod2); } if (!result) { flint_printf("Error: exp don't match. Modulus = "); fmpz_print(modulus); flint_printf("\n"); for (i = 0; i < res->num; i++) flint_printf("%wd ", res->exp[i]); flint_printf("\n"); for (i = 0; i < num; i++) flint_printf("%wd ", exp[i]); flint_printf("\n"); abort(); } fmpz_clear(modulus); fmpz_mod_poly_clear(quot); fmpz_mod_poly_clear(rem); fmpz_mod_poly_clear(pol1); fmpz_mod_poly_clear(poly); fmpz_mod_poly_factor_clear(res); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main(void) { int i, result; flint_rand_t state; printf("evaluate_fmpz...."); fflush(stdout); flint_randinit(state); /* Check aliasing */ for (i = 0; i < 10000; i++) { fmpz_t a, b, p; fmpz_mod_poly_t f; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_init(a); fmpz_init(b); fmpz_randm(a, state, p); fmpz_mod_poly_init(f, p); fmpz_mod_poly_randtest(f, state, n_randint(state, 100)); fmpz_mod_poly_evaluate_fmpz(b, f, a); fmpz_mod_poly_evaluate_fmpz(a, f, a); result = (fmpz_equal(a, b)); if (!result) { printf("FAIL:\n"); fmpz_mod_poly_print(f), printf("\n\n"); fmpz_print(a), printf("\n\n"); fmpz_print(b), printf("\n\n"); abort(); } fmpz_mod_poly_clear(f); fmpz_clear(a); fmpz_clear(b); fmpz_clear(p); } /* Check that the result agrees with Z[X] */ for (i = 0; i < 10000; i++) { fmpz_t a, b, c, p; fmpz_mod_poly_t f; fmpz_poly_t g; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_init(a); fmpz_init(b); fmpz_init(c); fmpz_mod_poly_init(f, p); fmpz_poly_init(g); fmpz_randm(a, state, p); fmpz_mod_poly_randtest(f, state, n_randint(state, 100)); fmpz_mod_poly_get_fmpz_poly(g, f); fmpz_mod_poly_evaluate_fmpz(b, f, a); fmpz_poly_evaluate_fmpz(c, g, a); fmpz_mod(c, c, p); result = (fmpz_equal(b, c)); if (!result) { printf("FAIL (cmp with fmpz_poly):\n"); fmpz_mod_poly_print(f), printf("\n\n"); fmpz_poly_print(g), printf("\n\n"); fmpz_print(a), printf("\n\n"); fmpz_print(b), printf("\n\n"); fmpz_print(c), printf("\n\n"); abort(); } fmpz_clear(a); fmpz_clear(b); fmpz_clear(c); fmpz_clear(p); fmpz_mod_poly_clear(f); fmpz_poly_clear(g); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }
int main(void) { int i; flint_rand_t state; printf("init/init2/realloc/clear...."); fflush(stdout); flint_randinit(state); for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init2(a, p, n_randint(state, 100)); fmpz_mod_poly_clear(a); fmpz_clear(p); } for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init2(a, p, n_randint(state, 100)); fmpz_mod_poly_realloc(a, n_randint(state, 100)); fmpz_mod_poly_clear(a); fmpz_clear(p); } for (i = 0; i < 10000; i++) { fmpz_t p; fmpz_mod_poly_t a; fmpz_init(p); fmpz_randtest_unsigned(p, state, 2 * FLINT_BITS); fmpz_add_ui(p, p, 2); fmpz_mod_poly_init(a, p); fmpz_mod_poly_randtest(a, state, n_randint(state, 100)); fmpz_mod_poly_clear(a); fmpz_clear(p); } flint_randclear(state); _fmpz_cleanup(); printf("PASS\n"); return 0; }