Generation of a generalized W state#

Description#

The circuit in Figure 12 illustrates an algorithm for the generation of a generalized \(\Number\)-qubit W state (see Generation of a W state),

(330)#\[\begin{split}\begin{aligned} \ket{\mathrm{W}} &= \frac{1}{\sqrt{\Number}} \sum_{k=0}^{\Number - 1} \left(\bigotimes_{n=0}^{\Number - 1 - k} \ket{0}\right) \otimes \ket{1} \otimes \left(\bigotimes_{n=\Number - 1 - k}^{0} \ket{0}\right) \\ &= \frac{1}{\sqrt{\Number}} \sum_{k=0}^{\Number - 1} \ket{0}^{\otimes k} \otimes \ket{1} \otimes \ket{0}^{\otimes (\Number - 1 - k)} \\ &= \frac{1}{\sqrt{\Number}} \bigl[\ket{1} \otimes \ket{0} \otimes \ldots \otimes \ket{0} \\ &\qquad \quad\;\; + \ket{0} \otimes \ket{1} \otimes \ldots \otimes \ket{0} \\ &\qquad \quad\;\; + \ldots \\ &\qquad \quad\;\; + \ket{0} \otimes \ket{0} \otimes \ldots \otimes \ket{1}\bigr], \end{aligned}\end{split}\]

from primitive \(\ket{0}\) states.

A quantum circuit diagram depicting the generation of a generalized W state.
A quantum circuit diagram depicting the generation of a generalized W state.

The complete unitary transformation described by this circuit is the product

(331)#\[\begin{split}\begin{aligned} \Unitary &= \NOT^{0} \cdot \Control^{0} \NOT^{1} \cdot \Control^{1} \NOT^{2} \cdot \ldots \cdot \Control^{\Number - 2} \NOT^{\Number - 1} \\ &\quad \cdot \; \Control^{\Number - 3} \Rotation_{y}^{\Number - 2}(\theta_{\Number - 2}) \cdot \ldots \cdot \Control^{1} \Rotation_{y}^{2}(\theta_{2}) \cdot \Control^{0} \Rotation_{y}^{1}(\theta_{1}) \cdot \Rotation_{y}^{0}(\theta_{0}) \\ &= \NOT^{0} \cdot \Biggl(\prod_{n = 1}^{\Number - 1} \Control^{n - 1} \NOT^{n} \Biggr) \cdot \Biggl(\prod_{n = \Number - 2}^{1} \Control^{n - 1} \Rotation_{y}^{n}(\theta_{n}) \Biggr) \cdot \Rotation_{y}^{0}(\theta_{0}). \end{aligned}\end{split}\]

where the \(y\)-rotation angles are given by \(\theta_n = 2 \arccos\left(\tfrac{1}{\sqrt{\Number - n}}\right)\).

Implementation#

Listing 12 /text/examples/algorithms/generation_w_general.py#
from qhronology.quantum.states import VectorState
from qhronology.quantum.gates import Rotation, Not
from qhronology.quantum.circuits import QuantumCircuit

num_systems = 4

# Input
zero_state = VectorState(spec=[(1, [0])], label="0")
input_states = [zero_state for i in range(0, num_systems)]

# Gates
ROTs = [
    Rotation(
        axis=2,
        angle=f"2*acos(sqrt(1/({num_systems})))",
        targets=[0],
        num_systems=num_systems,
    )
] + [
    Rotation(
        axis=2,
        angle=f"2*acos(sqrt(1/({num_systems} - {i})))",
        targets=[i],
        controls=[i - 1],
        num_systems=num_systems,
    )
    for i in range(1, num_systems - 1)
]
NOTs = [
    Not(
        targets=[num_systems - (i + 1)],
        controls=[num_systems - i - 2],
        num_systems=num_systems,
    )
    for i in range(0, num_systems - 1)
] + [
    Not(
        targets=[0],
        num_systems=num_systems,
    )
]

gates = ROTs + NOTs

# Circuit
generator = QuantumCircuit(inputs=input_states, gates=gates)
generator.diagram()

# Output
w_state = generator.state(label="W")
w_state.simplify()

# Results
w_state.print()

Output#

Diagram#

>>> generator.diagram()

State#

>>> w_state.print()
|W⟩ = 1/2|0,0,0,1⟩ + 1/2|0,0,1,0⟩ + 1/2|0,1,0,0⟩ + 1/2|1,0,0,0⟩