如何在sympy.physics.quantum.gate中创建受控Z门及自定义受控量子门
SymPy量子受控门与自定义旋转门实现方案
受控Z门构造与报错修复
原代码报错核心原因是CGate传参格式错误:sympy.physics.quantum.gate.CGate的参数签名为CGate(控制比特序列, 目标比特位置, 目标门实例),三个参数需独立传入,不能打包为单个元组。
- 单控制位受控Z门可直接使用内置类实现:
CZ(control_bit, target_bit),例如控制位0、目标位1的CZ门直接写CZ(0,1),调用represent(CZ(0,1), nqubits=2)即可输出标准CZ矩阵。
- 多控制位受控Z门(如双控CCZ门)的正确写法示例:
from sympy.physics.quantum.gate import CGate, Z from sympy.physics.quantum import represent # 控制位为0、1,目标位为2的三比特CCZ门 ccz = CGate((0,1), 2, Z(2)) # 输出验证8x8矩阵,对角元最后一位为-1,其余为1 print(represent(ccz, nqubits=3))
通用多控任意门构造方法
CGate天然支持嵌入任意合法的单/多量子比特门实例,不管是内置门还是自定义UGate都可以作为第三个参数传入,只需要保证目标门的作用比特位置和CGate传入的目标比特位置一致即可,完全满足多控制位、嵌入任意量子门的需求。
自定义X轴旋转门可参考如下修正后的实现,可直接配合受控逻辑使用:
from sympy import cos, sin, symbols, pi, I from sympy.physics.quantum.gate import X, Z, UGate, CGate, Identity from sympy.physics.quantum import represent theta = symbols('theta', real=True) def Rx(qubit_pos, angle=theta): """X轴旋转门 Args: qubit_pos: 门作用的比特索引位置 angle: 旋转角度,默认保留为符号变量theta Returns: UGate实例形式的Rx门 """ # 直接取内置单比特单位矩阵、泡利X矩阵,无需手动定义 Id = represent(Identity(1), nqubits=1) X_mat = represent(X(0), nqubits=1) rot_matrix = cos(angle/2)*Id - I*sin(angle/2)*X_mat return UGate((qubit_pos,), rot_matrix) # 构造单控Rx门:控制位0,目标位1,旋转角度pi/2 c_rx = CGate((0,), 1, Rx(1, angle=pi/2)) # 构造双控Rx门:控制位0、1,目标位2,旋转角度为符号变量theta cc_rx = CGate((0,1), 2, Rx(2, angle=theta)) # 验证矩阵输出 print(represent(c_rx, nqubits=2))
其中用到的泡利X矩阵形式为:
原代码运行报错属于参数传参格式错误,报错信息参考:
补充说明
- 若需要实现「控制位为0时触发门」的低电平有效受控门,可直接替换为
CGateS类,传参逻辑和CGate完全一致。 - 任意轴旋转门都可以参考Rx的写法,替换对应旋转矩阵的生成逻辑即可,都可以直接传入CGate作为受控目标门。
内容的提问来源于stack exchange,提问作者Dara O h
相关产品推荐
相关产品推荐

