3

我正在研究 Cirq,需要对 qubits 执行某些单一操作。为此,我正在使用MatrixGate()Cirq 中的函数。与 Qiskit 不同,我找不到像分解或转换这样的函数来将 Unitary 操作简化为基本的 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. 将 Qiksit 电路导出到 Cirq 或
  3. 一种更简单的分解酉操作的算法。
4

1 回答 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───
于 2020-05-17T10:27:13.700 回答