diff --git a/linbox/solutions/charpoly.h b/linbox/solutions/charpoly.h
index 9e6e5dd..f4b483c 100644
--- a/linbox/solutions/charpoly.h
+++ b/linbox/solutions/charpoly.h
@@ -194,7 +194,21 @@ namespace LinBox
 		}
 	};
 
-	template <class Blackbox, class Polynomial>
+         // Blackbox with dense elimination method: convert the matrix to a dense format.
+    template <class Blackbox, class Polynomial >
+    Polynomial& charpoly (Polynomial                       & P,
+                          const Blackbox                   & A,
+                          const RingCategories::IntegerTag & tag,
+                          const Method::BlasElimination    & M)
+    {
+        if (A.coldim() != A.rowdim())
+            throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
+        BlasMatrix< typename Blackbox::Field >     BBB (A);
+        charpoly (P, BBB);
+        return P;
+    }
+
+    template <class Blackbox, class Polynomial>
 	Polynomial& charpoly (Polynomial                       & P,
 						  const Blackbox                   & A,
 						  const RingCategories::IntegerTag & tag,
@@ -379,7 +393,7 @@ namespace LinBox
 		if (max<-min)
 			max=-min;
 		size_t n=A.coldim();
-		double hadamarcp = n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
+		double hadamarcp = n/2.0*(log(double(n))+2*double(max.bitsize())+0.21163275)/log(2.0);
 
 		ChineseRemainder< FullMultipCRA<Givaro::Modular<double> > > cra(hadamarcp);
 #endif
@@ -395,40 +409,39 @@ namespace LinBox
 	}
 
 
-	template <class Blackbox, class Polynomial>
+	template <class Field, class Polynomial>
 	Polynomial& charpoly (Polynomial                       & P,
-			      const Blackbox                   & A,
-			      const RingCategories::IntegerTag & tag,
-			      const Method::BlasElimination    & M)
+                          const DenseMatrix<Field>         & A,
+                          const RingCategories::IntegerTag & tag,
+                          const Method::BlasElimination    & M)
 	{
 		if (A.coldim() != A.rowdim())
 			throw LinboxError("LinBox ERROR: matrix must be square for characteristic polynomial computation\n");
 
 		commentator().start ("Integer Dense Charpoly : No NTL installation -> chinese remaindering", "IbbCharpoly");
 
-//		RandomPrimeIterator genprime( 26-(int)ceil(log((double)A.rowdim())*0.7213475205));
 		RandomPrimeIterator genprime( 23);
-#if 0
-		typename Blackbox::ConstIterator it = A.Begin();
-		typename Blackbox::ConstIterator it_end = A.End();
-		integer max = 1,min=0;
-		while( it != it_end ){
+
+#if 1
+            // Deterministic Chinese remaindering by default
+        integer max = 1,min=0;
+		for (auto it = A.Begin(); it != A.End(); it++){
 			if (max < (*it))
 				max = *it;
 			if ( min > (*it))
 				min = *it;
-			it++;
 		}
 		if (max<-min)
 			max=-min;
 		size_t n=A.coldim();
-		double hadamarcp = n/2.0*(log(double(n))+2*log(double(max))+0.21163275)/log(2.0);
-
-
+		double hadamarcp = n/2.0*(log(double(n))+2*double(max.bitsize())+0.21163275)/log(2.0);
+        if (!n) hadamarcp = 1;
 		ChineseRemainder< FullMultipCRA<Givaro::Modular<double> > > cra(hadamarcp);
+#else
+            // Early terminated Chinese remaindering disabled for the moment (waiting to pass a switch in the method)
+        ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
 #endif
-		ChineseRemainder< EarlyMultipCRA<Givaro::Modular<double> > > cra(3UL);
-        IntegerModularCharpoly<Blackbox,Method::BlasElimination> iteration(A, M);
+        IntegerModularCharpoly<DenseMatrix<Field>,Method::BlasElimination> iteration(A, M);
 		cra (P, iteration, genprime);
 		commentator().stop ("done", NULL, "IbbCharpoly");
 #ifdef _LB_CRATIMING
