diff --git a/fflas-ffpack/ffpack/ffpack_charpoly.inl b/fflas-ffpack/ffpack/ffpack_charpoly.inl index a8210280d..3098dbdaf 100644 --- a/fflas-ffpack/ffpack/ffpack_charpoly.inl +++ b/fflas-ffpack/ffpack/ffpack_charpoly.inl @@ -65,9 +65,9 @@ namespace FFPACK { FFPACK_CHARPOLY_TAG tag = CharpTag; if (tag == FfpackAuto){ - if (N < degree) + if (N < __FFLASFFPACK_CHARPOLY_Danilevskii_LUKrylov_THRESHOLD) tag = FfpackDanilevski; - else if (N < degree) + else if (N < __FFLASFFPACK_CHARPOLY_LUKrylov_ArithProg_THRESHOLD) tag = FfpackLUK; else tag = FfpackArithProgKrylovPrecond; @@ -110,7 +110,7 @@ namespace FFPACK { else return CharPoly (R, charp, N, A, lda, G, FfpackLUK); } - } while (cont); + } while (cont); return charp; } case FfpackArithProg: diff --git a/fflas-ffpack/ffpack/ffpack_frobenius.inl b/fflas-ffpack/ffpack/ffpack_frobenius.inl index a42fb5497..532d41df6 100644 --- a/fflas-ffpack/ffpack/ffpack_frobenius.inl +++ b/fflas-ffpack/ffpack/ffpack_frobenius.inl @@ -93,7 +93,6 @@ namespace FFPACK { namespace Protected { size_t *dK = FFLAS::fflas_new(noc*degree); for (size_t i=0; i(N); - size_t * Qk = FFLAS::fflas_new(N); - for (size_t i=0; i(nrows); + for (size_t i=0; i=nb_full_blocks+1; --i){ - if (dK[i] >= 1){ + // How many non-full blocks are completed : + // - if no full_blocks: all of them + // - if there is at least one full block, then the first non-full will be further eliminated later on and should not be pushed as completed + size_t last_completed = nb_full_blocks + nb_full_blocks?1:0; + for (size_t ip1=Mk; ip1 > last_completed; --ip1){ + size_t i = ip1-1; + if (dK[i] >= 1){ for (size_t j = offset+1; j F(37); + Poly1Dom >PolRing(F,'X'); + + // Reading the matrix from a file + double* A; + size_t m, n; + std::string file("data/regression_charpoly.sms"); + ReadMatrix(file.c_str(), F, m, n, A); + // here m=n=35 + Poly1Dom >::Element charp(n+1); + + CharPoly(PolRing, charp, n, A, n); + + fflas_delete(A); + bool pass = F.isOne(charp[n]); + for (size_t i = 0; i