核心概念#
本节介绍 Janus 的核心概念和设计理念,帮助你更好地理解和使用框架。
量子比特 (Qubit)#
量子比特是量子计算的基本信息单元,与经典比特不同,它可以处于 |0⟩ 和 |1⟩ 的叠加态。
from janus.circuit import Circuit
# 创建 3 个量子比特的电路,所有量子比特初始状态为 |0⟩
# 在同一层的门可以并行执行
qc = Circuit.from_layers([
[
{'name': 'h', 'qubits': [0], 'params': []}, # 操作 qubit 0
{'name': 'x', 'qubits': [1], 'params': []}, # 操作 qubit 1
{'name': 'z', 'qubits': [2], 'params': []}, # 操作 qubit 2
]
], n_qubits=3)
量子比特编号约定
在 Janus 中,量子比特从 0 开始编号。测量结果字符串中,最右边的位对应 qubit 0:
# 测量结果 '10' 表示:
# qubit 1 = 1, qubit 0 = 0
量子门 (Gate)#
量子门是作用在量子比特上的酉变换,是量子计算的基本操作。
单比特门
作用在单个量子比特上:
from janus.circuit import Circuit
qc = Circuit.from_layers([
[{'name': 'h', 'qubits': [0], 'params': []}], # Hadamard 门:创建叠加态
[{'name': 'x', 'qubits': [0], 'params': []}], # Pauli-X 门:比特翻转
[{'name': 'z', 'qubits': [0], 'params': []}], # Pauli-Z 门:相位翻转
[{'name': 'rx', 'qubits': [0], 'params': [1.57]}], # 绕 X 轴旋转 π/2
], n_qubits=1)
两比特门
作用在两个量子比特上,通常一个是控制比特,一个是目标比特:
qc = Circuit.from_layers([
[{'name': 'cx', 'qubits': [0, 1], 'params': []}], # CNOT:qubit 0 控制,qubit 1 目标
[{'name': 'cz', 'qubits': [0, 1], 'params': []}], # CZ:受控 Z 门
[{'name': 'swap', 'qubits': [0, 1], 'params': []}], # SWAP:交换两个量子比特的状态
], n_qubits=2)
多比特门
作用在三个或更多量子比特上:
qc = Circuit.from_layers([
[{'name': 'ccx', 'qubits': [0, 1, 2], 'params': []}], # Toffoli 门:双控制 X
[{'name': 'mcx', 'qubits': [0, 1, 2], 'params': []}], # 多控制 X 门
], n_qubits=3)
量子电路 (Circuit)#
量子电路是量子门的有序集合,描述了量子计算的完整过程。
电路结构
Janus 使用分层结构组织电路,同一层的门可以并行执行:
from janus.circuit import Circuit
# 使用 from_layers 创建电路,明确指定每层的门
qc = Circuit.from_layers([
[ # 第 0 层:三个门并行执行
{'name': 'h', 'qubits': [0], 'params': []},
{'name': 'x', 'qubits': [1], 'params': []},
{'name': 'z', 'qubits': [2], 'params': []},
],
[ # 第 1 层
{'name': 'cx', 'qubits': [0, 1], 'params': []},
],
], n_qubits=3)
电路属性
qc.n_qubits # 量子比特数
qc.depth # 电路深度(层数)
qc.n_gates # 门总数
qc.num_two_qubit_gate # 两比特门数量
qc.gates # 门列表
qc.layers # 分层表示
状态向量 (Statevector)#
状态向量是量子系统的数学描述,包含所有可能测量结果的概率幅。
对于 n 个量子比特,状态向量有 2^n 个复数分量:
from janus.simulator import Statevector
# 创建 |00⟩ 状态
sv = Statevector.from_label('00')
print(sv.data) # [1, 0, 0, 0]
# 创建 |+⟩ 状态(叠加态)
sv_plus = Statevector.from_label('+')
print(sv_plus.data) # [0.707, 0.707]
# 从电路获取状态向量
sv = Statevector.from_circuit(qc)
概率计算
测量结果的概率是概率幅的模方:
probs = sv.probabilities()
# probs[i] = |amplitude[i]|^2
密度矩阵 (DensityMatrix)#
密度矩阵可以描述混合态(统计混合),用于噪声模拟:
from janus.simulator import DensityMatrix, Statevector
# 从状态向量创建密度矩阵
sv = Statevector.from_label('00')
dm = DensityMatrix.from_statevector(sv)
# 密度矩阵属性
print(dm.purity()) # 纯度(1 表示纯态)
print(dm.is_pure()) # 是否纯态
print(dm.von_neumann_entropy()) # 冯诺依曼熵
参数化电路 (Parameterized Circuit)#
参数化电路使用符号参数代替具体数值,可在运行时绑定:
from janus.circuit import Circuit, Parameter
# 创建参数
theta = Parameter('theta')
# 创建参数化电路
qc = Circuit.from_layers([
[{'name': 'ry', 'qubits': [0], 'params': [theta]}],
], n_qubits=1)
# 检查参数
print(qc.parameters) # {Parameter(theta)}
print(qc.is_parameterized()) # True
# 绑定参数
bound_qc = qc.bind_parameters({theta: 1.57})
参数表达式
参数支持数学运算:
from janus.circuit import Parameter
theta = Parameter('theta')
phi = Parameter('phi')
# 参数表达式
expr = 2 * theta + phi
expr = theta / 2
DAG 表示#
有向无环图 (DAG) 是电路的另一种表示,便于分析和优化:
from janus.circuit import circuit_to_dag, dag_to_circuit
# 电路转 DAG
dag = circuit_to_dag(qc)
# DAG 属性
print(dag.depth()) # 深度
print(dag.count_ops()) # 门统计
# 遍历节点
for node in dag.op_nodes():
print(node.name, node.qubits)
# DAG 转回电路
qc2 = dag_to_circuit(dag)
噪声模型 (NoiseModel)#
噪声模型描述量子计算机中的各种错误:
from janus.simulator import NoiseModel, depolarizing_channel
noise_model = NoiseModel()
# 去极化噪声:以概率 p 随机应用 X, Y, Z 门
noise_model.add_all_qubit_quantum_error(
depolarizing_channel(0.01), # 1% 错误率
['h', 'x', 'rx'] # 应用到这些门
)
常见噪声类型
去极化噪声: 随机 Pauli 错误
振幅阻尼: 能量衰减 (T1)
相位阻尼: 相位丢失 (T2)
比特翻转: 随机 X 错误
相位翻转: 随机 Z 错误
电路优化#
电路优化通过变换减少门数量或深度:
from janus.compiler import compile_circuit
# 优化级别
# 0: 无优化
# 1: 基础优化(消除恒等门、逆门对)
# 2: 高级优化(合并旋转门)
optimized = compile_circuit(qc, optimization_level=2)
优化 Pass
优化由多个 Pass 组成,每个 Pass 执行特定变换:
from janus.compiler.passes import (
RemoveIdentityPass,
CancelInversesPass,
MergeRotationsPass
)
# 自定义优化流程
optimized = compile_circuit(qc, passes=[
RemoveIdentityPass(),
CancelInversesPass(),
MergeRotationsPass(),
])