1

我有一个带有两个寄存器mq的电路。

from qiskit import execute, Aer, IBMQ, QuantumCircuit

m = QuantumRegister(3, "m")
q = QuantumRegister(3, "q")
cl = ClassicalRegister(2, "cl")
circ = QuantumCircuit( m, q,cl)

circ.x([q[0],q[1],q[2]]) 

我如何在 Qiskit 中交换它们,使量子比特的顺序变为m 0q 0m 1q 1m 2q 2

4

1 回答 1

0

如果问题是关于添加SWAP门然后恢复交换,您可以在前面创建一个交换电路,然后放置重新映射的电路,然后完成第一个电路的逆。这是过程:

  1. 用门创建一个电路SWAP

调用的转译器通道LayoutTransformation允许创建由SWAP门组成的电路,这些门将布局更改为另一个布局([0, 2, 4, 1, 3, 5]在本例中为 )。使用起来有点晦涩难懂。如果您想了解更多信息,请告诉我:

from qiskit.transpiler.passes import LayoutTransformation
from qiskit.transpiler import Layout, CouplingMap

swap_front = QuantumCircuit(circ.num_qubits)

layout_transformation = LayoutTransformation(CouplingMap.from_full(circ.num_qubits),
                     Layout.generate_trivial_layout(*circ.qregs),
                     Layout.from_intlist([0, 2, 4, 1, 3, 5], *circ.qregs))
swap_front = layout_transformation(swap_front).inverse()
swap_front.barrier() # you can remove this line. Only here for didactic purpose
swap_front.draw('mpl')

在此处输入图像描述

  1. 将您的电路重新映射到新布局:
from qiskit import transpile

new_circ = transpile(circ, initial_layout=[0, 2, 4, 1, 3, 5])
new_circ.draw('mpl')

在此处输入图像描述

使用该参数initial_layout,您可以为寄存器中的每个量子位选择一个物理量子位。在这种情况下m_0 -> 0m_1 -> 2...

  1. 撤消交换:

如果电路是可逆的,您可以使用 方法将其反转inverse。第一个电路的逆可以撤消交换

swap_back = swap_front.inverse()
swap_back.draw('mpl')

在此处输入图像描述

  1. 放在一起:
final = swap_front + new_circ + swap_back
final.draw('mpl')

在此处输入图像描述

于 2021-03-29T19:23:52.240 回答