将一个Cirq量子电路分解

3

我正在使用Cirq进行工作,需要在量子比特上执行某些幺正操作。为此,我在Cirq中使用MatrixGate()函数。与Qiskit不同的是,我找不到任何像分解或转换这样的函数,以将幺正操作简化为基本的U3和CNOT门。

例如,如果我想对以下幺正算符进行操作:

幺正算符

我在Qiskit中使用以下代码来完成此操作。请帮忙查找在Cirq中相当的功能。

qc=QuantumCircuit(2)
qc.unitary(U,[0,1])
qc=transpile(qc,basis_gates=['cx','u3'])
qc.draw(output='mpl')

酉门

在使用Qiskit的Transpile函数之后

转置后的酉门

我甚至尝试过使用Qiskit用于分解这些酉操作的余弦-正弦分解算法。正如论文《用于等距映射的量子电路》中所述,但它们不会轻易地产生所需的分解。请通过以下方式提供帮助:

  1. 一些在Cirq中分解电路的代码或者
  2. 将Qiskit电路导出到Cirq或者
  3. 一个更简单的分解酉操作的算法。

只是好奇,你为什么需要去Cirq? - met927
@met927 我正在使用 Tensorflow Quantum 进行工作,它使用 cirq 后端创建量子电路。TFQ 不接受 MatrixGate(),因此我想将其分解为更简单的门。 - Vinit Singh
1个回答

4
一个这样的方法示例是 cirq.two_qubit_matrix_to_operations。它使用kak分解(cartan分解)来确定如何将一个酉矩阵转换为最少数量的CZ门操作序列。
import cirq

desired_matrix = cirq.testing.random_unitary(dim=4)

synthesized_operations = cirq.two_qubit_matrix_to_operations(
    cirq.LineQubit(0),
    cirq.LineQubit(1),
    desired_matrix,
    allow_partial_czs=False,
)
circuit = cirq.Circuit(synthesized_operations)

synthesized_matrix = cirq.unitary(circuit)

cirq.testing.assert_allclose_up_to_global_phase(
    desired_matrix,
    synthesized_matrix,
    atol=1e-4
)

print(desired_matrix.round(3))
print(circuit)

输出(例如):

[[ 0.234-0.169j -0.81 +0.038j -0.327+0.138j -0.364-0.029j]
 [-0.503-0.407j  0.221-0.206j  0.063+0.144j -0.629-0.264j]
 [ 0.271+0.338j  0.337-0.128j -0.343+0.731j -0.165+0.052j]
 [ 0.504+0.236j  0.222+0.269j  0.244-0.371j -0.608-0.043j]]
0: ───PhX(-0.283)^0.631───@───PhX(0.673)^0.5────@───PhX(-0.375)^0.5───@───PhX(0.827)^0.147───Z^-0.269───
                          │                     │                     │
1: ───PhX(0.508)^0.338────@───PhX(0.65)^(5/6)───@───PhX(0.65)^0.995───@───PhX(0.302)^0.512───Z^-0.516───

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接