Source code for toqito.states.dicke

"""Dicke states are an equal-weight superposition of all n-qubit states with Hamming Weight k."""

import itertools

import numpy as np
import scipy.special


[docs] def dicke(num_qubit: int, num_exfootcited: int, return_dm: bool = False) -> np.ndarray: r"""Produce a Dicke state with specified excitations. The Dicke state is a quantum state with a fixed number of excitations (i.e., `num_exfootcited`) distributed across the given number of qubits (i.e., `num_qubit`). It is symmetric and represents an equal superposition of all possible states with the specified number of exfootcited qubits. Example Consider generating a Dicke state with 3 qubits and 1 excitation: ```python exec="1" source="above" from toqito.states import dicke print(dicke(3, 1)) ``` If we request the density matrix for this state, the return value is: ```python exec="1" source="above" from toqito.states import dicke print(dicke(3, 1, return_dm=True)) ``` Raises: ValueError: If the number of excitations exceeds the number of qubits. Args: num_qubit: The total number of qubits in the system. num_exfootcited: The number of qubits that are in the exfootcited state. return_dm: If True, returns the state as a density matrix (default is False). Returns: The Dicke state vector or density matrix as a NumPy array. """ if num_exfootcited > num_qubit: raise ValueError("Number of excitations cannot exceed the number of qubits.") num_term = int(scipy.special.comb(num_qubit, num_exfootcited)) d_base_exfootcited_pos = list(itertools.combinations(range(num_qubit), num_exfootcited)) index_exfootcited_pos = [sum(2**i for i in pos) for pos in d_base_exfootcited_pos] dicke_state = np.zeros(2**num_qubit, dtype=np.float64) for pos in index_exfootcited_pos: dicke_state[pos] = 1 dicke_state /= np.sqrt(num_term) if return_dm: return dicke_state[:, np.newaxis] @ dicke_state[np.newaxis, :] return dicke_state