void arb_mat_L2norm(arb_t out, const arb_mat_t in, slong prec) { int nrows = arb_mat_nrows(in); int ncols = arb_mat_ncols(in); arb_zero(out); for(int i = 0; i < nrows; i++) { for(int j = 0; j < ncols; j++) { arb_addmul(out, arb_mat_entry(in, i, j), arb_mat_entry(in, i, j), prec); } } arb_sqrtpos(out, out, prec); }
void arb_mat_frobenius_norm(arb_t res, const arb_mat_t A, slong prec) { slong i, j, r, c; r = arb_mat_nrows(A); c = arb_mat_ncols(A); arb_zero(res); if (r == 0 || c == 0) return; for (i = 0; i < r; i++) { for (j = 0; j < c; j++) { arb_srcptr x = arb_mat_entry(A, i, j); arb_addmul(res, x, x, prec); } } arb_sqrtpos(res, res, prec); }
void acb_sqrt(acb_t y, const acb_t x, slong prec) { arb_t r, t, u; slong wp; #define a acb_realref(x) #define b acb_imagref(x) #define c acb_realref(y) #define d acb_imagref(y) if (arb_is_zero(b)) { if (arb_is_nonnegative(a)) { arb_sqrt(c, a, prec); arb_zero(d); return; } else if (arb_is_nonpositive(a)) { arb_neg(d, a); arb_sqrt(d, d, prec); arb_zero(c); return; } } if (arb_is_zero(a)) { if (arb_is_nonnegative(b)) { arb_mul_2exp_si(c, b, -1); arb_sqrt(c, c, prec); arb_set(d, c); return; } else if (arb_is_nonpositive(b)) { arb_mul_2exp_si(c, b, -1); arb_neg(c, c); arb_sqrt(c, c, prec); arb_neg(d, c); return; } } wp = prec + 4; arb_init(r); arb_init(t); arb_init(u); acb_abs(r, x, wp); arb_add(t, r, a, wp); if (arb_rel_accuracy_bits(t) > 8) { /* sqrt(a+bi) = sqrt((r+a)/2) + b/sqrt(2*(r+a))*i, r = |a+bi| */ arb_mul_2exp_si(u, t, 1); arb_sqrt(u, u, wp); arb_div(d, b, u, prec); arb_set_round(c, u, prec); arb_mul_2exp_si(c, c, -1); } else { /* sqrt(a+bi) = sqrt((r+a)/2) + (b/|b|)*sqrt((r-a)/2)*i (sign) */ arb_mul_2exp_si(t, t, -1); arb_sub(u, r, a, wp); arb_mul_2exp_si(u, u, -1); arb_sqrtpos(c, t, prec); if (arb_is_nonnegative(b)) { arb_sqrtpos(d, u, prec); } else if (arb_is_nonpositive(b)) { arb_sqrtpos(d, u, prec); arb_neg(d, d); } else { arb_sqrtpos(t, u, wp); arb_neg(u, t); arb_union(d, t, u, prec); } } arb_clear(r); arb_clear(t); arb_clear(u); #undef a #undef b #undef c #undef d }