std::vector<mpz_class> renf_elem_class::num_vector() const noexcept { mpz_class x; std::vector<mpz_class> res; if (nf == nullptr) { fmpz_get_mpz(x.__get_mp(), fmpq_numref(b)); res.push_back(x); } else { fmpq_poly_t f; fmpq_poly_init(f); nf_elem_get_fmpq_poly(f, a->elem, nf->renf_t()->nf); for (size_t i = 0; i < fmpq_poly_length(f); i++) { fmpz_get_mpz(x.__get_mp(), fmpq_poly_numref(f) + i); res.push_back(x); } size_t deg = fmpq_poly_degree(nf->renf_t()->nf->pol); for (size_t i = fmpq_poly_length(f); i < deg; i++) res.push_back(mpz_class(0)); fmpq_poly_clear(f); } return res; }
mpz_class renf_elem_class::num() const noexcept { mpz_class x; if (nf == nullptr) { fmpz_get_mpz(x.__get_mp(), fmpq_numref(b)); return x; } else if (nf->renf_t()->nf->flag & NF_LINEAR) fmpz_get_mpz(x.__get_mp(), LNF_ELEM_NUMREF(a->elem)); else if (nf->renf_t()->nf->flag & NF_QUADRATIC) { assert(fmpz_is_zero(QNF_ELEM_NUMREF(a->elem) + 1) && "renf_elem_class not a rational"); fmpz_get_mpz(x.__get_mp(), QNF_ELEM_NUMREF(a->elem)); } else { if (fmpq_poly_length(NF_ELEM(a->elem)) == 0) mpz_set_si(x.__get_mp(), 0); else { assert(fmpq_poly_length(NF_ELEM(a->elem)) == 1 && "renf_elem_class not a rational"); fmpz_get_mpz(x.__get_mp(), NF_ELEM_NUMREF(a->elem)); } } return x; }
void _nf_elem_mod_fmpz(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf) { if (nf_elem_is_zero(a, nf)) { nf_elem_zero(res, nf); return; } if (nf->flag & NF_LINEAR) { fmpz_mod(LNF_ELEM_NUMREF(res), LNF_ELEM_NUMREF(a), mod); fmpz_one(LNF_ELEM_DENREF(res)); } else if (nf->flag & NF_QUADRATIC) { _fmpz_vec_scalar_mod_fmpz(QNF_ELEM_NUMREF(res), QNF_ELEM_NUMREF(a), 3, mod); fmpz_one(QNF_ELEM_DENREF(res)); } else { fmpq_poly_fit_length(NF_ELEM(res), fmpq_poly_length(NF_ELEM(a))); _fmpq_poly_set_length(NF_ELEM(res), fmpq_poly_length(NF_ELEM(a))); _fmpz_vec_scalar_mod_fmpz(NF_ELEM(res)->coeffs, NF_ELEM(a)->coeffs, fmpq_poly_length(NF_ELEM(a)), mod); fmpz_one(NF_ELEM_DENREF(res)); } nf_elem_canonicalise(res, nf); }
void fmpz_poly_disc_gauss_rounding(fmpz_poly_t rop, const fmpq_poly_t x, const mpfr_t r_f, gmp_randstate_t randstate) { mpfr_t xi; mpfr_init2(xi, mpfr_get_prec(r_f)); mpf_t xi_f; mpf_init2(xi_f, mpfr_get_prec(r_f)); mpq_t xi_q; mpq_init(xi_q); mpz_t s_z; mpz_init(s_z); const long n = fmpq_poly_length(x); const size_t tau = (ceil(2*sqrt(log2((double)n))) > 3) ? ceil(2*sqrt(log2((double)n))) : 3; fmpz_poly_zero(rop); for(int i=0; i<n; i++) { fmpq_poly_get_coeff_mpq(xi_q, x, i); mpf_set_q(xi_f, xi_q); mpfr_set_f(xi, xi_f, MPFR_RNDN); dgs_disc_gauss_mp_t *D = dgs_disc_gauss_mp_init(r_f, xi, tau, DGS_DISC_GAUSS_UNIFORM_ONLINE); D->call(s_z, D, randstate); dgs_disc_gauss_mp_clear(D); fmpz_poly_set_coeff_mpz(rop, i, s_z); } mpz_clear(s_z); mpq_clear(xi_q); mpf_clear(xi_f); mpfr_clear(xi); }
void check_renf(renf_t nf) { arb_ptr a; arb_t b; a = nf->emb; if (fmpq_poly_length(nf->nf->pol) != fmpz_poly_length(nf->der) + 1) { printf("FAIL:\n"); printf("uninitalized derivative"); fflush(stdout); abort(); } arb_init(b); fmpq_poly_evaluate_arb(b, nf->nf->pol, a, nf->prec); if (!arb_contains_zero(b)) { printf("FAIL:\n"); printf("evaluation does not contain zero\n"); printf("pol = "); fmpq_poly_print_pretty(nf->nf->pol, "x"); printf("\n"); printf("a = "); arb_printd(a, 10); printf("\n"); printf("b = "); arb_printd(b, 10); printf("\n"); fflush(stdout); abort(); } arb_clear(b); }
Tuple* from_fmpq_poly(fmpq_poly_t x){ uint n=fmpq_poly_length(x); Tuple* r=list(n); mpq_t temp; mpq_init(temp); for(uint i=0;i<n;i++){ fmpq_poly_get_coeff_mpq(temp,x,i); if(mpz_cmp_ui(mpq_denref(temp),1)==0){ r->tuple[i+1]=new Integer; mpz_set(r->tuple[i+1].cast<Integer>().mpz,mpq_numref(temp)); } else{ r->tuple[i+1]=new Rational; mpq_set(r->tuple[i+1].cast<Rational>().mpq,temp); } } return r; }