void bool_mat_mul(bool_mat_t C, const bool_mat_t A, const bool_mat_t B) { slong ar, ac, br, bc, i, j, k; ar = bool_mat_nrows(A); ac = bool_mat_ncols(A); br = bool_mat_nrows(B); bc = bool_mat_ncols(B); if (ac != br || ar != bool_mat_nrows(C) || bc != bool_mat_ncols(C)) { flint_printf("bool_mat_mul: incompatible dimensions\n"); abort(); } if (br == 0) { bool_mat_zero(C); return; } if (A == C || B == C) { bool_mat_t T; bool_mat_init(T, ar, bc); bool_mat_mul(T, A, B); bool_mat_swap(T, C); bool_mat_clear(T); return; } for (i = 0; i < ar; i++) { for (j = 0; j < bc; j++) { int any = 0; for (k = 0; k < br && !any; k++) any |= (bool_mat_get_entry(A, i, k) & bool_mat_get_entry(B, k, j)); bool_mat_set_entry(C, i, j, any); } } }
int main() { slong iter; flint_rand_t state; flint_printf("trace...."); fflush(stdout); flint_randinit(state); /* trace(empty) == 0 */ { bool_mat_t A; bool_mat_init(A, 0, 0); bool_mat_one(A); if (bool_mat_trace(A) != 0) { flint_printf("FAIL (empty)\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); abort(); } bool_mat_clear(A); } /* trace(zero) == 0 */ { slong n; bool_mat_t A; for (n = 1; n < 10; n++) { bool_mat_init(A, n, n); bool_mat_zero(A); if (bool_mat_trace(A) != 0) { flint_printf("FAIL (zero)\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); abort(); } bool_mat_clear(A); } } /* trace(one) == 1 */ { slong n; bool_mat_t A; for (n = 1; n < 10; n++) { bool_mat_init(A, n, n); bool_mat_one(A); if (bool_mat_trace(A) != 1) { flint_printf("FAIL (one)\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); abort(); } bool_mat_clear(A); } } /* traces of random matrices with modified diagonal */ for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong n, i; bool_mat_t A; n = n_randint(state, 10) + 1; bool_mat_init(A, n, n); bool_mat_randtest(A, state); i = (slong) n_randint(state, n); bool_mat_set_entry(A, i, i, 1); if (bool_mat_trace(A) != 1) { flint_printf("FAIL (diagonal has a non-zero entry)\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); abort(); } for (i = 0; i < n; i++) { bool_mat_set_entry(A, i, i, 0); } if (bool_mat_trace(A) != 0) { flint_printf("FAIL (diagonal is zero)\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); abort(); } bool_mat_clear(A); } /* trace(A + B) == trace(A) + trace(B) */ for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong n; bool_mat_t A, B, C; n = n_randint(state, 10); bool_mat_init(A, n, n); bool_mat_init(B, n, n); bool_mat_init(C, n, n); bool_mat_randtest(A, state); bool_mat_randtest(B, state); bool_mat_add(C, A, B); if (bool_mat_trace(C) != (bool_mat_trace(A) | bool_mat_trace(B))) { flint_printf("FAIL (trace(A+B) == trace(A) | trace(B))\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); flint_printf("B = \n"); bool_mat_print(B); flint_printf("\n\n"); flint_printf("A+B = \n"); bool_mat_print(C); flint_printf("\n\n"); abort(); } bool_mat_clear(A); bool_mat_clear(B); bool_mat_clear(C); } /* trace(A*B) == trace(B*A) */ for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong n, m; bool_mat_t A, B, AB, BA; n = n_randint(state, 10); m = n_randint(state, 10); bool_mat_init(A, n, m); bool_mat_init(B, m, n); bool_mat_init(AB, n, n); bool_mat_init(BA, m, m); bool_mat_randtest(A, state); bool_mat_randtest(B, state); bool_mat_mul(AB, A, B); bool_mat_mul(BA, B, A); if (bool_mat_trace(AB) != bool_mat_trace(BA)) { flint_printf("FAIL (trace(AB) == trace(BA))\n"); flint_printf("A = \n"); bool_mat_print(A); flint_printf("\n\n"); flint_printf("B = \n"); bool_mat_print(B); flint_printf("\n\n"); flint_printf("AB = \n"); bool_mat_print(AB); flint_printf("\n\n"); flint_printf("BA = \n"); bool_mat_print(BA); flint_printf("\n\n"); abort(); } bool_mat_clear(A); bool_mat_clear(B); bool_mat_clear(AB); bool_mat_clear(BA); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("is_transitive...."); fflush(stdout); flint_randinit(state); /* special matrices */ { slong n; for (n = 0; n < 10; n++) { bool_mat_t A; bool_mat_init(A, n, n); /* identity matrices are transitive */ bool_mat_one(A); if (!bool_mat_is_transitive(A)) { flint_printf("FAIL (identity matrix)\n"); flint_abort(); } /* square zero matrices are transitive */ bool_mat_zero(A); if (!bool_mat_is_transitive(A)) { flint_printf("FAIL (zero matrix)\n"); flint_abort(); } bool_mat_clear(A); } } for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong n; bool_mat_t A; n = n_randint(state, 10); bool_mat_init(A, n, n); /* all square diagonal matrices are transitive */ bool_mat_randtest_diagonal(A, state); if (!bool_mat_is_transitive(A)) { flint_printf("FAIL (diagonal)\n"); flint_printf("A:\n"); bool_mat_print(A); flint_printf("\n"); flint_abort(); } bool_mat_clear(A); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }