separated diagonalization