diff --git a/src/fmpz_mat/minpoly_modular.c b/src/fmpz_mat/minpoly_modular.c index 28a69aaa45..fdbd6bebb5 100644 --- a/src/fmpz_mat/minpoly_modular.c +++ b/src/fmpz_mat/minpoly_modular.c @@ -42,7 +42,7 @@ static slong _fmpz_mat_minpoly_small(fmpz * rop, const fmpz_mat_t op) static void _fmpz_mat_bound_ovals_of_cassini(fmpz_t b, const fmpz_mat_t op) { slong n = op->r, i, j; - fmpz * v1; + fmpz * v1, * v2; fmpz_t t, q, r1, r2; fmpz_init(t); @@ -51,6 +51,7 @@ static void _fmpz_mat_bound_ovals_of_cassini(fmpz_t b, const fmpz_mat_t op) fmpz_init(r2); v1 = _fmpz_vec_init(n); + v2 = _fmpz_vec_init(n); /* |A| [1,1,...,1]^T */ for (i = 0; i < n; i++) @@ -63,13 +64,27 @@ static void _fmpz_mat_bound_ovals_of_cassini(fmpz_t b, const fmpz_mat_t op) fmpz_sub(v1 + i, v1 + i, fmpz_mat_entry(op, i, j)); } } + /* |A|^t * |A| * [1,1,...,1]^T */ + for (i = 0; i < n; i++) + { + for (j = 0; j < n; j++) + { + if (fmpz_sgn(fmpz_mat_entry(op, j, i)) >= 0) + fmpz_addmul(v2 + i, v1 + j, fmpz_mat_entry(op, j, i)); + else + fmpz_submul(v2 + i, v1 + j, fmpz_mat_entry(op, j, i)); + } + } + + _fmpz_vec_clear(v1, n); + v1 = v2; for (i = 0; i < n; i++) { fmpz_zero(t); - /* q_i */ - fmpz_abs(t, fmpz_mat_entry(op, i, i)); + for (j = 1; j < n; j++) + fmpz_addmul(t, fmpz_mat_entry(op, i, j), fmpz_mat_entry(op, i, j)); if (fmpz_cmp(t, q) > 0) fmpz_set(q, t); diff --git a/src/fmpz_mat/test/t-minpoly.c b/src/fmpz_mat/test/t-minpoly.c index f48dcaa4b9..457f8786c6 100644 --- a/src/fmpz_mat/test/t-minpoly.c +++ b/src/fmpz_mat/test/t-minpoly.c @@ -52,7 +52,7 @@ TEST_FUNCTION_START(fmpz_mat_minpoly, state) fmpz_poly_init(r); if (n_randint(state, 50) == 0) - fmpz_mat_randtest(A, state, 1000); + fmpz_mat_randtest(A, state, 10000); else fmpz_mat_randtest(A, state, 10);