快速入门#

本教程将带你快速了解 Janus 的核心功能,预计阅读时间 10 分钟。

第一步:创建量子电路#

量子电路是量子计算的基本单元。让我们从创建一个简单的电路开始:

from janus.circuit import Circuit
import numpy as np

# 使用 from_layers 创建电路
# 每个列表元素代表一层,同一层的门可以并行执行
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],           # 第 0 层:H 门
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],       # 第 1 层:CNOT 门
    [{'name': 'rx', 'qubits': [0], 'params': [0.785]}],     # 第 2 层:RX(π/4) 门
], n_qubits=2)

# 查看电路
print(qc.draw())

输出:

q0: ─H─●─Rx(0.79)─
      │
q1: ───X───────────

小技巧

from_layers 方法使用分层结构创建电路,每层是一个门列表。门的格式为 {'name': '门名', 'qubits': [量子比特], 'params': [参数]}

第二步:运行模拟#

创建电路后,使用模拟器运行它:

from janus.simulator import StatevectorSimulator

# 创建模拟器
sim = StatevectorSimulator()

# 运行电路,测量 1000 次
result = sim.run(qc, shots=1000)

# 查看测量结果
print(result.counts)
# 输出类似: {'00': 503, '11': 497}

# 获取最终状态向量
sv = sim.statevector(qc)
print(sv.probabilities())
# 输出: [0.5, 0.0, 0.0, 0.5]

备注

shots 参数指定测量次数。由于量子测量的概率性,每次运行结果可能略有不同。

第三步:参数化电路#

参数化电路允许你创建可调节的量子电路,这在变分量子算法中非常有用:

from janus.circuit import Circuit, Parameter
import numpy as np

# 创建参数
theta = Parameter('theta')
phi = Parameter('phi')

# 创建参数化电路
qc = Circuit.from_layers([
    [{'name': 'ry', 'qubits': [0], 'params': [theta]}],   # 参数化 RY 门
    [{'name': 'rx', 'qubits': [1], 'params': [phi]}],     # 参数化 RX 门
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],     # CNOT 门
], n_qubits=2)

# 查看电路参数
print(f"电路参数: {qc.parameters}")
print(f"是否参数化: {qc.is_parameterized()}")

# 方法 1:绑定参数创建新电路
bound_qc = qc.bind_parameters({theta: np.pi/2, phi: np.pi/4})

# 方法 2:在模拟时绑定参数
sim = StatevectorSimulator()
result = sim.run(qc, shots=100, parameter_binds={
    'theta': np.pi/2,
    'phi': np.pi/4
})

第四步:电路优化#

Janus 提供电路优化功能,可以减少门数量:

from janus.circuit import Circuit
from janus.compiler import compile_circuit
import numpy as np

# 创建一个有冗余的电路
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
    [{'name': 'h', 'qubits': [0], 'params': []}],              # 两个 H 门相消
    [{'name': 'rz', 'qubits': [0], 'params': [0.785]}],        # π/4
    [{'name': 'rz', 'qubits': [0], 'params': [0.785]}],        # 两个 RZ 门可以合并
], n_qubits=2)

print(f"优化前: {qc.n_gates} 个门")

# 优化电路
optimized = compile_circuit(qc, optimization_level=2)
print(f"优化后: {optimized.n_gates} 个门")

优化级别说明:

  • 级别 0: 无优化

  • 级别 1: 移除恒等门、消除逆门对

  • 级别 2: 级别 1 + 合并连续旋转门

第五步:噪声模拟#

真实的量子计算机存在噪声。Janus 支持噪声模拟:

from janus.circuit import Circuit
from janus.simulator import NoisySimulator, NoiseModel, depolarizing_channel

# 创建电路
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)

# 创建噪声模型
noise_model = NoiseModel()

# 为单比特门添加 1% 去极化噪声
noise_model.add_all_qubit_quantum_error(
    depolarizing_channel(0.01),
    ['h', 'x', 'rx', 'ry', 'rz']
)

# 为两比特门添加 2% 去极化噪声
noise_model.add_all_qubit_quantum_error(
    depolarizing_channel(0.02),
    ['cx', 'cz']
)

# 噪声模拟
noisy_sim = NoisySimulator(noise_model, seed=42)
result = noisy_sim.run(qc, shots=1000)

print(result.counts)
# 输出会包含一些错误结果,如 {'00': 480, '11': 470, '01': 25, '10': 25}

第六步:保存和加载电路#

Janus 提供便捷的电路文件操作函数:

from janus.circuit import Circuit, load_circuit, save_circuit, list_circuits

# 创建电路
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)

# 保存电路
save_circuit(qc, 'my_bell.json')

# 列出预置电路
print(list_circuits())  # ['bell', 'test']

# 加载预置电路
bell = load_circuit(name='bell')

# 加载自定义电路
qc_loaded = load_circuit(filepath='my_bell.json')

完整示例:Bell 态#

让我们把所有内容整合到一个完整的例子中:

"""
创建、模拟和分析 Bell 态
"""
from janus.circuit import Circuit
from janus.simulator import StatevectorSimulator, Statevector
import numpy as np

# 1. 创建 Bell 态电路
qc = Circuit.from_layers([
    [{'name': 'h', 'qubits': [0], 'params': []}],
    [{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)

print("=== Bell 态电路 ===")
print(qc.draw())
print(f"电路深度: {qc.depth}")
print(f"门数量: {qc.n_gates}")

# 2. 模拟
sim = StatevectorSimulator(seed=42)
result = sim.run(qc, shots=10000)

print("\n=== 测量结果 ===")
print(f"测量统计: {result.counts}")

# 3. 分析状态向量
sv = sim.statevector(qc)
print("\n=== 状态向量分析 ===")
print(f"状态向量: {sv}")
print(f"概率分布: {sv.probabilities()}")

# 4. 验证纠缠
# Bell 态应该只有 |00⟩ 和 |11⟩,概率各 50%
probs = sv.probabilities()
assert abs(probs[0] - 0.5) < 0.01, "P(00) 应该约为 0.5"
assert abs(probs[3] - 0.5) < 0.01, "P(11) 应该约为 0.5"
print("\n✓ Bell 态验证通过!")

下一步#

恭喜你完成了快速入门!接下来可以: