int main(void) { fmpz_mat_t A, B, C, D; slong i; FLINT_TEST_INIT(state); flint_printf("mul...."); fflush(stdout); for (i = 0; i < 100 * flint_test_multiplier(); i++) { slong m, n, k; m = n_randint(state, 50); n = n_randint(state, 50); k = n_randint(state, 50); 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); /* Make sure noise in the output is ok */ fmpz_mat_randtest(C, state, n_randint(state, 200) + 1); fmpz_mat_mul(C, A, B); fmpz_mat_mul_classical_inline(D, A, B); if (!fmpz_mat_equal(C, D)) { flint_printf("FAIL: results not equal\n"); abort(); } fmpz_mat_mul(A, A, B); if (!fmpz_mat_equal(A, C)) { flint_printf("FAIL: aliasing failed\n"); abort(); } fmpz_mat_clear(A); fmpz_mat_clear(B); fmpz_mat_clear(C); fmpz_mat_clear(D); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
void sample(void * arg, ulong count) { mat_mul_t * params = (mat_mul_t *) arg; long i, m = params->m, n = params->n, k = params->k; long bits = params->bits; int algorithm = params->algorithm; flint_rand_t rnd; fmpz_mat_t A, B, C; flint_rand_t state; flint_randinit(state); fmpz_mat_init(A, m, n); fmpz_mat_init(B, n, k); fmpz_mat_init(C, m, k); fmpz_mat_randbits(A, state, bits); fmpz_mat_randbits(B, state, bits); prof_start(); if (algorithm == 0) for (i = 0; i < count; i++) fmpz_mat_mul(C, A, B); else if (algorithm == 1) for (i = 0; i < count; i++) fmpz_mat_mul_classical(C, A, B); else if (algorithm == 2) for (i = 0; i < count; i++) fmpz_mat_mul_classical_inline(C, A, B); else if (algorithm == 3) for (i = 0; i < count; i++) fmpz_mat_mul_multi_mod(C, A, B); prof_stop(); fmpz_mat_clear(A); fmpz_mat_clear(B); fmpz_mat_clear(C); flint_randclear(state); }