int arb_mat_lu_classical(slong * P, arb_mat_t LU, const arb_mat_t A, slong prec) { arb_t d, e; arb_ptr * a; slong i, j, m, n, r, row, col; int result; if (arb_mat_is_empty(A)) return 1; m = arb_mat_nrows(A); n = arb_mat_ncols(A); arb_mat_set(LU, A); a = LU->rows; row = col = 0; for (i = 0; i < m; i++) P[i] = i; arb_init(d); arb_init(e); result = 1; while (row < m && col < n) { r = arb_mat_find_pivot_partial(LU, row, m, col); if (r == -1) { result = 0; break; } else if (r != row) arb_mat_swap_rows(LU, P, row, r); arb_set(d, a[row] + col); for (j = row + 1; j < m; j++) { arb_div(e, a[j] + col, d, prec); arb_neg(e, e); _arb_vec_scalar_addmul(a[j] + col, a[row] + col, n - col, e, prec); arb_zero(a[j] + col); arb_neg(a[j] + row, e); } row++; col++; } arb_clear(d); arb_clear(e); return result; }
static void _stirling_matrix_2(arb_mat_t mat, slong prec) { slong n; if (arb_mat_is_empty(mat)) return; for (n = 0; n < mat->r; n++) _stirling_number_2_vec_next(mat->rows[n], mat->rows[n - (n != 0)], n, mat->c, prec); }
void arb_mat_trace(arb_t trace, const arb_mat_t mat, slong prec) { slong i; if (!arb_mat_is_square(mat)) { flint_printf("arb_mat_trace: a square matrix is required!\n"); abort(); } if (arb_mat_is_empty(mat)) { arb_zero(trace); return; } arb_set(trace, arb_mat_entry(mat, 0, 0)); for (i = 1; i < arb_mat_nrows(mat); i++) { arb_add(trace, trace, arb_mat_entry(mat, i, i), prec); } }
void arb_mat_inv_cho_precomp(arb_mat_t X, const arb_mat_t L, slong prec) { slong n; if (arb_mat_nrows(X) != arb_mat_nrows(L) || arb_mat_ncols(X) != arb_mat_ncols(L)) { flint_printf("arb_mat_inv_cho_precomp: incompatible dimensions\n"); abort(); } if (arb_mat_is_empty(L)) return; n = arb_mat_nrows(L); if (n == 1) { arb_inv(arb_mat_entry(X, 0, 0), arb_mat_entry(L, 0, 0), prec); _arb_sqr(arb_mat_entry(X, 0, 0), arb_mat_entry(X, 0, 0), prec); return; } if (X == L) { flint_printf("arb_mat_inv_cho_precomp: unsupported aliasing\n"); abort(); } /* invert a 2x2 or larger matrix given its L * L^T decomposition */ { slong i, j, k; arb_struct *s; arb_mat_zero(X); s = _arb_vec_init(n); for (i = 0; i < n; i++) { arb_inv(s + i, arb_mat_entry(L, i, i), prec); } for (j = n-1; j >= 0; j--) { for (i = j; i >= 0; i--) { if (i == j) { arb_set(arb_mat_entry(X, i, j), s + i); } else { arb_zero(arb_mat_entry(X, i, j)); } for (k = i + 1; k < n; k++) { arb_submul(arb_mat_entry(X, i, j), arb_mat_entry(L, k, i), arb_mat_entry(X, k, j), prec); } arb_div(arb_mat_entry(X, i, j), arb_mat_entry(X, i, j), arb_mat_entry(L, i, i), prec); arb_set(arb_mat_entry(X, j, i), arb_mat_entry(X, i, j)); } } _arb_vec_clear(s, n); } }