/* Copyright (C) 2017 Luca De Feo 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 "fq_embed.h" #include "templates.h" #include #include #include "ulong_extras.h" #include "long_extras.h" int main(void) { int i; FLINT_TEST_INIT(state); flint_printf("mul_matrix... "); fflush(stdout); /* Check that Mat(a^2) = Mat(a)^2 for random a */ for (i = 0; i < 100 * flint_test_multiplier(); i++) { fq_ctx_t ctx; fq_t a; fmpz_mod_mat_t mat_a, mat_a_sq, mat_a_a; slong d; fq_ctx_randtest(ctx, state); d = fq_ctx_degree(ctx); fq_init(a, ctx); fmpz_mod_mat_init(mat_a, d, d, fq_ctx_prime(ctx)); fmpz_mod_mat_init(mat_a_sq, d, d, fq_ctx_prime(ctx)); fmpz_mod_mat_init(mat_a_a, d, d, fq_ctx_prime(ctx)); fq_randtest(a, state, ctx); fq_embed_mul_matrix(mat_a, a, ctx); fq_mul(a, a, a, ctx); fq_embed_mul_matrix(mat_a_sq, a, ctx); fmpz_mod_mat_mul(mat_a_a, mat_a, mat_a); if (!fmpz_mod_mat_equal(mat_a_a, mat_a_sq)) { flint_printf("FAIL:\n\n"); flint_printf("CTX\n"), fq_ctx_print(ctx), flint_printf("\n"); flint_printf("a^2: "), fq_print_pretty(a, ctx), flint_printf("\n"); flint_printf("M(a)^2 = M(a^2)\n"), fmpz_mod_mat_print_pretty(mat_a), flint_printf("^2\n=\n"), fmpz_mod_mat_print_pretty(mat_a_a), flint_printf("\n=\n"), fmpz_mod_mat_print_pretty(mat_a_sq), flint_printf("\n"); abort(); } fmpz_mod_mat_clear(mat_a); fmpz_mod_mat_clear(mat_a_sq); fmpz_mod_mat_clear(mat_a_a); fq_clear(a, ctx); fq_ctx_clear(ctx); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return EXIT_SUCCESS; }