void _fmpz_vec_scalar_addmul_si_2exp(fmpz * vec1, const fmpz * vec2, slong len2, slong c, ulong exp) { slong i; fmpz_t temp; if (c == 0) return; /* nothing to add */ if (exp == 0) /* just do addmul */ { _fmpz_vec_scalar_addmul_si(vec1, vec2, len2, c); return; } fmpz_init(temp); if (c == 1) /* scalar is 1, just add c * 2^exp times c */ { for (i = 0; i < len2; i++) { fmpz_mul_2exp(temp, vec2 + i, exp); fmpz_add(vec1 + i, vec1 + i, temp); } } else if (c == -1) /* scalar is -1, subtract c * 2^exp */ { for (i = 0; i < len2; i++) { fmpz_mul_2exp(temp, vec2 + i, exp); fmpz_sub(vec1 + i, vec1 + i, temp); } } else /* generic case */ { if (c > 0) { for (i = 0; i < len2; i++) { fmpz_mul_2exp(temp, vec2 + i, exp); fmpz_addmul_ui(vec1 + i, temp, c); } } else { for (i = 0; i < len2; i++) { fmpz_mul_2exp(temp, vec2 + i, exp); fmpz_submul_ui(vec1 + i, temp, -c); } } } fmpz_clear(temp); }
void fmpz_mat_scalar_addmul_nmod_mat_fmpz(fmpz_mat_t B, const nmod_mat_t A, const fmpz_t c) { long i, j; for (i = 0; i < A->r; i++) for (j = 0; j < A->c; j++) fmpz_addmul_ui(fmpz_mat_entry(B,i,j), c, nmod_mat_entry(A,i,j)); }
void nf_elem_add_si(nf_elem_t a, const nf_elem_t b, slong c, const nf_t nf) { if (nf->flag & NF_LINEAR) { fmpz * den = LNF_ELEM_DENREF(a); fmpz * num = LNF_ELEM_NUMREF(a); nf_elem_set(a, b, nf); if (c >= 0) fmpz_addmul_ui(num, den, c); else fmpz_submul_ui(num, den, -c); _fmpq_canonicalise(num, den); } else if (nf->flag & NF_QUADRATIC) { fmpz * den = QNF_ELEM_DENREF(a); fmpz * num = QNF_ELEM_NUMREF(a); slong len = 2; nf_elem_set(a, b, nf); while (len != 0 && fmpz_is_zero(num + len - 1)) len--; if (c >= 0) fmpz_addmul_ui(num, den, c); else fmpz_submul_ui(num, den, -c); _fmpq_poly_canonicalise(num, den, len); } else { fmpq_poly_add_si(NF_ELEM(a), NF_ELEM(b), c); } }
void _fmpz_poly_pow_multinomial(fmpz * res, const fmpz * poly, long len, ulong e) { long k, low, rlen; fmpz_t d, t; fmpz * P; rlen = (long) e * (len - 1L) + 1L; _fmpz_vec_zero(res, rlen); for (low = 0L; poly[low] == 0L; low++) ; if (low == 0L) { P = (fmpz *) poly; } else { P = (fmpz *) poly + low; len -= low; res += (long) e * low; rlen -= (long) e * low; } fmpz_init(d); fmpz_init(t); fmpz_pow_ui(res, P, e); for (k = 1; k < rlen; k++) { long i, u = -k; for (i = 1; i <= FLINT_MIN(k, len - 1); i++) { fmpz_mul(t, P + i, res + (k - i)); u += (long) e + 1; if (u >= 0) fmpz_addmul_ui(res + k, t, (ulong) u); else fmpz_submul_ui(res + k, t, - ((ulong) u)); } fmpz_add(d, d, P); fmpz_divexact(res + k, res + k, d); } fmpz_clear(d); fmpz_clear(t); }
static void _padic_log_bsplit_series(fmpz_t P, fmpz_t B, fmpz_t T, const fmpz_t x, long a, long b) { if (b - a == 1) { fmpz_set(P, x); fmpz_set_si(B, a); fmpz_set(T, x); } else if (b - a == 2) { fmpz_mul(P, x, x); fmpz_set_si(B, a); fmpz_mul_si(B, B, a + 1); fmpz_mul_si(T, x, a + 1); fmpz_addmul_ui(T, P, a); } else { const long m = (a + b) / 2; fmpz_t RP, RB, RT; _padic_log_bsplit_series(P, B, T, x, a, m); fmpz_init(RP); fmpz_init(RB); fmpz_init(RT); _padic_log_bsplit_series(RP, RB, RT, x, m, b); fmpz_mul(RT, RT, P); fmpz_mul(T, T, RB); fmpz_addmul(T, RT, B); fmpz_mul(P, P, RP); fmpz_mul(B, B, RB); fmpz_clear(RP); fmpz_clear(RB); fmpz_clear(RT); } }
void fmpz_poly_ramanujan_tau(fmpz_poly_t res, long n) { long j, k, jv, kv; fmpz_t tmp; fmpz_poly_fit_length(res, n); _fmpz_vec_zero(res->coeffs, n); _fmpz_poly_set_length(res, n); fmpz_init(tmp); for (j = jv = 0; jv < n; jv += ++j) { fmpz_set_ui(tmp, 2*j+1); for (k = kv = 0; jv + kv < n; kv += ++k) { if ((j+k) & 1) fmpz_submul_ui(res->coeffs + jv+kv, tmp, 2*k+1); else fmpz_addmul_ui(res->coeffs + jv+kv, tmp, 2*k+1); } } fmpz_poly_mullow(res, res, res, n-1); fmpz_poly_mullow(res, res, res, n-1); fmpz_poly_shift_left(res, res, 1); fmpz_clear(tmp); }
void _qadic_trace(fmpz_t rop, const fmpz *op, slong len, const fmpz *a, const slong *j, slong lena, const fmpz_t pN) { const slong d = j[lena - 1]; slong i, l; fmpz *t; t = _fmpz_vec_init(d); fmpz_set_ui(t + 0, d); for (i = 1; i < d; i++) { for (l = lena - 2; l >= 0 && j[l] >= d - (i - 1); l--) { fmpz_addmul(t + i, t + (j[l] + i - d), a + l); } if (l >= 0 && j[l] == d - i) { fmpz_addmul_ui(t + i, a + l, i); } fmpz_neg(t + i, t + i); fmpz_mod(t + i, t + i, pN); } fmpz_zero(rop); for (i = 0; i < d; i++) { fmpz_addmul(rop, op + i, t + i); } fmpz_mod(rop, rop, pN); _fmpz_vec_clear(t, d); }