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.


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#
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⟩