quantum-computing - 如何在 Cirq/Tensorflow Quantum 中实现受控 Rx?
问题描述
我正在尝试在 Cirq/Tensorflow Quantum 中实现受控旋转门。
https://cirq.readthedocs.io/en/stable/gates.html上的 readthedocs.io声明:
“可以使用 Gate.controlled() 将门转换为受控版本。通常,这会返回 ControlledGate 的实例。但是,对于某些特殊情况,门的受控版本也是已知门,这将返回“
我已经实施
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?
PS 我找不到 Google Cirq 的标签
追问:这如何推广到 Controlled Ry 和 Controlled 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 中的门子集。例如,acirq.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(...)
来达到预期的结果。
推荐阅读
- powershell - 通过 Powershell 将文件从一个文件夹复制到多个文件夹
- python - 如何在数据框中添加新列时应用“And”和“Or”等条件语句?
- laravel - 在 Laravel 中自定义表名多态多对多关系?
- python - 如何去掉年、月、日?
- mysql - 如果我过滤掉不会在更新中更改的记录,会有什么不同吗?
- postgresql - PgPool-II 后端认证失败
- http - HTTP 状态 451 是暂时不可用的函数的正确代码吗?
- azure-data-factory - 数据工厂 - Azure 文件链接服务 - 托管标识
- javascript - 如何为 React useEffect 中的代码编写 Jest-enzyme 测试用例,其依赖项在其子组件中更新
- java - 如何分离设备中安装的社交媒体应用程序和游戏应用程序