Source code for qrisp.alg_primitives.dicke_state_prep

"""
\********************************************************************************
* Copyright (c) 2023 the Qrisp authors
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the Eclipse
* Public License, v. 2.0 are satisfied: GNU General Public License, version 2
* with the GNU Classpath Exception which is
* available at https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
********************************************************************************/
"""
import numpy as np

from qrisp.core import cx, ry

[docs] def dicke_state(qv, k): """ Dicke State initialization of a QuantumVariable, based on the deterministic alogrithm in https://arxiv.org/abs/1904.07358. This algorithm creates an equal superposition of Dicke states for a given Hamming weight. The initial input variable has to be within this subspace. Parameters ---------- qv : QuantumVariable Initial quantum variable to be prepared. Has to be in target subspace. k : Int The Hamming weight (i.e. number of "ones") for the desired dicke state Examples -------- We initiate a QuantumVariable in the "0011" state and from this create the Dicke state with Hamming weight 2. :: from qrisp import QuantumVariable, x from qrisp.misc.dicke_state import dicke_state qv = QuantumVariable(4) x(qv[2]) x(qv[3]) dicke_state(qv, 2) """ n = len(qv) for index2 in reversed(range(k+1, n+1)): split_cycle_shift(qv, index2, k) for index in reversed(range(2,k+1)): split_cycle_shift(qv, index, index-1)
[docs] def split_cycle_shift(qv, highIndex, lowIndex): """ Helper function for Dicke State initialization of a QuantumVariable, based on the deterministic alogrithm in https://arxiv.org/abs/1904.07358. Parameters ---------- qv : QuantumVariable Initial quantum variable to be prepared. Has to be in target subspace. highIndex : Int Index for indication of preparation steps, as seen in original algorithm. lowIndex : Int Index for indication of preparation steps, as seen in original algorithm. """ from qrisp import control index_range = [highIndex - i for i in range(lowIndex)] for index in index_range: param = 2 * np.arccos(np.sqrt((highIndex - index + 1 ) /(highIndex)) ) if index == highIndex: cx(qv[highIndex - 2], qv[highIndex-1]) with control( qv[highIndex-1] ): ry(param, qv[highIndex - 2]) cx(qv[highIndex - 2], qv[highIndex -1]) else: cx(qv[index -2], qv[highIndex-1]) with control([qv[highIndex -1],qv[index -1]]): ry(param, qv[index - 2]) cx(qv[index -2], qv[highIndex-1])