首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Cirq/Tensorflow量子中实现受控Rx?

如何在Cirq/Tensorflow量子中实现受控Rx?
EN

Stack Overflow用户
提问于 2020-05-17 13:29:44
回答 1查看 781关注 0票数 2

我试图在Cirq/Tensorflow量子中实现一个受控旋转门。

readthedocs.io at https://cirq.readthedocs.io/en/stable/gates.html指出:

可以使用Gate.controlled()将盖茨转换为受控版本。通常,这会返回一个ControlledGate实例。但是,对于某些特殊情况,该门的受控版本也是一个已知的门,则返回该门的实例。例如,cirq.X.controlled()返回一个cirq.CNOT门。操作具有类似的功能Operation.controlled_by(),例如圆环X(Q0).controlled_by(Q1)。

我已经实施了

代码语言:javascript
复制
cirq.rx(theta_0).on(q[0]).controlled_by(q[3])

我得到以下错误:

代码语言:javascript
复制
~/.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'>

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

代码语言:javascript
复制
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量子中正确地实现受控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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-19 00:15:59

你有一个完全正确的实现控制X旋转在Cirq。它可以用于仿真和其他事情,如cirq.unitary,没有任何问题。

TFQ只支持Cirq中的一个门子集。例如,一个cirq.ControlledGate可以有任意数量的控制量子位,在某些情况下,这会使分解成与NiSQ硬件平台兼容的原始门变得更加困难(这就是为什么cirq.decompose不对ControlledOperations做任何事情)。TFQ只支持这些原始样式的门,对于支持的门的完整列表,您可以这样做:

代码语言:javascript
复制
tfq.util.get_supported_gates().keys()

在您的例子中,可以更简单地实现这个门。首先,我们可以注意到,cirq.rx(some angle)等于由全局相位抵消的cirq.X**(some angle / pi)

代码语言:javascript
复制
>>> 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。我们要做的行动是:

代码语言:javascript
复制
>>> 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支持的门中,它应该是可序列化的,没有任何问题。如果您想要制作一个符号化的大门版本,您只需用一个sympy.Symbol替换0.3。

后续回答:如果你想要做一个CRz,你可以做同样的事情,做上面做的事,把CNOT门换成CZ门。对于CRy来说,这并不容易。为此,我建议做一些组合: cirq.Y(0)和cirq.YY(0,1)。

编辑: tfq-nightly构建并可能在0.4.0之后发布,现在包含了对任意控制门的支持。因此,在tfq的这些版本上,您现在也可以做一些像cirq.Y(...).controlled_by(...)这样的事情来达到预期的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61852590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档