def entanglement_of_formation(state): """Calculate the entanglement of formation of quantum state. The input quantum state must be either a bipartite state vector, or a 2-qubit density matrix. Args: state (Statevector or DensityMatrix): a 2-qubit quantum state. Returns: float: The entanglement of formation. Raises: QiskitError: if the input state is not a valid QuantumState. QiskitError: if input is not a bipartite QuantumState. QiskitError: if density matrix input is not a 2-qubit state. """ state = _format_state(state, validate=True) if isinstance(state, Statevector): # The entanglement of formation is given by the reduced state # entropy dims = state.dims() if len(dims) != 2: raise QiskitError("Input is not a bipartite quantum state.") qargs = [0] if dims[0] > dims[1] else [1] return entropy(partial_trace(state, qargs), base=2) # If input is a density matrix it must be a 2-qubit state if state.dim != 4: raise QiskitError("Input density matrix must be a 2-qubit state.") conc = concurrence(state) val = (1 + np.sqrt(1 - (conc**2))) / 2 return shannon_entropy([val, 1 - val])
def entropy(state, base=2): r"""Calculate the von-Neumann entropy of a quantum state. The entropy :math:`S` is given by .. math:: S(\rho) = - Tr[\rho \log(\rho)] Args: state (Statevector or DensityMatrix): a quantum state. base (int): the base of the logarithm [Default: 2]. Returns: float: The von-Neumann entropy S(rho). Raises: QiskitError: if the input state is not a valid QuantumState. """ import scipy.linalg as la state = _format_state(state, validate=True) if isinstance(state, Statevector): return 0 # Density matrix case evals = np.maximum(np.real(la.eigvals(state.data)), 0.0) return shannon_entropy(evals, base=base)