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


只怕再见是故人
2025-04-07 06:42:34 (1天前)

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

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

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

我已经实施

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

我收到以下错误:


  1. ~/.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

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


  1. 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的标签

后续行动:这如何推广到受控Ry和受控Rz的类似情况?

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

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

2 条回复
  1. 1# 春风助手 | 2020-08-21 15-40

    您所拥有的是在Cirq中完全正确实施X轴受控旋转的方法。它可以用于仿真和其他类似的东西cirq.unitary而没有任何问题。

    TFQ仅支持Cirq中的一部分门。例如,a cirq.ControlledGate可以具有任意数量的控制qubit,在某些情况下,这会使分解为与NiSQ硬件平台兼容的原始门变得更加困难(这就是为什么cirq.decompose不做任何事情ControlledOperations)。TFQ仅支持这些原始样式门,有关受支持门的完整列表,您可以执行以下操作:

    1. tfq.util.get_supported_gates().keys()

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

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

    现在开始使用X。那么我们要执行的操作是:

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

    由于cirq.CNOT在TFQ支持的门中,因此应该可序列化而没有任何问题。如果要制作门的符号版本,只需将0.3替换为即可sympy.Symbol。

    后续答案:如果您想做一个CRz,您可以做与上面相同的事情,将CNOT门换成CZ门。对于CRy而言,这并不容易。为此,我建议进行以下组合:cirq.Y(0)和cirq.YY(0,1)。

登录 后才能参与评论