1 /*
2     Copyright (C) 2011 Fredrik Johansson
3 
4     This file is part of FLINT.
5 
6     FLINT is free software: you can redistribute it and/or modify it under
7     the terms of the GNU Lesser General Public License (LGPL) as published
8     by the Free Software Foundation; either version 2.1 of the License, or
9     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
10 */
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include "flint.h"
15 #include "nmod_mat.h"
16 #include "nmod_poly.h"
17 #include "nmod_poly_mat.h"
18 
19 int
main(void)20 main(void)
21 {
22     slong i;
23 
24     FLINT_TEST_INIT(state);
25 
26     flint_printf("neg....");
27     fflush(stdout);
28 
29     /* Check evaluation homomorphism */
30     for (i = 0; i < 100 * flint_test_multiplier(); i++)
31     {
32         nmod_poly_mat_t A, B;
33         nmod_mat_t a, b, c;
34         mp_limb_t x, mod;
35         slong m, n, deg;
36 
37         mod = n_randtest_prime(state, 0);
38         m = n_randint(state, 20);
39         n = n_randint(state, 20);
40         deg = 1 + n_randint(state, 10);
41 
42         nmod_poly_mat_init(A, m, n, mod);
43         nmod_poly_mat_init(B, m, n, mod);
44 
45         nmod_mat_init(a, m, n, mod);
46         nmod_mat_init(b, m, n, mod);
47         nmod_mat_init(c, m, n, mod);
48 
49         nmod_poly_mat_randtest(A, state, deg);
50         nmod_poly_mat_neg(B, A);
51 
52         x = n_randint(state, mod);
53 
54         nmod_poly_mat_evaluate_nmod(a, A, x);
55         nmod_poly_mat_evaluate_nmod(b, B, x);
56         nmod_mat_neg(c, a);
57 
58         if (!nmod_mat_equal(b, c))
59         {
60             flint_printf("FAIL:\n");
61             flint_printf("A:\n");
62             nmod_poly_mat_print(A, "x");
63             flint_printf("B:\n");
64             nmod_poly_mat_print(B, "x");
65             flint_printf("\n");
66             abort();
67         }
68 
69         nmod_poly_mat_clear(A);
70         nmod_poly_mat_clear(B);
71 
72         nmod_mat_clear(a);
73         nmod_mat_clear(b);
74         nmod_mat_clear(c);
75     }
76 
77     /* Check aliasing B and A */
78     for (i = 0; i < 100 * flint_test_multiplier(); i++)
79     {
80         nmod_poly_mat_t A, B;
81         slong m, n, deg;
82         mp_limb_t mod;
83 
84         mod = n_randtest_prime(state, 0);
85         m = n_randint(state, 20);
86         n = n_randint(state, 20);
87         deg = 1 + n_randint(state, 10);
88 
89         nmod_poly_mat_init(A, m, n, mod);
90         nmod_poly_mat_init(B, m, n, mod);
91 
92         nmod_poly_mat_randtest(A, state, deg);
93 
94         nmod_poly_mat_neg(B, A);
95         nmod_poly_mat_neg(A, A);
96 
97         if (!nmod_poly_mat_equal(B, A))
98         {
99             flint_printf("FAIL:\n");
100             flint_printf("A:\n");
101             nmod_poly_mat_print(A, "x");
102             flint_printf("B:\n");
103             nmod_poly_mat_print(B, "x");
104             flint_printf("\n");
105             abort();
106         }
107 
108         nmod_poly_mat_clear(A);
109         nmod_poly_mat_clear(B);
110     }
111 
112     FLINT_TEST_CLEANUP(state);
113 
114     flint_printf("PASS\n");
115     return 0;
116 }
117