实用示例#
本节提供一系列完整的量子计算示例,帮助你理解如何使用 Janus 解决实际问题。
Bell 态和量子纠缠#
Bell 态是最简单的量子纠缠态,由两个量子比特组成:
from janus.circuit import Circuit
from janus.simulator import StatevectorSimulator
def create_bell_state(bell_type='00'):
"""
创建四种 Bell 态之一
Args:
bell_type: '00' (Φ+), '01' (Φ-), '10' (Ψ+), '11' (Ψ-)
Returns:
Circuit: Bell 态电路
"""
layers = []
# 第一层:H 门和可选的 X 门
layer0 = [{'name': 'h', 'qubits': [0], 'params': []}]
if bell_type[0] == '1':
layer0.append({'name': 'x', 'qubits': [0], 'params': []})
if bell_type[1] == '1':
layer0.append({'name': 'x', 'qubits': [1], 'params': []})
layers.append(layer0)
# 第二层:CNOT 门
layers.append([{'name': 'cx', 'qubits': [0, 1], 'params': []}])
return Circuit.from_layers(layers, n_qubits=2)
# 创建并模拟 Bell 态
sim = StatevectorSimulator(seed=42)
for bell_type in ['00', '01', '10', '11']:
qc = create_bell_state(bell_type)
result = sim.run(qc, shots=1000)
print(f"Bell 态 {bell_type}: {result.counts}")
GHZ 态#
GHZ 态是多量子比特纠缠态的推广:
from janus.circuit import Circuit
from janus.simulator import StatevectorSimulator
def create_ghz_state(n_qubits):
"""
创建 n 量子比特的 GHZ 态
GHZ 态: (|00...0⟩ + |11...1⟩) / √2
"""
layers = []
# 第一层:H 门
layers.append([{'name': 'h', 'qubits': [0], 'params': []}])
# 后续层:级联 CNOT 门
for i in range(n_qubits - 1):
layers.append([{'name': 'cx', 'qubits': [i, i + 1], 'params': []}])
return Circuit.from_layers(layers, n_qubits=n_qubits)
# 创建 5 量子比特 GHZ 态
qc = create_ghz_state(5)
print(qc.draw())
sim = StatevectorSimulator()
result = sim.run(qc, shots=1000)
print(f"GHZ 态测量结果: {result.counts}")
# 应该只有 '00000' 和 '11111'
量子隐形传态#
量子隐形传态是量子通信的基础协议:
from janus.circuit import Circuit
from janus.simulator import StatevectorSimulator
import numpy as np
def quantum_teleportation(theta, phi):
"""
量子隐形传态协议
将 qubit 0 的状态传送到 qubit 2
"""
layers = [
# 准备要传送的状态(在 qubit 0 上)
[
{'name': 'ry', 'qubits': [0], 'params': [theta]},
{'name': 'rz', 'qubits': [0], 'params': [phi]},
],
# 创建 Bell 对(qubit 1 和 qubit 2)
[{'name': 'h', 'qubits': [1], 'params': []}],
[{'name': 'cx', 'qubits': [1, 2], 'params': []}],
# Alice 的操作
[{'name': 'cx', 'qubits': [0, 1], 'params': []}],
[{'name': 'h', 'qubits': [0], 'params': []}],
]
return Circuit.from_layers(layers, n_qubits=3)
# 传送状态 |+⟩
qc = quantum_teleportation(np.pi/2, 0)
print("量子隐形传态电路:")
print(qc.draw())
Grover 搜索算法#
Grover 算法可以在无序数据库中进行二次加速搜索:
from janus.circuit import Circuit
from janus.simulator import StatevectorSimulator
import numpy as np
def grover_search_2qubit(marked_state='11'):
"""
2 量子比特 Grover 搜索
Args:
marked_state: 目标状态(如 '11')
"""
layers = []
# 初始化:均匀叠加
layers.append([
{'name': 'h', 'qubits': [0], 'params': []},
{'name': 'h', 'qubits': [1], 'params': []},
])
# Oracle:标记目标状态
oracle_layer = []
if marked_state[1] == '0': # qubit 0
oracle_layer.append({'name': 'x', 'qubits': [0], 'params': []})
if marked_state[0] == '0': # qubit 1
oracle_layer.append({'name': 'x', 'qubits': [1], 'params': []})
if oracle_layer:
layers.append(oracle_layer)
layers.append([{'name': 'cz', 'qubits': [0, 1], 'params': []}])
restore_layer = []
if marked_state[1] == '0':
restore_layer.append({'name': 'x', 'qubits': [0], 'params': []})
if marked_state[0] == '0':
restore_layer.append({'name': 'x', 'qubits': [1], 'params': []})
if restore_layer:
layers.append(restore_layer)
# Diffusion 算子
layers.append([
{'name': 'h', 'qubits': [0], 'params': []},
{'name': 'h', 'qubits': [1], 'params': []},
])
layers.append([
{'name': 'x', 'qubits': [0], 'params': []},
{'name': 'x', 'qubits': [1], 'params': []},
])
layers.append([{'name': 'cz', 'qubits': [0, 1], 'params': []}])
layers.append([
{'name': 'x', 'qubits': [0], 'params': []},
{'name': 'x', 'qubits': [1], 'params': []},
])
layers.append([
{'name': 'h', 'qubits': [0], 'params': []},
{'name': 'h', 'qubits': [1], 'params': []},
])
return Circuit.from_layers(layers, n_qubits=2)
# 搜索 '11'
qc = grover_search_2qubit('11')
print("Grover 搜索电路:")
print(qc.draw())
sim = StatevectorSimulator()
result = sim.run(qc, shots=1000)
print(f"搜索结果: {result.counts}")
# '11' 应该有最高概率
量子傅里叶变换 (QFT)#
QFT 是许多量子算法的核心组件:
from janus.circuit import Circuit
import numpy as np
def qft(n_qubits):
"""
量子傅里叶变换
Args:
n_qubits: 量子比特数
Returns:
Circuit: QFT 电路
"""
layers = []
for i in range(n_qubits):
# Hadamard 门
layers.append([{'name': 'h', 'qubits': [i], 'params': []}])
# 受控旋转门
for j in range(i + 1, n_qubits):
angle = np.pi / (2 ** (j - i))
layers.append([{'name': 'cp', 'qubits': [j, i], 'params': [angle]}])
# 交换量子比特顺序
for i in range(n_qubits // 2):
layers.append([{'name': 'swap', 'qubits': [i, n_qubits - 1 - i], 'params': []}])
return Circuit.from_layers(layers, n_qubits=n_qubits)
# 创建 4 量子比特 QFT
qc = qft(4)
print("QFT 电路:")
print(qc.draw())
print(f"电路深度: {qc.depth}")
print(f"门数量: {qc.n_gates}")
变分量子本征求解器 (VQE) 简化版#
VQE 是一种混合量子-经典算法:
from janus.circuit import Circuit, Parameter
from janus.simulator import StatevectorSimulator
import numpy as np
def create_ansatz(n_qubits, n_layers):
"""
创建参数化 ansatz 电路
"""
layers = []
params = []
for layer_idx in range(n_layers):
# 旋转层
rotation_layer = []
for i in range(n_qubits):
theta = Parameter(f'theta_{layer_idx}_{i}')
params.append(theta)
rotation_layer.append({'name': 'ry', 'qubits': [i], 'params': [theta]})
layers.append(rotation_layer)
# 纠缠层
for i in range(n_qubits - 1):
layers.append([{'name': 'cx', 'qubits': [i, i + 1], 'params': []}])
qc = Circuit.from_layers(layers, n_qubits=n_qubits)
return qc, params
def compute_expectation(qc, params, param_values, observable):
"""
计算期望值 <ψ|H|ψ>
"""
sim = StatevectorSimulator()
param_dict = {p.name: v for p, v in zip(params, param_values)}
sv = sim.statevector(qc, parameter_binds=param_dict)
return sv.expectation_value(observable).real
# 创建 2 量子比特、2 层的 ansatz
qc, params = create_ansatz(2, 2)
print("VQE Ansatz 电路:")
print(qc.draw())
print(f"参数数量: {len(params)}")
# 定义简单的哈密顿量 H = Z⊗Z
Z = np.array([[1, 0], [0, -1]])
ZZ = np.kron(Z, Z)
# 计算一组参数的期望值
param_values = [0.1, 0.2, 0.3, 0.4]
energy = compute_expectation(qc, params, param_values, ZZ)
print(f"能量期望值: {energy:.4f}")
噪声对量子电路的影响#
比较理想和噪声模拟的结果:
from janus.circuit import Circuit
from janus.simulator import (
StatevectorSimulator,
NoisySimulator,
NoiseModel,
depolarizing_channel
)
# 创建 Bell 态电路
qc = Circuit.from_layers([
[{'name': 'h', 'qubits': [0], 'params': []}],
[{'name': 'cx', 'qubits': [0, 1], 'params': []}],
], n_qubits=2)
# 理想模拟
ideal_sim = StatevectorSimulator(seed=42)
ideal_result = ideal_sim.run(qc, shots=10000)
# 噪声模拟(不同噪声级别)
for error_rate in [0.001, 0.01, 0.05, 0.1]:
noise_model = NoiseModel()
noise_model.add_all_qubit_quantum_error(
depolarizing_channel(error_rate),
['h', 'cx']
)
noisy_sim = NoisySimulator(noise_model, seed=42)
noisy_result = noisy_sim.run(qc, shots=10000)
# 计算保真度(正确结果的比例)
correct = noisy_result.counts.get('00', 0) + noisy_result.counts.get('11', 0)
fidelity = correct / 10000
print(f"错误率 {error_rate*100:.1f}%: 保真度 = {fidelity:.3f}")
电路优化示例#
展示电路优化的效果:
from janus.circuit import Circuit
from janus.compiler import compile_circuit
from janus.simulator import StatevectorSimulator
import numpy as np
# 创建一个有冗余的电路
qc = Circuit.from_layers([
[{'name': 'h', 'qubits': [0], 'params': []}],
[{'name': 'h', 'qubits': [0], 'params': []}], # 冗余 H 门
[{'name': 'rz', 'qubits': [1], 'params': [0.785]}], # π/4
[{'name': 'rz', 'qubits': [1], 'params': [0.785]}], # 可合并
[{'name': 'rz', 'qubits': [1], 'params': [0.785]}], # 可合并
[{'name': 'x', 'qubits': [2], 'params': []}],
[{'name': 'x', 'qubits': [2], 'params': []}], # 逆门对
[{'name': 'cx', 'qubits': [0, 1], 'params': []}],
[{'name': 'cx', 'qubits': [1, 2], 'params': []}],
], n_qubits=3)
print("优化前:")
print(qc.draw())
print(f"门数量: {qc.n_gates}")
# 优化
optimized = compile_circuit(qc, optimization_level=2)
print("\n优化后:")
print(optimized.draw())
print(f"门数量: {optimized.n_gates}")
# 验证等价性
sim = StatevectorSimulator()
sv1 = sim.statevector(qc)
sv2 = sim.statevector(optimized)
print(f"\n电路等价: {sv1.equiv(sv2)}")
常用门名称参考#
以下是 from_layers 中可用的门名称:
单比特门
# Pauli 门
{'name': 'id', 'qubits': [0], 'params': []} # I 门
{'name': 'x', 'qubits': [0], 'params': []} # X 门
{'name': 'y', 'qubits': [0], 'params': []} # Y 门
{'name': 'z', 'qubits': [0], 'params': []} # Z 门
# Clifford 门
{'name': 'h', 'qubits': [0], 'params': []} # Hadamard
{'name': 's', 'qubits': [0], 'params': []} # S 门
{'name': 'sdg', 'qubits': [0], 'params': []} # S† 门
{'name': 't', 'qubits': [0], 'params': []} # T 门
{'name': 'tdg', 'qubits': [0], 'params': []} # T† 门
{'name': 'sx', 'qubits': [0], 'params': []} # √X 门
# 旋转门
{'name': 'rx', 'qubits': [0], 'params': [θ]} # RX(θ)
{'name': 'ry', 'qubits': [0], 'params': [θ]} # RY(θ)
{'name': 'rz', 'qubits': [0], 'params': [θ]} # RZ(θ)
{'name': 'p', 'qubits': [0], 'params': [λ]} # Phase(λ)
{'name': 'u', 'qubits': [0], 'params': [θ, φ, λ]} # U(θ, φ, λ)
两比特门
{'name': 'cx', 'qubits': [0, 1], 'params': []} # CNOT
{'name': 'cy', 'qubits': [0, 1], 'params': []} # CY
{'name': 'cz', 'qubits': [0, 1], 'params': []} # CZ
{'name': 'ch', 'qubits': [0, 1], 'params': []} # CH
{'name': 'swap', 'qubits': [0, 1], 'params': []} # SWAP
{'name': 'iswap', 'qubits': [0, 1], 'params': []} # iSWAP
# 受控旋转门
{'name': 'crx', 'qubits': [0, 1], 'params': [θ]} # CRX(θ)
{'name': 'cry', 'qubits': [0, 1], 'params': [θ]} # CRY(θ)
{'name': 'crz', 'qubits': [0, 1], 'params': [θ]} # CRZ(θ)
{'name': 'cp', 'qubits': [0, 1], 'params': [θ]} # CPhase(θ)
# 两比特旋转门
{'name': 'rxx', 'qubits': [0, 1], 'params': [θ]} # RXX(θ)
{'name': 'ryy', 'qubits': [0, 1], 'params': [θ]} # RYY(θ)
{'name': 'rzz', 'qubits': [0, 1], 'params': [θ]} # RZZ(θ)
三比特及多比特门
{'name': 'ccx', 'qubits': [0, 1, 2], 'params': []} # Toffoli
{'name': 'ccz', 'qubits': [0, 1, 2], 'params': []} # CCZ
{'name': 'cswap', 'qubits': [0, 1, 2], 'params': []} # Fredkin