quantum-computing - 如何在 Cirq/Tensorflow Quantum 中实现受控 Rx?

标签 quantum-computing tensorflow-quantum cirq

我正在尝试在 Cirq/Tensorflow Quantum 中实现受控旋转门。

readthedocs.io https://cirq.readthedocs.io/en/stable/gates.html状态:

“可以使用 Gate.control() 将门转换为受控版本。一般来说,这会返回 ControlledGate 的实例。但是,对于某些特殊情况,其中门的受控版本也是已知门,这将返回该门的实例。例如,cirq.X.control() 返回 cirq.CNOT 门。操作具有类似的功能 Operation.control_by(),例如 cirq.X(q0).control_by(q1)。”

我已经实现了

cirq.rx(theta_0).on(q[0]).controlled_by(q[3])

我收到以下错误:

~/.local/lib/python3.6/site-packages/cirq/google/serializable_gate_set.py in 
serialize_op(self, op, msg, arg_function_language)
    193                         return proto_msg
    194         raise ValueError('Cannot serialize op {!r} of type {}'.format(
--> 195             gate_op, gate_type))
    196 
    197     def deserialize_dict(self,

ValueError: Cannot serialize op cirq.ControlledOperation(controls=(cirq.GridQubit(0, 3),), sub_operation=cirq.rx(sympy.Symbol('theta_0')).on(cirq.GridQubit(0, 0)), control_values=((1,),)) of type <class 'cirq.ops.controlled_gate.ControlledGate'>

我将量子位和符号初始化为:

q = cirq.GridQubit.rect(1, 4)
symbol_names = x_0, x_1, x_2, x_3, theta_0, theta_1, z_2, z_3

我确实将这些电路与各种电路一起重复使用。

我的问题:如何在 Cirq/Tensorflow Quantum 中正确实现受控 Rx?

附注我找不到 Google Cirq 的标签

跟进: 这如何推广到受控 Ry 和受控 Rz 的类似情况?

对于 Rz,我在 https://threeplusone.com/pubs/on_gates.pdf 处发现了门分解,涉及 H.on(q1)、CNOT(q0, q1)、H.on(q2),但这还不是具有任意角度的 CRz。我可以在 H 之前介绍一下角度吗?

对于 Ry,我还没有找到分解,CRy 也没有。

最佳答案

您所拥有的是 Cirq 中受控 X 旋转的完全正确的实现。它可以用于模拟和其他事情,例如 cirq.unitary没有任何问题。

TFQ 仅支持 Cirq 中的门的子集。例如 cirq.ControlledGate可以具有任意数量的控制量子位,这在某些情况下可能会更难分解为与 NiSQ 硬件平台兼容的原始门(这就是 cirq.decompose 不对 ControlledOperations 执行任何操作的原因)。 TFQ 仅支持这些原始样式的门,有关支持的门的完整列表,您可以执行以下操作:

tfq.util.get_supported_gates().keys()

就您的情况而言,可以提出此门的更简单的实现。首先我们可以注意到cirq.rx(some angle)等于cirq.X**(some angle / pi)由全局相位抵消:

>>> a = cirq.rx(0.3)
>>> b = cirq.X**(0.3 / np.pi)
>>> cirq.equal_up_to_global_phase(cirq.unitary(a), cirq.unitary(b))
True

现在让我们开始使用 X。那么我们接下来的操作就是:

>>> qs = cirq.GridQubit.rect(1,2)
>>> a = (cirq.X**0.3)(qs[0]).controlled_by(qs[1])
>>> b = cirq.CNOT(qs[0], qs[1]) ** 0.3
>>> cirq.equal_up_to_global_phase(cirq.unitary(a), cirq.unitary(b))
True

cirq.CNOT在 TFQ 支持的门中,它应该可以序列化,没有任何问题。如果你想制作门的符号版本,只需将 0.3 替换为 sympy.Symbol .

后续回答:如果您想做 CRz,您可以执行与上面相同的操作,将 CNOT 门换成 CZ 门。对于 CRy 来说,事情就没那么容易了。为此,我建议进行某种组合:cirq.Y(0) 和 cirq.YY(0, 1)。

编辑: tfq-nightly 0.4.0 之后的版本和可能的版本现在包括对任意控制门的支持。因此,在这些版本的 tfq 上,您还可以执行类似 cirq.Y(...).controlled_by(...) 的操作现在也能达到预期的结果。

关于quantum-computing - 如何在 Cirq/Tensorflow Quantum 中实现受控 Rx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61852590/

相关文章:

simulation - 量子计算机的软件模拟

python - 如何在 Cirq 电路中采用经典输入

encryption - 量子计算和加密破解

python - 编码德语算法

quantum-computing - 是否可以使用 Q# 来控制自己的量子计算机?