void fmpq_mat_scalar_mul_fmpz(fmpq_mat_t rop, const fmpq_mat_t op, const fmpz_t x) { long i, j; for (i = 0; i < op->r; i++) for (j = 0; j < op->c; j++) fmpq_mul_fmpz(fmpq_mat_entry(rop, i, j), fmpq_mat_entry(op, i, j), x); }
static void _fmpq_mat_sum_of_squares(fmpq_t res, const fmpq_mat_t Q) { slong i, j; fmpq_zero(res); for (i = 0; i < fmpq_mat_nrows(Q); i++) { for (j = 0; j < fmpq_mat_ncols(Q); j++) { fmpq_addmul(res, fmpq_mat_entry(Q, i, j), fmpq_mat_entry(Q, i, j)); } } }
void fmpq_mat_one(fmpq_mat_t mat) { slong i, j, min; for (i = 0; i < mat->r; i++) for (j = 0; j < mat->c; j++) fmpq_zero(fmpq_mat_entry(mat, i, j)); min = FLINT_MIN(mat->r, mat->c); for (i = 0; i < min; i++) fmpq_one(fmpq_mat_entry(mat, i, i)); }
void _fmpq_mat_mul_entrywise(fmpq_mat_t C, const fmpq_mat_t A, const fmpq_mat_t B) { slong i, j; for (i = 0; i < fmpq_mat_nrows(A); i++) { for (j = 0; j < fmpq_mat_ncols(A); j++) { fmpq_mul(fmpq_mat_entry(C, i, j), fmpq_mat_entry(A, i, j), fmpq_mat_entry(B, i, j)); } } }
void fmpq_mat_mul_fmpz_mat(fmpq_mat_t C, const fmpq_mat_t A, const fmpz_mat_t B) { slong i, j; fmpz_mat_t Aclear; fmpz_mat_t Cclear; fmpz * Aden; fmpz_mat_init(Aclear, A->r, A->c); fmpz_mat_init(Cclear, A->r, B->c); Aden = _fmpz_vec_init(A->r); fmpq_mat_get_fmpz_mat_rowwise(Aclear, Aden, A); fmpz_mat_mul(Cclear, Aclear, B); for (i = 0; i < C->r; i++) { for (j = 0; j < C->c; j++) { fmpz_set(fmpq_mat_entry_num(C, i, j), fmpz_mat_entry(Cclear, i, j)); fmpz_set(fmpq_mat_entry_den(C, i, j), Aden + i); fmpq_canonicalise(fmpq_mat_entry(C, i, j)); } } fmpz_mat_clear(Aclear); fmpz_mat_clear(Cclear); _fmpz_vec_clear(Aden, A->r); }
int main(void) { int i; FLINT_TEST_INIT(state); flint_printf("init/clear...."); fflush(stdout); for (i = 0; i < 1000 * flint_test_multiplier(); i++) { fmpq_mat_t a; slong j, k; slong rows = n_randint(state, 100); slong cols = n_randint(state, 100); fmpq_mat_init(a, rows, cols); for (j = 0; j < rows; j++) for (k = 0; k < cols; k++) fmpq_zero(fmpq_mat_entry(a, j, k)); fmpq_mat_clear(a); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
void fmpq_mat_randtest(fmpq_mat_t mat, flint_rand_t state, mp_bitcnt_t bits) { slong i, j; for (i = 0; i < mat->r; i++) for (j = 0; j < mat->c; j++) fmpq_randtest(fmpq_mat_entry(mat,i,j), state, bits); }
void fmpq_mat_transpose(fmpq_mat_t rop, const fmpq_mat_t op) { slong i, j; if (rop == op) { for (i = 0; i < rop->r; i++) for (j = 0; j < i; j++) fmpq_swap(fmpq_mat_entry(rop, i, j), fmpq_mat_entry(rop, j, i)); } else { for (i = 0; i < rop->r; i++) for (j = 0; j < rop->c; j++) fmpq_set(fmpq_mat_entry(rop, i, j), fmpq_mat_entry(op, j, i)); } }
void arb_mat_set_fmpq_mat(arb_mat_t dest, const fmpq_mat_t src, long prec) { long i, j; if (arb_mat_ncols(dest) != 0) { for (i = 0; i < arb_mat_nrows(dest); i++) for (j = 0; j < arb_mat_ncols(dest); j++) arb_set_fmpq(arb_mat_entry(dest, i, j), fmpq_mat_entry(src, i, j), prec); } }
void gmde_convert_soln_fmpq(mat_t A, const ctx_t ctxA, const fmpq_mat_struct *C, long N) { long i, j, k; assert(N > 0); assert(A->m == C->r && A->n == C->c); for (i = 0; i < A->m; i++) for (j = 0; j < A->n; j++) { ctxA->zero(ctxA, mat_entry(A, i, j, ctxA)); for (k = N - 1; k >= 0; k--) { if (!fmpq_is_zero(fmpq_mat_entry(C + k, i, j))) { fmpq_poly_set_coeff_fmpq( (fmpq_poly_struct *) mat_entry(A, i, j, ctxA), k, fmpq_mat_entry(C + k, i, j)); } } } }
void _fmpq_mat_randtest_for_exp(fmpq_mat_t mat, flint_rand_t state, mp_bitcnt_t bits) { slong i, j; slong l, u; l = n_randint(state, 5); u = n_randint(state, 5); fmpq_mat_zero(mat); for (i = 0; i < fmpq_mat_nrows(mat); i++) { for (j = 0; j < fmpq_mat_ncols(mat); j++) { if ((i == j) || (i < j && u) || (i > j && l)) { fmpq_randtest(fmpq_mat_entry(mat, i, j), state, bits); } } } }
void fmpq_mat_set_fmpz_mat_div_fmpz(fmpq_mat_t X, const fmpz_mat_t Xnum, const fmpz_t den) { slong i, j; if (fmpz_is_one(den)) { fmpq_mat_set_fmpz_mat(X, Xnum); } else if (*den == WORD(-1)) { fmpz_t t; fmpz_init(t); fmpz_set(t, den); for (i = 0; i < Xnum->r; i++) { for (j = 0; j < Xnum->c; j++) { fmpz_neg(fmpq_mat_entry_num(X, i, j), fmpz_mat_entry(Xnum, i, j)); fmpz_one(fmpq_mat_entry_den(X, i, j)); } } fmpz_clear(t); } else { for (i = 0; i < Xnum->r; i++) { for (j = 0; j < Xnum->c; j++) { fmpz_set(fmpq_mat_entry_num(X, i, j), fmpz_mat_entry(Xnum, i, j)); fmpz_set(fmpq_mat_entry_den(X, i, j), den); fmpq_canonicalise(fmpq_mat_entry(X, i, j)); } } } }
const ElementType& entry(size_t row, size_t column) const { assert(row < numRows()); assert(column < numColumns()); return * fmpq_mat_entry(mArray, row, column); }
const ElementType& entry(size_t row, size_t column) const { M2_ASSERT(row < numRows()); M2_ASSERT(column < numColumns()); return * fmpq_mat_entry(mArray, row, column); }
int fmpq_mat_inv(fmpq_mat_t B, const fmpq_mat_t A) { long n = A->r; if (n == 0) { return 1; } else if (n == 1) { if (fmpq_is_zero(fmpq_mat_entry(A, 0, 0))) return 0; fmpq_inv(fmpq_mat_entry(B, 0, 0), fmpq_mat_entry(A, 0, 0)); return 1; } else if (n == 2) { fmpq_t d; int success; fmpq_init(d); fmpq_mul(d, fmpq_mat_entry(A, 0, 0), fmpq_mat_entry(A, 1, 1)); fmpq_submul(d, fmpq_mat_entry(A, 0, 1), fmpq_mat_entry(A, 1, 0)); success = !fmpq_is_zero(d); if (success) { fmpq_t t00, t01, t10, t11; fmpq_inv(d, d); fmpq_init(t00); fmpq_init(t01); fmpq_init(t10); fmpq_init(t11); fmpq_mul(t00, fmpq_mat_entry(A, 1, 1), d); fmpq_mul(t01, fmpq_mat_entry(A, 0, 1), d); fmpq_mul(t10, fmpq_mat_entry(A, 1, 0), d); fmpq_mul(t11, fmpq_mat_entry(A, 0, 0), d); fmpq_set(fmpq_mat_entry(B, 0, 0), t00); fmpq_neg(fmpq_mat_entry(B, 0, 1), t01); fmpq_neg(fmpq_mat_entry(B, 1, 0), t10); fmpq_set(fmpq_mat_entry(B, 1, 1), t11); fmpq_clear(t00); fmpq_clear(t01); fmpq_clear(t10); fmpq_clear(t11); } fmpq_clear(d); return success; } else { fmpz_mat_t Aclear, Bclear, I; fmpz * den; long i; int success; fmpz_mat_init(Aclear, n, n); fmpz_mat_init(Bclear, n, n); fmpz_mat_init(I, n, n); den = _fmpz_vec_init(n); fmpq_mat_get_fmpz_mat_rowwise(Aclear, den, A); for (i = 0; i < n; i++) fmpz_set(fmpz_mat_entry(I, i, i), den + i); success = fmpz_mat_solve(Bclear, den, Aclear, I); if (success) fmpq_mat_set_fmpz_mat_div_fmpz(B, Bclear, den); fmpz_mat_clear(Aclear); fmpz_mat_clear(Bclear); fmpz_mat_clear(I); _fmpz_vec_clear(den, A->r); return success; } }