I need to calculate an approximate value of the Von Neumann entropy
\begin{equation} S = - \text{Tr} ( \rho \log_2 \rho ) \end{equation}
for a variable $N\times N$ matrix $\rho$ very often. My last approach was to diagonalize \begin{equation} \rho = S \text{diag}(\lambda_1, \dots, \lambda_N) S^{-1} \end{equation}
excatly by calculating the eigenvalues, then using the QR-algorithm to calculate $S$ and finally applying the rule \begin{equation} \log_2 \rho = S \text{diag}(\log_2(\lambda_1), \dots, \log_2(\lambda_N))S^{-1} \end{equation}
which consumes far too much cpu time. Does anyone know a method, how to approximately diagonalize $\rho$ or at least how to approximatel calculate $S$ numerically?