diff --git a/doc/source/mpn_extras.rst b/doc/source/mpn_extras.rst index dfc61a9b5a..2551af3845 100644 --- a/doc/source/mpn_extras.rst +++ b/doc/source/mpn_extras.rst @@ -78,7 +78,7 @@ Multiplication is *n + 2* ULP in the returned limb. .. note:: This function may not exist on processors not supporting the ADX - instruction set. + instruction set. Divisibility diff --git a/src/fmpz_mat/test/main.c b/src/fmpz_mat/test/main.c index 1a26278650..5649bf7c48 100644 --- a/src/fmpz_mat/test/main.c +++ b/src/fmpz_mat/test/main.c @@ -76,6 +76,7 @@ #include "t-mul_multi_mod.c" #include "t-mul_small.c" #include "t-mul_strassen.c" +#include "t-mul_waksman.c" #include "t-multi_CRT_ui.c" #include "t-multi_CRT_ui_unsigned.c" #include "t-nullspace.c" @@ -175,6 +176,7 @@ test_struct tests[] = TEST_FUNCTION(fmpz_mat_mul_multi_mod), TEST_FUNCTION(fmpz_mat_mul_small), TEST_FUNCTION(fmpz_mat_mul_strassen), + TEST_FUNCTION(fmpz_mat_mul_waksman), TEST_FUNCTION(fmpz_mat_multi_CRT_ui), TEST_FUNCTION(fmpz_mat_multi_CRT_ui_unsigned), TEST_FUNCTION(fmpz_mat_nullspace), diff --git a/src/fmpz_mat/test/t-mul_strassen.c b/src/fmpz_mat/test/t-mul_strassen.c index 1053ebce83..961db07660 100644 --- a/src/fmpz_mat/test/t-mul_strassen.c +++ b/src/fmpz_mat/test/t-mul_strassen.c @@ -22,9 +22,9 @@ TEST_FUNCTION_START(fmpz_mat_mul_strassen, state) slong m, k, n; - m = n_randint(state, 150); - k = n_randint(state, 150); - n = n_randint(state, 150); + m = n_randint(state, 20); + k = n_randint(state, 20); + n = n_randint(state, 20); fmpz_mat_init(A, m, n); fmpz_mat_init(B, n, k); diff --git a/src/fmpz_mat/test/t-mul_waksman.c b/src/fmpz_mat/test/t-mul_waksman.c new file mode 100644 index 0000000000..7eb9d3cdad --- /dev/null +++ b/src/fmpz_mat/test/t-mul_waksman.c @@ -0,0 +1,58 @@ +/* + Copyright (C) 2024 Fredrik Johansson + + This file is part of FLINT. + + FLINT is free software: you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License (LGPL) as published + by the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. See . +*/ + +#include "test_helpers.h" +#include "fmpz_mat.h" + +TEST_FUNCTION_START(fmpz_mat_mul_waksman, state) +{ + slong i; + + for (i = 0; i < 10 * flint_test_multiplier(); i++) + { + fmpz_mat_t A, B, C, D; + + slong m, k, n; + + m = n_randint(state, 20); + k = n_randint(state, 20); + n = n_randint(state, 20); + + fmpz_mat_init(A, m, n); + fmpz_mat_init(B, n, k); + fmpz_mat_init(C, m, k); + fmpz_mat_init(D, m, k); + + fmpz_mat_randtest(A, state, n_randint(state, 200) + 1); + fmpz_mat_randtest(B, state, n_randint(state, 200) + 1); + + fmpz_mat_mul_classical(C, A, B); + fmpz_mat_mul_waksman(D, A, B); + + if (!fmpz_mat_equal(C, D)) + { + flint_printf("FAIL: results not equal\n"); + fmpz_mat_print_pretty(A); + fmpz_mat_print_pretty(B); + fmpz_mat_print_pretty(C); + fmpz_mat_print_pretty(D); + fflush(stdout); + flint_abort(); + } + + fmpz_mat_clear(A); + fmpz_mat_clear(B); + fmpz_mat_clear(C); + fmpz_mat_clear(D); + } + + TEST_FUNCTION_END(state); +}