188 bool is_valid(
double tol = 1e-10)
const;
256 const std::vector<int> &target_qbits);
void apply_local_unitary(const matrix_base< QGD_Complex16 > &u_kernel, const std::vector< int > &target_qbits)
Apply k-qubit unitary using local kernel (general case)
QGD_Complex16 * data
pointer to the stored data
void validate_dimensions() const
DensityMatrix(int qbit_num)
Create density matrix for n qubits.
~DensityMatrix()=default
Destructor (uses base class default)
DensityMatrix clone() const
Create deep copy.
bool is_valid(double tol=1e-10) const
Check if valid density matrix.
double entropy() const
von Neumann entropy: S(Ï) = -Tr(Ï logâ Ï)
double purity() const
Calculate purity: Tr(ϲ)
Base Class to store data of arrays and its properties.
DensityMatrix partial_trace(const std::vector< int > &trace_out) const
Compute partial trace over specified qubits.
int rows
The number of rows.
DensityMatrix & operator=(const DensityMatrix &other)
std::vector< double > eigenvalues() const
Get eigenvalues (sorted descending)
bool is_hermitian(double tol) const
Quantum density matrix Ï for mixed-state representation.
QGD_Complex16 trace() const
Calculate trace: Tr(Ï)
void apply_unitary(const matrix_base< QGD_Complex16 > &U)
Apply unitary transformation: Ï â UÏUâ
Structure type representing complex numbers in the SQUANDER package.
void print() const
Print matrix with properties.
int get_qbit_num() const
Get number of qubits.
QGD_Complex16 & operator()(int i, int j)
Element access: Ï(i,j)
int qbit_num_
Number of qubits.
int get_dim() const
Get matrix dimension (2^qbit_num)
void apply_single_qubit_unitary(const matrix_base< QGD_Complex16 > &u_2x2, int target_qbit)
Apply single-qubit unitary using local kernel (optimized)
void apply_two_qubit_unitary(const matrix_base< QGD_Complex16 > &u_2x2, int target_qbit, int control_qbit)
Apply two-qubit controlled unitary using local kernel (optimized)
static DensityMatrix maximally_mixed(int qbit_num)
Create maximally mixed state: Ï = I/2^n.