You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PennyLane中为MultiControlledX分解添加辅助量子比特适配IBM硬件?

解决方案

问题根源

当使用3个及以上控制比特的受控门时,真实量子硬件无法直接支持这类多控门,必须分解为CNOT、单比特门等基础门,这个分解过程需要辅助量子比特(工作比特)。你之前的问题在于:

  • 硬编码了工作比特编号(5、6),当nq变化时,这些编号可能超出设备实际分配的线路范围
  • 没有正确对应设备初始化时的线路数量与工作比特索引

修改步骤

  1. 规范工作比特索引:将辅助比特安排在主量子比特之后,比如主比特用0~nq-1,辅助比特用nq、nq+1,避免硬编码导致的索引越界
  2. 确保设备线路数足够:初始化设备时明确包含主比特+辅助比特的总数量
  3. 正确传递工作比特参数:在qml.ctrl中使用正确的辅助比特索引,确保分解过程能调用到这些线路

修改后的代码

def uqs_ibm(nq: int, shots: int):
    # 主量子比特数nq,添加2个辅助比特(适配3控门的分解需求)
    total_wires = nq + 2
    dev = qml.device('qiskit.ibmq', wires=total_wires, shots=shots, backend='ibm_kyoto', ibmqx_token="XXX")

    @qml.qnode(dev)
    def circuit():
        qml.RY(theta_1 * 2, wires=0)
        
        for i in range(1, nq):
            qml.ctrl(qml.Hadamard(i), (0))

        qml.ctrl(qml.RY, control=(0), control_values=(1))(theta_1, wires=1)
        
        for i in range(2, nq):
            qml.ctrl(qml.Hadamard(i), control=(0, 1), control_values=(0, 1))
            
        qml.ctrl(qml.RY, control=(0, 1), control_values=(0, 0))(theta_2, wires=2)
        
        # 使用主比特之后的线路作为工作比特,避免硬编码
        work_wire_1 = nq
        work_wire_2 = nq + 1
        qml.ctrl(qml.Hadamard, control=(0, 1, 2), control_values=(0, 0, 1), work_wires=work_wire_1)(wires=3)
        qml.ctrl(qml.Hadamard, control=(0, 1, 2), control_values=(0, 0, 1), work_wires=work_wire_2)(wires=4)
        
        return qml.probs(wires=range(nq))

    return circuit

额外说明

  • 辅助比特不需要额外施加Identity门,量子设备初始化时所有线路默认处于|0>态,满足分解需求
  • 如果多个多控门可以共享辅助比特(只要门之间没有时序冲突),可以减少辅助比特的数量,比如两个3控门共用1个辅助比特,此时total_wires设为nq+1即可,两个qml.ctrl都用同一个work_wires值

内容的提问来源于stack exchange,提问作者Jiseok Song

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:17:15