@@ -901,16 +901,19 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
901
901
cdef linbox.DensePolynomial_integer * p = new linbox.DensePolynomial_integer(givZZ, < size_t> self ._nrows)
902
902
cdef Polynomial_integer_dense_flint g = (< Polynomial_integer_dense_flint> R.gen())._new()
903
903
904
- sig_on()
905
- linbox.charpoly(p[0 ], M[0 ])
906
- sig_off()
904
+ while True :
905
+ sig_on()
906
+ linbox.charpoly(p[0 ], M[0 ])
907
+ sig_off()
907
908
908
- cdef size_t i
909
- fmpz_poly_fit_length(g._poly, p.size())
910
- for i in range (p.size()):
911
- tmp = p[0 ][i].get_mpz_const()
912
- fmpz_poly_set_coeff_mpz(g._poly, i, tmp)
913
- _fmpz_poly_set_length(g._poly, p.size())
909
+ fmpz_poly_fit_length(g._poly, p.size())
910
+ for i in range (p.size()):
911
+ tmp = p[0 ][i].get_mpz_const()
912
+ fmpz_poly_set_coeff_mpz(g._poly, i, tmp)
913
+ _fmpz_poly_set_length(g._poly, p.size())
914
+
915
+ if g.lc() == 1 : # linbox is unreliable, see :issue:`37068`
916
+ break
914
917
915
918
del M
916
919
del p
@@ -1000,18 +1003,21 @@ cdef class Matrix_integer_sparse(Matrix_sparse):
1000
1003
cdef linbox.SparseMatrix_integer * M = new_linbox_matrix_integer_sparse(givZZ, self )
1001
1004
cdef linbox.DensePolynomial_integer * p = new linbox.DensePolynomial_integer(givZZ, < size_t> self ._nrows)
1002
1005
cdef Polynomial_integer_dense_flint g = (< Polynomial_integer_dense_flint> R.gen())._new()
1006
+ cdef mpz_t tmp
1003
1007
1004
- sig_on()
1005
- linbox.minpoly(p[0 ], M[0 ])
1006
- sig_off()
1008
+ while True :
1009
+ sig_on()
1010
+ linbox.minpoly(p[0 ], M[0 ])
1011
+ sig_off()
1007
1012
1008
- cdef size_t i
1009
- cdef mpz_t tmp
1010
- fmpz_poly_fit_length(g._poly, p.size())
1011
- for i in range (p.size()):
1012
- tmp = p[0 ][i].get_mpz_const()
1013
- fmpz_poly_set_coeff_mpz(g._poly, i, tmp)
1014
- _fmpz_poly_set_length(g._poly, p.size())
1013
+ fmpz_poly_fit_length(g._poly, p.size())
1014
+ for i in range (p.size()):
1015
+ tmp = p[0 ][i].get_mpz_const()
1016
+ fmpz_poly_set_coeff_mpz(g._poly, i, tmp)
1017
+ _fmpz_poly_set_length(g._poly, p.size())
1018
+
1019
+ if g.lc() == 1 : # linbox is unreliable, see :issue:`37068`
1020
+ break
1015
1021
1016
1022
del M
1017
1023
del p
0 commit comments