Qiskit 中有该transpile()
功能(请参阅文档)。我对转译器的最好理解是一种将一组门操作转换为另一组门操作的方法,其目的是在不同的后端运行算法(因为量子位连接性,即架构的几何形状,从一台量子计算机到另一台)。有多种方法可以通过减少冗余和根据等效门重写事物来优化电路,例如将哈达玛门共轭的 CNOT 更改为 CZ 以减少门数。如果硬件后端没有本机 CZ,人们可能还想做完全相反的事情,从 CZ 转到由 Hadamards 共轭的 CNOT。一般来说,这种为了优化某些固定硬件后端的任意电路而进行的转译是一个 QMA 完全问题(例如,参见此处......也许有人使用LEAN来完成类似的事情?)。有时也使用变分方法来近似最佳电路,但我离题了。
一个略有不同但相关的问题:使用Nielsen & Chuang附录 3 中的 Kitaev-Solovay 定理以及 4.5 中的材料,我们知道我们总是可以“有效地”用通用门集逼近任意酉门(这在书,在这里不一定重要)。我认为效率如何是一个悬而未决的问题,但至少有一些上限和下限。
鉴于此,人们期望 Qiskittranspile()
函数能够近似单一门并将门集重构为最佳(最小化)门集以优化电路,但可能会在具有许多非标准门的大型电路中出现问题。但是,即使对于简单的示例,我也无法使其正常工作。例如,三个量子位上的置换矩阵似乎是一个合理的酉近似(有些甚至可以轻松地手动转换为交换门和 X 门)。但 Qiskit 似乎不喜欢这样做,我需要一些帮助来理解原因。举个例子,我们可以在 Qiskit 中定义一个酉(置换)算子,并将其变成量子电路中的门,如下所示:
from qiskit import *
from qiskit.quantum_info import Operator
from qiskit.compiler import transpile
%matplotlib inline
permute = Operator([[0, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, …
Run Code Online (Sandbox Code Playgroud)