int main(void) { int i; flint_rand_t state; flint_randinit(state); printf("dot_ptr...."); fflush(stdout); for (i = 0; i < 10000; i++) { long len; nmod_t mod; mp_limb_t m, res, res2; mp_ptr x, y; mp_ptr * z; int limbs1; long j, offset; len = n_randint(state, 1000) + 1; m = n_randtest_not_zero(state); offset = n_randint(state, 10); nmod_init(&mod, m); x = _nmod_vec_init(len); y = _nmod_vec_init(len); z = flint_malloc(sizeof(mp_ptr) * len); _nmod_vec_randtest(x, state, len, mod); _nmod_vec_randtest(y, state, len, mod); for (j = 0; j < len; j++) z[j] = &y[j] + offset; limbs1 = _nmod_vec_dot_bound_limbs(len, mod); res = _nmod_vec_dot_ptr(x, z, -offset, len, mod, limbs1); res2 = _nmod_vec_dot(x, y, len, mod, limbs1); if (res != res2) { printf("FAIL:\n"); printf("m = %lu\n", m); printf("len = %ld\n", len); printf("limbs1 = %d\n", limbs1); abort(); } _nmod_vec_clear(x); _nmod_vec_clear(y); flint_free(z); } flint_randclear(state); printf("PASS\n"); return 0; }
void nmod_poly_randtest_monic(nmod_poly_t poly, flint_rand_t state, slong len) { nmod_poly_fit_length(poly, len); _nmod_vec_randtest(poly->coeffs, state, len - 1, poly->mod); poly->coeffs[len - 1] = 1; poly->length = len; }
void nmod_poly_randtest(nmod_poly_t poly, flint_rand_t state, slong len) { nmod_poly_fit_length(poly, len); _nmod_vec_randtest(poly->coeffs, state, len, poly->mod); poly->length = len; _nmod_poly_normalise(poly); }
void hmod_mat_randtest(hmod_mat_t mat, flint_rand_t state) { long i, n; mp_ptr tmp; n = mat->r * mat->c; tmp = _nmod_vec_init(n); _nmod_vec_randtest(tmp, state, n, mat->mod); for (i = 0; i < n; i++) mat->entries[i] = tmp[i]; _nmod_vec_clear(tmp); }
/*------------------------------------------------------------*/ void check(int opt){ long i; flint_rand_t state; flint_randinit(state); for (i = 1; i < 1000; i+=10){ mp_limb_t n = 0; while (n < i) n = n_randtest_prime(state, 0); nmod_poly_t P; mp_ptr roots; nmod_poly_t A; nmod_poly_init(P, n); roots = _nmod_vec_init(i); _nmod_vec_randtest(roots, state, i, P->mod); nmod_poly_product_roots_nmod_vec(P, roots, i); nmod_poly_init(A, n); nmod_poly_rand_dense(A, state, i); if (opt == 1){ mp_limb_t tr1 = nmod_poly_trace(A, P); mp_limb_t tr2 = 0; long j; for (j = 0; j < i; j++) tr2 = nmod_add(tr2, nmod_poly_evaluate_nmod(A, roots[j]), P->mod); sage_output_init(P->mod); sage_output_assign_poly(P, "P"); printf("tr1 = %lu\n", tr1); printf("tr2 = %lu\n", tr2); printf("tr1 == tr2\n"); } else{ double t, u; long j; t = util_gettime(); for (j = 0; j < 10000; j++) nmod_poly_trace(A, P); t = util_gettime() - t; nmod_poly_t tmp1, tmp2, tmp3; nmod_poly_init(tmp1, n); nmod_poly_init(tmp2, n); nmod_poly_init(tmp3, n); nmod_poly_rand_dense(tmp1, state, i); nmod_poly_rand_dense(tmp2, state, i); u = util_gettime(); for (j = 0; j < 10000; j++) nmod_poly_mul(tmp3, tmp1, tmp2); u = util_gettime() - u; nmod_poly_clear(tmp1); nmod_poly_clear(tmp2); nmod_poly_clear(tmp3); printf("%lu %f %f\n", i, t, u); } nmod_poly_clear(P); nmod_poly_clear(A); _nmod_vec_clear(roots); } }