Source code for qlearnkit.circuits.swap_test_circuit
from qiskit import QuantumCircuit
from typing import Optional
[docs]class SwaptestCircuit(QuantumCircuit):
r"""
Constructs a swap test circuit employing a controlled
swap:
.. parsed-literal::
┌───┐ ┌───┐┌─┐
q_0: ────┤ H ├─────■─┤ H ├┤M├
┌───┴───┴───┐ │ └───┘└╥┘
q_1: ┤ circuit-0 ├─X───────╫─
├───────────┤ │ ║
q_2: ┤ circuit-1 ├─X───────╫─
└───────────┘ ║
c: 1/══════════════════════╩═
0
A swap test circuit allows to measure the fidelity between two quantum
states, which can be interpreted as a distance measure of some sort.
In other words, given two quanutm states :math:`|\alpha\rangle, \ |\beta\rangle`,
it measures how symmetric the state :math:`|\alpha\rangle \otimes |\beta\rangle` is
"""
def __init__(self,
qc_state_1: QuantumCircuit,
qc_state_2: QuantumCircuit,
name: Optional[str] = None):
n_total = qc_state_1.num_qubits + qc_state_2.num_qubits
super().__init__(n_total + 1, 1, name=name)
range_qc1 = [i + 1 for i in range(qc_state_1.num_qubits)]
range_qc2 = [i + qc_state_1.num_qubits + 1 for i in range(qc_state_1.num_qubits)]
self.compose(qc_state_1, range_qc1, inplace=True)
self.compose(qc_state_2, range_qc2, inplace=True)
# first apply hadamard
self.h(0)
# then perform controlled swaps
for index, qubit in enumerate(range_qc1):
self.cswap(0, qubit, range_qc2[index])
# eventually reapply hadamard
self.h(0)
# Measurement on the auxiliary qubit
self.measure(0, 0)