线路变换
copy()、inverse()、dagger()、reverse()、repeat()、decompose() 和 control() 返回新线路;append()、prepend()、initialize() 和量子门方法原地修改线路。
选择方法前先区分两类操作:返回新线路的变换不会修改原对象,组合与初始化方法则会修改当前线路。
from unitarylab import Circuit
qc = Circuit(2)
qc.h(0)
qc.cx(0, 1)
qc_copy = qc.copy()
qc_inverse = qc.inverse()
qc_dagger = qc.dagger()
qc_reversed = qc.reverse()
qc_repeated = qc.repeat(3)
qc_decomposed = qc.decompose(n=1)
qc_controlled = qc.control(num_control_qubits=2, control_state="01")| 方法 | 说明 |
|---|---|
copy() | 返回独立拷贝 |
inverse() / dagger() | 反转门顺序并取共轭转置 |
reverse() | 镜像翻转量子比特索引,门顺序不变 |
repeat(times) | 重复整条线路 |
decompose(n, name) | 展开指定层数的块门 |
control(num_control_qubits, control_state=None) | 将整条线路包装成受控线路 |
append(other, target, ...) | 原地追加子线路 |
prepend(other, target, ...) | 原地前置子线路 |
initialize(state, target, ...) | 原地制备指定状态,目标比特必须尚未使用 |
inverse() 与 dagger() 等价,用于构造线路的共轭转置;包含测量等非酉操作的线路不能求逆。reverse() 只重映射量子比特位置,不反转门的时间顺序。
import numpy as np
sub = Circuit(2)
sub.z(0)
appended = qc.copy()
appended.append(sub, target=[0, 1])
prepared = Circuit(2)
state = np.array([1 / np.sqrt(2), 1 / np.sqrt(2)])
prepared.initialize(state, target=0)
prepared.cx(0, 1)执行器会在执行块门前展开其内容;需要绘制或分析块门内部结构时,可先调用 decompose()。
组合约束
append()、prepend()的target长度必须匹配子线路宽度,目标索引不能重复。- 可选
control位不能与target重叠;control_state长度必须匹配控制位数量。 repeat(times)要求times为正整数。initialize()的状态长度必须为 ,其中k为目标量子比特数;状态必须可归一化。decompose(n=...)只展开指定层数;重复调用或增大n可继续展开嵌套块门。
验证变换
对于小型无测量线路,可比较矩阵验证组合关系:
import numpy as np
identity = qc.copy()
identity.append(qc.inverse(), target=[0, 1])
assert np.allclose(identity.get_matrix(), np.eye(4))矩阵计算的内存随量子比特数指数增长,只适合小线路验证。
相关页面
最后更新于