diff --git a/acb_mat.h b/acb_mat.h index 2ec77512..52939535 100644 --- a/acb_mat.h +++ b/acb_mat.h @@ -66,6 +66,16 @@ acb_mat_swap(acb_mat_t mat1, acb_mat_t mat2) *mat2 = t; } +ACB_MAT_INLINE void +acb_mat_swap_entrywise(acb_mat_t mat1, acb_mat_t mat2) +{ + slong i, j; + + for (i = 0; i < acb_mat_nrows(mat1); i++) + for (j = 0; j < acb_mat_ncols(mat1); j++) + acb_swap(acb_mat_entry(mat2, i, j), acb_mat_entry(mat1, i, j)); +} + /* Window matrices */ void acb_mat_window_init(acb_mat_t window, const acb_mat_t mat, slong r1, slong c1, slong r2, slong c2); diff --git a/acb_mat/approx_mul.c b/acb_mat/approx_mul.c index 078dd4e1..d84294d4 100644 --- a/acb_mat/approx_mul.c +++ b/acb_mat/approx_mul.c @@ -38,7 +38,7 @@ acb_mat_approx_mul_classical(acb_mat_t C, const acb_mat_t A, const acb_mat_t B, acb_mat_t T; acb_mat_init(T, ar, bc); acb_mat_approx_mul_classical(T, A, B, prec); - acb_mat_swap(T, C); + acb_mat_swap_entrywise(T, C); acb_mat_clear(T); return; } diff --git a/acb_mat/mul_classical.c b/acb_mat/mul_classical.c index 23021456..40bfa1ef 100644 --- a/acb_mat/mul_classical.c +++ b/acb_mat/mul_classical.c @@ -45,7 +45,7 @@ acb_mat_mul_classical(acb_mat_t C, const acb_mat_t A, const acb_mat_t B, slong p acb_mat_t T; acb_mat_init(T, ar, bc); acb_mat_mul_classical(T, A, B, prec); - acb_mat_swap(T, C); + acb_mat_swap_entrywise(T, C); acb_mat_clear(T); return; } diff --git a/acb_mat/mul_threaded.c b/acb_mat/mul_threaded.c index f6aac610..289137d9 100644 --- a/acb_mat/mul_threaded.c +++ b/acb_mat/mul_threaded.c @@ -87,7 +87,7 @@ acb_mat_mul_threaded(acb_mat_t C, const acb_mat_t A, const acb_mat_t B, slong pr acb_mat_t T; acb_mat_init(T, ar, bc); acb_mat_mul_threaded(T, A, B, prec); - acb_mat_swap(T, C); + acb_mat_swap_entrywise(T, C); acb_mat_clear(T); return; } diff --git a/arb_mat.h b/arb_mat.h index b28652a9..f8c2788b 100644 --- a/arb_mat.h +++ b/arb_mat.h @@ -64,6 +64,16 @@ arb_mat_swap(arb_mat_t mat1, arb_mat_t mat2) *mat2 = t; } +ARB_MAT_INLINE void +arb_mat_swap_entrywise(arb_mat_t mat1, arb_mat_t mat2) +{ + slong i, j; + + for (i = 0; i < arb_mat_nrows(mat1); i++) + for (j = 0; j < arb_mat_ncols(mat1); j++) + arb_swap(arb_mat_entry(mat2, i, j), arb_mat_entry(mat1, i, j)); +} + /* Window matrices */ void arb_mat_window_init(arb_mat_t window, const arb_mat_t mat, slong r1, slong c1, slong r2, slong c2); diff --git a/arb_mat/approx_mul.c b/arb_mat/approx_mul.c index 0ac9cb38..15aff9cd 100644 --- a/arb_mat/approx_mul.c +++ b/arb_mat/approx_mul.c @@ -31,7 +31,7 @@ arb_mat_approx_mul_classical(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, arb_mat_t T; arb_mat_init(T, ar, bc); arb_mat_approx_mul_classical(T, A, B, prec); - arb_mat_swap(T, C); + arb_mat_swap_entrywise(T, C); arb_mat_clear(T); return; } diff --git a/arb_mat/mul_block.c b/arb_mat/mul_block.c index b63e2d61..3f91b723 100644 --- a/arb_mat/mul_block.c +++ b/arb_mat/mul_block.c @@ -238,7 +238,7 @@ arb_mat_mul_block(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong prec) arb_mat_t T; arb_mat_init(T, M, P); arb_mat_mul_block(T, A, B, prec); - arb_mat_swap(T, C); + arb_mat_swap_entrywise(T, C); arb_mat_clear(T); return; } diff --git a/arb_mat/mul_classical.c b/arb_mat/mul_classical.c index 82f301bd..47eeb197 100644 --- a/arb_mat/mul_classical.c +++ b/arb_mat/mul_classical.c @@ -45,7 +45,7 @@ arb_mat_mul_classical(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong p arb_mat_t T; arb_mat_init(T, ar, bc); arb_mat_mul_classical(T, A, B, prec); - arb_mat_swap(T, C); + arb_mat_swap_entrywise(T, C); arb_mat_clear(T); return; } diff --git a/arb_mat/mul_threaded.c b/arb_mat/mul_threaded.c index 30ea5923..9d82c1b4 100644 --- a/arb_mat/mul_threaded.c +++ b/arb_mat/mul_threaded.c @@ -87,7 +87,7 @@ arb_mat_mul_threaded(arb_mat_t C, const arb_mat_t A, const arb_mat_t B, slong pr arb_mat_t T; arb_mat_init(T, ar, bc); arb_mat_mul_threaded(T, A, B, prec); - arb_mat_swap(T, C); + arb_mat_swap_entrywise(T, C); arb_mat_clear(T); return; } diff --git a/stBhzi4B b/stBhzi4B new file mode 100644 index 00000000..e69de29b