qiskit
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseQiskit - Quantum Computing Framework
Qiskit - 量子计算框架
Open-source quantum computing framework for building, simulating, and running quantum algorithms on quantum computers and simulators.
开源量子计算框架,用于在量子计算机和模拟器上构建、模拟和运行量子算法。
When to Use
适用场景
- Building quantum circuits and gates
- Running quantum algorithms (VQE, QAOA, Grover, Shor)
- Quantum chemistry calculations (integration with PySCF)
- Quantum machine learning
- Quantum simulation and noise modeling
- Transpiling circuits for real quantum hardware
- Quantum optimization problems
- Quantum error correction
- Quantum cryptography
- Educational quantum computing demonstrations
- 构建量子电路与量子门
- 运行量子算法(VQE、QAOA、Grover、Shor)
- 量子化学计算(与PySCF集成)
- 量子机器学习
- 量子模拟与噪声建模
- 为真实量子硬件转译电路
- 量子优化问题
- 量子纠错
- 量子密码学
- 量子计算教学演示
Reference Documentation
参考文档
Official docs: https://qiskit.org/documentation/
Search patterns:, , ,
Search patterns:
qiskit.circuit.QuantumCircuitqiskit.algorithms.VQEqiskit.quantum_infoqiskit_nature官方文档:https://qiskit.org/documentation/
搜索模式:, , ,
搜索模式:
qiskit.circuit.QuantumCircuitqiskit.algorithms.VQEqiskit.quantum_infoqiskit_natureCore Principles
核心原则
Use Qiskit For
Qiskit适用场景
| Task | Module | Example |
|---|---|---|
| Circuit building | | |
| Quantum algorithms | | |
| Quantum simulation | | |
| Quantum chemistry | | |
| Noise modeling | | |
| Transpilation | | |
| Quantum ML | | |
| Visualization | | |
| 任务 | 模块 | 示例 |
|---|---|---|
| 电路构建 | | |
| 量子算法 | | |
| 量子模拟 | | |
| 量子化学 | | |
| 噪声建模 | | |
| 电路转译 | | |
| 量子机器学习 | | |
| 可视化 | | |
Do NOT Use For
Qiskit不适用场景
- Classical machine learning (use scikit-learn, PyTorch)
- Classical optimization (use SciPy)
- General numerical computing (use NumPy)
- Classical cryptography (use cryptography package)
- Large-scale classical simulation (use classical simulators)
- 经典机器学习(使用scikit-learn、PyTorch)
- 经典优化(使用SciPy)
- 通用数值计算(使用NumPy)
- 经典密码学(使用cryptography包)
- 大规模经典模拟(使用经典模拟器)
Quick Reference
快速参考
Installation
安装
bash
undefinedbash
undefinedCore Qiskit
Core Qiskit
pip install qiskit
pip install qiskit
With visualization tools
With visualization tools
pip install qiskit[visualization]
pip install qiskit[visualization]
Quantum chemistry extension
Quantum chemistry extension
pip install qiskit-nature qiskit-nature-pyscf
pip install qiskit-nature qiskit-nature-pyscf
Machine learning extension
Machine learning extension
pip install qiskit-machine-learning
pip install qiskit-machine-learning
Optimization extension
Optimization extension
pip install qiskit-optimization
pip install qiskit-optimization
Full installation
Full installation
pip install 'qiskit[all]' qiskit-nature qiskit-machine-learning qiskit-optimization
undefinedpip install 'qiskit[all]' qiskit-nature qiskit-machine-learning qiskit-optimization
undefinedStandard Imports
标准导入
python
undefinedpython
undefinedCore imports
Core imports
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit import transpile, assemble
from qiskit.providers.aer import AerSimulator
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit import transpile, assemble
from qiskit.providers.aer import AerSimulator
from qiskit.visualization import plot_histogram, plot_bloch_multivector
Quantum algorithms
Quantum algorithms
from qiskit.algorithms import VQE, QAOA, Grover, Shor
from qiskit.algorithms.optimizers import SLSQP, COBYLA, SPSA
from qiskit.algorithms import VQE, QAOA, Grover, Shor
from qiskit.algorithms.optimizers import SLSQP, COBYLA, SPSA
Quantum info
Quantum info
from qiskit.quantum_info import Statevector, DensityMatrix, Operator
from qiskit.quantum_info import entropy, entanglement_of_formation
from qiskit.quantum_info import Statevector, DensityMatrix, Operator
from qiskit.quantum_info import entropy, entanglement_of_formation
Circuit library
Circuit library
from qiskit.circuit.library import QFT, RealAmplitudes, EfficientSU2
undefinedfrom qiskit.circuit.library import QFT, RealAmplitudes, EfficientSU2
undefinedBasic Pattern - Circuit Building
基础模式 - 电路构建
python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulatorpython
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulatorCreate circuit
Create circuit
qc = QuantumCircuit(2, 2)
qc = QuantumCircuit(2, 2)
Add gates
Add gates
qc.h(0) # Hadamard on qubit 0
qc.cx(0, 1) # CNOT from 0 to 1
qc.h(0) # Hadamard on qubit 0
qc.cx(0, 1) # CNOT from 0 to 1
Measure
Measure
qc.measure([0, 1], [0, 1])
qc.measure([0, 1], [0, 1])
Simulate
Simulate
simulator = AerSimulator()
job = simulator.run(qc, shots=1000)
result = job.result()
counts = result.get_counts()
print(f"Results: {counts}")
undefinedsimulator = AerSimulator()
job = simulator.run(qc, shots=1000)
result = job.result()
counts = result.get_counts()
print(f"Results: {counts}")
undefinedBasic Pattern - Quantum Algorithm
基础模式 - 量子算法
python
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOppython
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOpDefine Hamiltonian
Define Hamiltonian
hamiltonian = SparsePauliOp(['ZZ', 'IZ', 'ZI'], coeffs=[1.0, -0.5, -0.5])
hamiltonian = SparsePauliOp(['ZZ', 'IZ', 'ZI'], coeffs=[1.0, -0.5, -0.5])
Create ansatz
Create ansatz
ansatz = RealAmplitudes(num_qubits=2, reps=1)
ansatz = RealAmplitudes(num_qubits=2, reps=1)
Setup VQE
Setup VQE
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
Run
Run
result = vqe.compute_minimum_eigenvalue(hamiltonian)
print(f"Ground state energy: {result.eigenvalue:.6f}")
undefinedresult = vqe.compute_minimum_eigenvalue(hamiltonian)
print(f"Ground state energy: {result.eigenvalue:.6f}")
undefinedCritical Rules
关键规则
✅ DO
✅ 建议做法
- Use simulators for development - Test on simulators before real hardware
- Transpile for target backend - Always transpile circuits for specific hardware
- Handle measurement statistics - Work with shot counts, not single results
- Use primitives for algorithms - Use Estimator/Sampler primitives
- Check circuit depth - Monitor gate count and depth for real hardware
- Implement error mitigation - Use error mitigation for noisy hardware
- Validate quantum states - Check state validity and normalization
- Use appropriate basis gates - Match hardware native gates
- Set random seed for reproducibility - Use seed for consistent results
- Monitor job status - Check if quantum jobs complete successfully
- 使用模拟器开发 - 在真实硬件上测试前先在模拟器上验证
- 针对目标后端转译电路 - 始终为特定硬件转译电路
- 处理测量统计数据 - 基于采样次数分析结果,而非单次结果
- 使用原语运行算法 - 使用Estimator/Sampler原语
- 检查电路深度 - 监控真实硬件的门数量和电路深度
- 实现错误缓解 - 针对含噪声硬件使用错误缓解技术
- 验证量子态 - 检查量子态的有效性与归一化
- 使用合适的基础门 - 匹配硬件原生门
- 设置随机种子保证可复现性 - 使用种子获得一致结果
- 监控任务状态 - 检查量子任务是否成功完成
❌ DON'T
❌ 不建议做法
- Ignore hardware constraints - Real quantum computers have limitations
- Use too many qubits on simulators - Memory grows exponentially
- Forget to measure - Quantum states collapse on measurement
- Mix classical and quantum incorrectly - Understand measurement timing
- Ignore decoherence - Quantum states decay over time
- Over-transpile - Unnecessary transpilation adds gates
- Assume perfect gates - Real gates have errors
- Ignore topology - Not all qubits are connected
- Use deprecated APIs - Qiskit evolves rapidly
- Run without error handling - Quantum jobs can fail
- 忽略硬件限制 - 真实量子计算机存在诸多限制
- 在模拟器上使用过多量子比特 - 内存需求呈指数增长
- 忘记测量 - 量子态会在测量时坍缩
- 错误混合经典与量子逻辑 - 理解测量时机
- 忽略退相干 - 量子态会随时间衰减
- 过度转译 - 不必要的转译会增加门数量
- 假设门操作完美 - 真实门操作存在误差
- 忽略拓扑结构 - 并非所有量子比特都相互连接
- 使用已弃用的API - Qiskit迭代更新迅速
- 不添加错误处理 - 量子任务可能失败
Anti-Patterns (NEVER)
反模式(绝对避免)
python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.primitives import Estimatorpython
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.primitives import Estimator❌ BAD: No measurement
❌ BAD: No measurement
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
Forgot qc.measure()!
Forgot qc.measure()!
✅ GOOD: Always measure when needed
✅ GOOD: Always measure when needed
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
❌ BAD: Using deprecated execute()
❌ BAD: Using deprecated execute()
from qiskit import execute
result = execute(qc, backend, shots=1024).result()
from qiskit import execute
result = execute(qc, backend, shots=1024).result()
✅ GOOD: Use new run() method
✅ GOOD: Use new run() method
simulator = AerSimulator()
job = simulator.run(qc, shots=1024)
result = job.result()
simulator = AerSimulator()
job = simulator.run(qc, shots=1024)
result = job.result()
❌ BAD: Assuming perfect measurement
❌ BAD: Assuming perfect measurement
counts = result.get_counts()
counts = result.get_counts()
Assuming exactly 50/50 split!
Assuming exactly 50/50 split!
assert counts['00'] == 512
assert counts['00'] == 512
✅ GOOD: Handle statistical variation
✅ GOOD: Handle statistical variation
counts = result.get_counts()
ratio = counts.get('00', 0) / sum(counts.values())
print(f"Measured |00⟩ with probability {ratio:.3f}")
counts = result.get_counts()
ratio = counts.get('00', 0) / sum(counts.values())
print(f"Measured |00⟩ with probability {ratio:.3f}")
❌ BAD: Not checking circuit properties
❌ BAD: Not checking circuit properties
qc = QuantumCircuit(20) # Many qubits!
qc = QuantumCircuit(20) # Many qubits!
Adding many gates...
Adding many gates...
Trying to simulate without checking depth/size!
Trying to simulate without checking depth/size!
✅ GOOD: Check circuit properties
✅ GOOD: Check circuit properties
qc = QuantumCircuit(20)
qc = QuantumCircuit(20)
... add gates ...
... add gates ...
print(f"Circuit depth: {qc.depth()}")
print(f"Gate count: {len(qc.data)}")
print(f"Qubits: {qc.num_qubits}")
print(f"Circuit depth: {qc.depth()}")
print(f"Gate count: {len(qc.data)}")
print(f"Qubits: {qc.num_qubits}")
❌ BAD: Ignoring transpilation
❌ BAD: Ignoring transpilation
job = backend.run(qc) # May fail on real hardware!
job = backend.run(qc) # May fail on real hardware!
✅ GOOD: Transpile for backend
✅ GOOD: Transpile for backend
from qiskit import transpile
transpiled_qc = transpile(qc, backend=backend, optimization_level=3)
job = backend.run(transpiled_qc)
undefinedfrom qiskit import transpile
transpiled_qc = transpile(qc, backend=backend, optimization_level=3)
job = backend.run(transpiled_qc)
undefinedQuantum Circuits (qiskit.QuantumCircuit)
量子电路(qiskit.QuantumCircuit)
Basic Circuit Construction
基础电路构建
python
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import numpy as nppython
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import numpy as npMethod 1: Simple initialization
Method 1: Simple initialization
qc = QuantumCircuit(3, 3) # 3 qubits, 3 classical bits
qc = QuantumCircuit(3, 3) # 3 qubits, 3 classical bits
Method 2: Using registers
Method 2: Using registers
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(3, 'c')
qc = QuantumCircuit(qr, cr)
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(3, 'c')
qc = QuantumCircuit(qr, cr)
Method 3: Multiple registers
Method 3: Multiple registers
qr1 = QuantumRegister(2, 'data')
qr2 = QuantumRegister(1, 'ancilla')
cr = ClassicalRegister(2, 'meas')
qc = QuantumCircuit(qr1, qr2, cr)
print(f"Number of qubits: {qc.num_qubits}")
print(f"Number of classical bits: {qc.num_clbits}")
print(f"Circuit depth: {qc.depth()}")
undefinedqr1 = QuantumRegister(2, 'data')
qr2 = QuantumRegister(1, 'ancilla')
cr = ClassicalRegister(2, 'meas')
qc = QuantumCircuit(qr1, qr2, cr)
print(f"Number of qubits: {qc.num_qubits}")
print(f"Number of classical bits: {qc.num_clbits}")
print(f"Circuit depth: {qc.depth()}")
undefinedSingle-Qubit Gates
单量子比特门
python
from qiskit import QuantumCircuit
import numpy as np
qc = QuantumCircuit(1)python
from qiskit import QuantumCircuit
import numpy as np
qc = QuantumCircuit(1)Pauli gates
Pauli gates
qc.x(0) # Pauli X (NOT gate)
qc.y(0) # Pauli Y
qc.z(0) # Pauli Z
qc.x(0) # Pauli X (NOT gate)
qc.y(0) # Pauli Y
qc.z(0) # Pauli Z
Hadamard gate
Hadamard gate
qc.h(0) # Creates superposition
qc.h(0) # Creates superposition
Phase gates
Phase gates
qc.s(0) # S gate (π/2 phase)
qc.t(0) # T gate (π/4 phase)
qc.sdg(0) # S dagger
qc.tdg(0) # T dagger
qc.s(0) # S gate (π/2 phase)
qc.t(0) # T gate (π/4 phase)
qc.sdg(0) # S dagger
qc.tdg(0) # T dagger
Rotation gates
Rotation gates
qc.rx(np.pi/4, 0) # Rotation around X
qc.ry(np.pi/4, 0) # Rotation around Y
qc.rz(np.pi/4, 0) # Rotation around Z
qc.rx(np.pi/4, 0) # Rotation around X
qc.ry(np.pi/4, 0) # Rotation around Y
qc.rz(np.pi/4, 0) # Rotation around Z
General rotation
General rotation
qc.u(np.pi/4, np.pi/2, np.pi, 0) # U gate
qc.u(np.pi/4, np.pi/2, np.pi, 0) # U gate
Identity (wait)
Identity (wait)
qc.id(0)
print(f"Gate count: {len(qc.data)}")
undefinedqc.id(0)
print(f"Gate count: {len(qc.data)}")
undefinedTwo-Qubit Gates
双量子比特门
python
from qiskit import QuantumCircuit
import numpy as np
qc = QuantumCircuit(2)python
from qiskit import QuantumCircuit
import numpy as np
qc = QuantumCircuit(2)CNOT (Controlled-NOT)
CNOT (Controlled-NOT)
qc.cx(0, 1) # Control: 0, Target: 1
qc.cx(0, 1) # Control: 0, Target: 1
Other controlled gates
Other controlled gates
qc.cy(0, 1) # Controlled-Y
qc.cz(0, 1) # Controlled-Z
qc.ch(0, 1) # Controlled-Hadamard
qc.cy(0, 1) # Controlled-Y
qc.cz(0, 1) # Controlled-Z
qc.ch(0, 1) # Controlled-Hadamard
SWAP gate
SWAP gate
qc.swap(0, 1)
qc.swap(0, 1)
Controlled phase
Controlled phase
qc.cp(np.pi/4, 0, 1)
qc.cp(np.pi/4, 0, 1)
Controlled-U
Controlled-U
qc.cu(np.pi/4, np.pi/2, np.pi, 0, 0, 1)
qc.cu(np.pi/4, np.pi/2, np.pi, 0, 0, 1)
Toffoli (CCX) - needs 3 qubits
Toffoli (CCX) - needs 3 qubits
qc_3 = QuantumCircuit(3)
qc_3.ccx(0, 1, 2) # Controls: 0,1, Target: 2
print(qc.draw())
undefinedqc_3 = QuantumCircuit(3)
qc_3.ccx(0, 1, 2) # Controls: 0,1, Target: 2
print(qc.draw())
undefinedCreating Entanglement
生成纠缠态
python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.quantum_info import Statevectorpython
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.quantum_info import StatevectorBell state (maximally entangled)
Bell state (maximally entangled)
def create_bell_state():
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
return qc
bell = create_bell_state()
state = Statevector.from_instruction(bell)
print(f"Bell state: {state}")
def create_bell_state():
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
return qc
bell = create_bell_state()
state = Statevector.from_instruction(bell)
print(f"Bell state: {state}")
GHZ state (3-qubit entanglement)
GHZ state (3-qubit entanglement)
def create_ghz_state(n):
qc = QuantumCircuit(n)
qc.h(0)
for i in range(n-1):
qc.cx(i, i+1)
return qc
ghz = create_ghz_state(3)
state_ghz = Statevector.from_instruction(ghz)
print(f"GHZ state: {state_ghz}")
def create_ghz_state(n):
qc = QuantumCircuit(n)
qc.h(0)
for i in range(n-1):
qc.cx(i, i+1)
return qc
ghz = create_ghz_state(3)
state_ghz = Statevector.from_instruction(ghz)
print(f"GHZ state: {state_ghz}")
W state (another type of 3-qubit entanglement)
W state (another type of 3-qubit entanglement)
def create_w_state():
qc = QuantumCircuit(3)
qc.ry(1.9106, 0)
qc.ch(0, 1)
qc.x(0)
qc.cy(0, 1)
qc.ccx(0, 1, 2)
qc.x(0)
return qc
w = create_w_state()
print(f"W state circuit depth: {w.depth()}")
undefineddef create_w_state():
qc = QuantumCircuit(3)
qc.ry(1.9106, 0)
qc.ch(0, 1)
qc.x(0)
qc.cy(0, 1)
qc.ccx(0, 1, 2)
qc.x(0)
return qc
w = create_w_state()
print(f"W state circuit depth: {w.depth()}")
undefinedParameterized Circuits
参数化电路
python
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter, ParameterVector
import numpy as nppython
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter, ParameterVector
import numpy as npSingle parameter
Single parameter
theta = Parameter('θ')
qc = QuantumCircuit(1)
qc.ry(theta, 0)
theta = Parameter('θ')
qc = QuantumCircuit(1)
qc.ry(theta, 0)
Bind parameter
Bind parameter
bound_qc = qc.bind_parameters({theta: np.pi/4})
print(f"Unbound: {qc}")
print(f"Bound: {bound_qc}")
bound_qc = qc.bind_parameters({theta: np.pi/4})
print(f"Unbound: {qc}")
print(f"Bound: {bound_qc}")
Multiple parameters
Multiple parameters
params = ParameterVector('θ', 4)
qc_param = QuantumCircuit(2)
qc_param.ry(params[0], 0)
qc_param.ry(params[1], 1)
qc_param.cx(0, 1)
qc_param.ry(params[2], 0)
qc_param.ry(params[3], 1)
params = ParameterVector('θ', 4)
qc_param = QuantumCircuit(2)
qc_param.ry(params[0], 0)
qc_param.ry(params[1], 1)
qc_param.cx(0, 1)
qc_param.ry(params[2], 0)
qc_param.ry(params[3], 1)
Bind all parameters
Bind all parameters
values = [np.pi/4, np.pi/3, np.pi/2, np.pi/6]
bound = qc_param.bind_parameters(dict(zip(params, values)))
print(f"Number of parameters: {qc_param.num_parameters}")
undefinedvalues = [np.pi/4, np.pi/3, np.pi/2, np.pi/6]
bound = qc_param.bind_parameters(dict(zip(params, values)))
print(f"Number of parameters: {qc_param.num_parameters}")
undefinedQuantum Algorithms
量子算法
Variational Quantum Eigensolver (VQE)
变分量子本征求解器(VQE)
python
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP, COBYLA
from qiskit.circuit.library import RealAmplitudes, EfficientSU2
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import numpy as nppython
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP, COBYLA
from qiskit.circuit.library import RealAmplitudes, EfficientSU2
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import numpy as npDefine Hamiltonian (e.g., H2 molecule)
Define Hamiltonian (e.g., H2 molecule)
H = -1.05 * ZZ + 0.39 * XX - 0.39 * YY - 0.01 * ZI
H = -1.05 * ZZ + 0.39 * XX - 0.39 * YY - 0.01 * ZI
hamiltonian = SparsePauliOp(
['ZZ', 'XX', 'YY', 'ZI', 'IZ'],
coeffs=[-1.05, 0.39, -0.39, -0.01, -0.01]
)
hamiltonian = SparsePauliOp(
['ZZ', 'XX', 'YY', 'ZI', 'IZ'],
coeffs=[-1.05, 0.39, -0.39, -0.01, -0.01]
)
Create ansatz (variational form)
Create ansatz (variational form)
ansatz = RealAmplitudes(num_qubits=2, reps=2)
ansatz = RealAmplitudes(num_qubits=2, reps=2)
Alternative: EfficientSU2
Alternative: EfficientSU2
ansatz = EfficientSU2(num_qubits=2, reps=2)
ansatz = EfficientSU2(num_qubits=2, reps=2)
Setup optimizer
Setup optimizer
optimizer = SLSQP(maxiter=100)
optimizer = SLSQP(maxiter=100)
Create estimator primitive
Create estimator primitive
estimator = Estimator()
estimator = Estimator()
Setup and run VQE
Setup and run VQE
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
print(f"Ground state energy: {result.eigenvalue:.6f}")
print(f"Optimal parameters: {result.optimal_parameters}")
print(f"Optimizer evaluations: {result.cost_function_evals}")
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
print(f"Ground state energy: {result.eigenvalue:.6f}")
print(f"Optimal parameters: {result.optimal_parameters}")
print(f"Optimizer evaluations: {result.cost_function_evals}")
Get optimal circuit
Get optimal circuit
optimal_circuit = ansatz.bind_parameters(result.optimal_point)
print(f"\nOptimal circuit depth: {optimal_circuit.depth()}")
undefinedoptimal_circuit = ansatz.bind_parameters(result.optimal_point)
print(f"\nOptimal circuit depth: {optimal_circuit.depth()}")
undefinedQAOA (Quantum Approximate Optimization Algorithm)
QAOA(量子近似优化算法)
python
from qiskit import QuantumCircuit
from qiskit.algorithms import QAOA
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler
from qiskit.quantum_info import SparsePauliOp
import numpy as nppython
from qiskit import QuantumCircuit
from qiskit.algorithms import QAOA
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler
from qiskit.quantum_info import SparsePauliOp
import numpy as npMax-Cut problem on a triangle graph
Max-Cut problem on a triangle graph
Cost Hamiltonian: H = (1-Z0Z1)/2 + (1-Z1Z2)/2 + (1-Z0*Z2)/2
Cost Hamiltonian: H = (1-Z0Z1)/2 + (1-Z1Z2)/2 + (1-Z0*Z2)/2
cost_hamiltonian = SparsePauliOp(
['ZZ', 'ZI', 'IZ'],
coeffs=[0.5, -0.5, -0.5]
)
cost_hamiltonian = SparsePauliOp(
['ZZ', 'ZI', 'IZ'],
coeffs=[0.5, -0.5, -0.5]
)
Setup QAOA
Setup QAOA
optimizer = COBYLA(maxiter=100)
sampler = Sampler()
qaoa = QAOA(sampler, optimizer, reps=2)
optimizer = COBYLA(maxiter=100)
sampler = Sampler()
qaoa = QAOA(sampler, optimizer, reps=2)
Run QAOA
Run QAOA
result = qaoa.compute_minimum_eigenvalue(cost_hamiltonian)
print(f"Optimal objective: {result.eigenvalue:.6f}")
print(f"Optimal parameters: {result.optimal_parameters}")
result = qaoa.compute_minimum_eigenvalue(cost_hamiltonian)
print(f"Optimal objective: {result.eigenvalue:.6f}")
print(f"Optimal parameters: {result.optimal_parameters}")
Most probable solution
Most probable solution
from qiskit.result import QuasiDistribution
prob_dist = result.eigenstate
if isinstance(prob_dist, QuasiDistribution):
most_likely = max(prob_dist, key=prob_dist.get)
print(f"Most likely solution: {bin(most_likely)[2:].zfill(2)}")
undefinedfrom qiskit.result import QuasiDistribution
prob_dist = result.eigenstate
if isinstance(prob_dist, QuasiDistribution):
most_likely = max(prob_dist, key=prob_dist.get)
print(f"Most likely solution: {bin(most_likely)[2:].zfill(2)}")
undefinedGrover's Algorithm (Quantum Search)
Grover算法(量子搜索)
python
from qiskit import QuantumCircuit
from qiskit.algorithms import Grover, AmplificationProblem
from qiskit.circuit.library import GroverOperator
from qiskit.primitives import Sampler
import numpy as np
def grover_search(marked_states, n_qubits):
"""
Grover's algorithm to find marked states.
Args:
marked_states: List of marked states (e.g., ['101', '110'])
n_qubits: Number of qubits
"""
# Create oracle that marks the target states
oracle = QuantumCircuit(n_qubits)
# Mark state |101⟩ by flipping phase
if '101' in marked_states:
oracle.x([0, 2]) # Flip to make 101 -> 111
oracle.h(2)
oracle.ccx(0, 1, 2)
oracle.h(2)
oracle.x([0, 2]) # Flip back
# Grover diffusion operator
diffusion = QuantumCircuit(n_qubits)
diffusion.h(range(n_qubits))
diffusion.x(range(n_qubits))
diffusion.h(n_qubits - 1)
diffusion.mcx(list(range(n_qubits - 1)), n_qubits - 1)
diffusion.h(n_qubits - 1)
diffusion.x(range(n_qubits))
diffusion.h(range(n_qubits))
# Complete Grover iteration
grover_op = oracle.compose(diffusion)
# Setup and run
problem = AmplificationProblem(oracle, is_good_state=marked_states)
grover = Grover(sampler=Sampler())
result = grover.amplify(problem)
return resultpython
from qiskit import QuantumCircuit
from qiskit.algorithms import Grover, AmplificationProblem
from qiskit.circuit.library import GroverOperator
from qiskit.primitives import Sampler
import numpy as np
def grover_search(marked_states, n_qubits):
"""
Grover's algorithm to find marked states.
Args:
marked_states: List of marked states (e.g., ['101', '110'])
n_qubits: Number of qubits
"""
# Create oracle that marks the target states
oracle = QuantumCircuit(n_qubits)
# Mark state |101⟩ by flipping phase
if '101' in marked_states:
oracle.x([0, 2]) # Flip to make 101 -> 111
oracle.h(2)
oracle.ccx(0, 1, 2)
oracle.h(2)
oracle.x([0, 2]) # Flip back
# Grover diffusion operator
diffusion = QuantumCircuit(n_qubits)
diffusion.h(range(n_qubits))
diffusion.x(range(n_qubits))
diffusion.h(n_qubits - 1)
diffusion.mcx(list(range(n_qubits - 1)), n_qubits - 1)
diffusion.h(n_qubits - 1)
diffusion.x(range(n_qubits))
diffusion.h(range(n_qubits))
# Complete Grover iteration
grover_op = oracle.compose(diffusion)
# Setup and run
problem = AmplificationProblem(oracle, is_good_state=marked_states)
grover = Grover(sampler=Sampler())
result = grover.amplify(problem)
return resultExample: Search for |101⟩ in 3-qubit space
Example: Search for |101⟩ in 3-qubit space
result = grover_search(['101'], 3)
print(f"Top measurement: {result.top_measurement}")
print(f"Oracle evaluations: {result.oracle_evaluation}")
result = grover_search(['101'], 3)
print(f"Top measurement: {result.top_measurement}")
print(f"Oracle evaluations: {result.oracle_evaluation}")
Simpler example: 2-qubit search
Simpler example: 2-qubit search
qc = QuantumCircuit(2, 2)
qc.h([0, 1]) # Superposition
qc = QuantumCircuit(2, 2)
qc.h([0, 1]) # Superposition
Oracle marks |11⟩
Oracle marks |11⟩
qc.cz(0, 1)
qc.cz(0, 1)
Diffusion
Diffusion
qc.h([0, 1])
qc.x([0, 1])
qc.cz(0, 1)
qc.x([0, 1])
qc.h([0, 1])
qc.measure([0, 1], [0, 1])
from qiskit.providers.aer import AerSimulator
simulator = AerSimulator()
job = simulator.run(qc, shots=1000)
counts = job.result().get_counts()
print(f"Grover results: {counts}")
undefinedqc.h([0, 1])
qc.x([0, 1])
qc.cz(0, 1)
qc.x([0, 1])
qc.h([0, 1])
qc.measure([0, 1], [0, 1])
from qiskit.providers.aer import AerSimulator
simulator = AerSimulator()
job = simulator.run(qc, shots=1000)
counts = job.result().get_counts()
print(f"Grover results: {counts}")
undefinedQuantum Phase Estimation (QPE)
量子相位估计(QPE)
python
from qiskit import QuantumCircuit
from qiskit.circuit.library import QFT
from qiskit.providers.aer import AerSimulator
import numpy as np
def quantum_phase_estimation(unitary, n_counting_qubits):
"""
Estimate the phase of an eigenstate of a unitary operator.
Args:
unitary: Unitary operator as a QuantumCircuit
n_counting_qubits: Precision qubits
"""
n_system_qubits = unitary.num_qubits
qc = QuantumCircuit(n_counting_qubits + n_system_qubits, n_counting_qubits)
# Initialize eigenstate (simplified: use |1⟩)
qc.x(n_counting_qubits)
# Hadamard on counting qubits
for i in range(n_counting_qubits):
qc.h(i)
# Controlled-U^(2^i) operations
repetitions = 1
for counting_qubit in range(n_counting_qubits):
for _ in range(repetitions):
qc.append(unitary.control(), [counting_qubit] +
list(range(n_counting_qubits, n_counting_qubits + n_system_qubits)))
repetitions *= 2
# Inverse QFT
qc.append(QFT(n_counting_qubits, inverse=True), range(n_counting_qubits))
# Measure counting qubits
qc.measure(range(n_counting_qubits), range(n_counting_qubits))
return qcpython
from qiskit import QuantumCircuit
from qiskit.circuit.library import QFT
from qiskit.providers.aer import AerSimulator
import numpy as np
def quantum_phase_estimation(unitary, n_counting_qubits):
"""
Estimate the phase of an eigenstate of a unitary operator.
Args:
unitary: Unitary operator as a QuantumCircuit
n_counting_qubits: Precision qubits
"""
n_system_qubits = unitary.num_qubits
qc = QuantumCircuit(n_counting_qubits + n_system_qubits, n_counting_qubits)
# Initialize eigenstate (simplified: use |1⟩)
qc.x(n_counting_qubits)
# Hadamard on counting qubits
for i in range(n_counting_qubits):
qc.h(i)
# Controlled-U^(2^i) operations
repetitions = 1
for counting_qubit in range(n_counting_qubits):
for _ in range(repetitions):
qc.append(unitary.control(), [counting_qubit] +
list(range(n_counting_qubits, n_counting_qubits + n_system_qubits)))
repetitions *= 2
# Inverse QFT
qc.append(QFT(n_counting_qubits, inverse=True), range(n_counting_qubits))
# Measure counting qubits
qc.measure(range(n_counting_qubits), range(n_counting_qubits))
return qcExample: Phase estimation for T gate (phase π/4)
Example: Phase estimation for T gate (phase π/4)
t_gate = QuantumCircuit(1)
t_gate.t(0)
qpe_circuit = quantum_phase_estimation(t_gate, n_counting_qubits=3)
simulator = AerSimulator()
job = simulator.run(qpe_circuit, shots=1000)
counts = job.result().get_counts()
print(f"Phase estimation results: {counts}")
t_gate = QuantumCircuit(1)
t_gate.t(0)
qpe_circuit = quantum_phase_estimation(t_gate, n_counting_qubits=3)
simulator = AerSimulator()
job = simulator.run(qpe_circuit, shots=1000)
counts = job.result().get_counts()
print(f"Phase estimation results: {counts}")
Most common result gives phase
Most common result gives phase
most_common = max(counts, key=counts.get)
phase_estimate = int(most_common, 2) / (2**3)
print(f"Estimated phase: {phase_estimate * 2 * np.pi:.4f} rad")
print(f"True phase: {np.pi/4:.4f} rad")
undefinedmost_common = max(counts, key=counts.get)
phase_estimate = int(most_common, 2) / (2**3)
print(f"Estimated phase: {phase_estimate * 2 * np.pi:.4f} rad")
print(f"True phase: {np.pi/4:.4f} rad")
undefinedQuantum Chemistry with Qiskit Nature
基于Qiskit Nature的量子化学
Molecular Ground State Calculation
分子基态计算
python
undefinedpython
undefinedRequires: pip install qiskit-nature qiskit-nature-pyscf
Requires: pip install qiskit-nature qiskit-nature-pyscf
from qiskit_nature.units import DistanceUnit
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper, ParityMapper
from qiskit_nature.second_q.circuit.library import HartreeFock, UCCSD
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
import numpy as np
from qiskit_nature.units import DistanceUnit
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper, ParityMapper
from qiskit_nature.second_q.circuit.library import HartreeFock, UCCSD
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
import numpy as np
Define molecule (H2)
Define molecule (H2)
driver = PySCFDriver(
atom='H 0 0 0; H 0 0 0.735',
basis='sto3g',
charge=0,
spin=0,
unit=DistanceUnit.ANGSTROM
)
driver = PySCFDriver(
atom='H 0 0 0; H 0 0 0.735',
basis='sto3g',
charge=0,
spin=0,
unit=DistanceUnit.ANGSTROM
)
Get problem
Get problem
problem = driver.run()
hamiltonian = problem.hamiltonian.second_q_op()
problem = driver.run()
hamiltonian = problem.hamiltonian.second_q_op()
Map to qubits
Map to qubits
mapper = JordanWignerMapper()
qubit_op = mapper.map(hamiltonian)
print(f"Number of qubits required: {qubit_op.num_qubits}")
mapper = JordanWignerMapper()
qubit_op = mapper.map(hamiltonian)
print(f"Number of qubits required: {qubit_op.num_qubits}")
Initial state (Hartree-Fock)
Initial state (Hartree-Fock)
num_particles = problem.num_particles
num_spatial_orbitals = problem.num_spatial_orbitals
init_state = HartreeFock(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper
)
num_particles = problem.num_particles
num_spatial_orbitals = problem.num_spatial_orbitals
init_state = HartreeFock(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper
)
Ansatz (UCCSD)
Ansatz (UCCSD)
ansatz = UCCSD(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper,
initial_state=init_state
)
ansatz = UCCSD(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper,
initial_state=init_state
)
VQE calculation
VQE calculation
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(qubit_op)
print(f"\nVQE Ground State Energy: {result.eigenvalue:.6f} Ha")
print(f"Reference HF energy: {problem.reference_energy:.6f} Ha")
undefinedoptimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(qubit_op)
print(f"\nVQE Ground State Energy: {result.eigenvalue:.6f} Ha")
print(f"Reference HF energy: {problem.reference_energy:.6f} Ha")
undefinedExcited States Calculation
激发态计算
python
from qiskit_nature.second_q.algorithms import GroundStateEigensolver, ExcitedStatesEigensolver
from qiskit_nature.second_q.algorithms import QEOM
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimatorpython
from qiskit_nature.second_q.algorithms import GroundStateEigensolver, ExcitedStatesEigensolver
from qiskit_nature.second_q.algorithms import QEOM
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import EstimatorSetup molecule
Setup molecule
driver = PySCFDriver(atom='H 0 0 0; H 0 0 0.735', basis='sto3g')
problem = driver.run()
driver = PySCFDriver(atom='H 0 0 0; H 0 0 0.735', basis='sto3g')
problem = driver.run()
Mapper
Mapper
mapper = JordanWignerMapper()
mapper = JordanWignerMapper()
Ground state solver
Ground state solver
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
Simple ansatz for demonstration
Simple ansatz for demonstration
from qiskit.circuit.library import RealAmplitudes
ansatz = RealAmplitudes(num_qubits=4, reps=2)
vqe = VQE(estimator, ansatz, optimizer)
ground_solver = GroundStateEigensolver(mapper, vqe)
from qiskit.circuit.library import RealAmplitudes
ansatz = RealAmplitudes(num_qubits=4, reps=2)
vqe = VQE(estimator, ansatz, optimizer)
ground_solver = GroundStateEigensolver(mapper, vqe)
Calculate ground state
Calculate ground state
ground_result = ground_solver.solve(problem)
print(f"Ground state energy: {ground_result.total_energies[0]:.6f} Ha")
ground_result = ground_solver.solve(problem)
print(f"Ground state energy: {ground_result.total_energies[0]:.6f} Ha")
Excited states with QEOM
Excited states with QEOM
qeom = QEOM(ground_solver, 'sd') # singles and doubles
excited_solver = ExcitedStatesEigensolver(mapper, qeom)
qeom = QEOM(ground_solver, 'sd') # singles and doubles
excited_solver = ExcitedStatesEigensolver(mapper, qeom)
Calculate excited states
Calculate excited states
excited_result = excited_solver.solve(problem)
print(f"\nExcited state energies:")
for i, energy in enumerate(excited_result.total_energies):
print(f"State {i}: {energy:.6f} Ha")
undefinedexcited_result = excited_solver.solve(problem)
print(f"\nExcited state energies:")
for i, energy in enumerate(excited_result.total_energies):
print(f"State {i}: {energy:.6f} Ha")
undefinedMolecular Potential Energy Surface
分子势能面
python
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.algorithms import GroundStateEigensolver
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
from qiskit.circuit.library import RealAmplitudes
import numpy as np
def calculate_pes(distances, molecule_template, basis='sto3g'):
"""
Calculate potential energy surface for a diatomic molecule.
Args:
distances: Array of interatomic distances
molecule_template: Molecule string with {} for distance
basis: Basis set
"""
energies = []
for distance in distances:
# Setup molecule at this distance
atom_string = molecule_template.format(distance)
driver = PySCFDriver(atom=atom_string, basis=basis)
problem = driver.run()
# Map to qubits
mapper = JordanWignerMapper()
# Simple VQE calculation
ansatz = RealAmplitudes(num_qubits=4, reps=1)
optimizer = SLSQP(maxiter=50)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
solver = GroundStateEigensolver(mapper, vqe)
# Calculate energy
result = solver.solve(problem)
energies.append(result.total_energies[0])
print(f"Distance {distance:.2f} Å: Energy = {energies[-1]:.6f} Ha")
return np.array(energies)python
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.algorithms import GroundStateEigensolver
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
from qiskit.circuit.library import RealAmplitudes
import numpy as np
def calculate_pes(distances, molecule_template, basis='sto3g'):
"""
Calculate potential energy surface for a diatomic molecule.
Args:
distances: Array of interatomic distances
molecule_template: Molecule string with {} for distance
basis: Basis set
"""
energies = []
for distance in distances:
# Setup molecule at this distance
atom_string = molecule_template.format(distance)
driver = PySCFDriver(atom=atom_string, basis=basis)
problem = driver.run()
# Map to qubits
mapper = JordanWignerMapper()
# Simple VQE calculation
ansatz = RealAmplitudes(num_qubits=4, reps=1)
optimizer = SLSQP(maxiter=50)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
solver = GroundStateEigensolver(mapper, vqe)
# Calculate energy
result = solver.solve(problem)
energies.append(result.total_energies[0])
print(f"Distance {distance:.2f} Å: Energy = {energies[-1]:.6f} Ha")
return np.array(energies)Calculate PES for H2
Calculate PES for H2
distances = np.linspace(0.5, 2.5, 5) # Angstroms
molecule_template = 'H 0 0 0; H 0 0 {}'
energies = calculate_pes(distances, molecule_template)
distances = np.linspace(0.5, 2.5, 5) # Angstroms
molecule_template = 'H 0 0 0; H 0 0 {}'
energies = calculate_pes(distances, molecule_template)
Find equilibrium bond length
Find equilibrium bond length
min_idx = np.argmin(energies)
print(f"\nEquilibrium bond length: {distances[min_idx]:.2f} Å")
print(f"Minimum energy: {energies[min_idx]:.6f} Ha")
undefinedmin_idx = np.argmin(energies)
print(f"\nEquilibrium bond length: {distances[min_idx]:.2f} Å")
print(f"Minimum energy: {energies[min_idx]:.6f} Ha")
undefinedQuantum Simulation
量子模拟
Hamiltonian Simulation with Trotter
基于Trotter的哈密顿量模拟
python
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp, Statevector
from qiskit.synthesis import SuzukiTrotter
import numpy as np
def trotter_simulation(hamiltonian, time, n_steps):
"""
Simulate time evolution under Hamiltonian using Trotter decomposition.
Args:
hamiltonian: SparsePauliOp Hamiltonian
time: Total evolution time
n_steps: Number of Trotter steps
"""
dt = time / n_steps
# Create Trotter circuit
n_qubits = hamiltonian.num_qubits
qc = QuantumCircuit(n_qubits)
# Initial state (e.g., |0⟩)
# Apply Trotter steps
for _ in range(n_steps):
# For each Pauli term in Hamiltonian
for pauli, coeff in zip(hamiltonian.paulis, hamiltonian.coeffs):
# Apply exp(-i * coeff * dt * pauli)
angle = 2 * float(coeff.real) * dt
# Simple implementation for single Pauli terms
pauli_str = str(pauli)
# Apply appropriate rotation
if 'Z' in pauli_str and pauli_str.count('I') == n_qubits - 1:
idx = pauli_str.index('Z')
qc.rz(angle, n_qubits - 1 - idx)
elif 'X' in pauli_str and pauli_str.count('I') == n_qubits - 1:
idx = pauli_str.index('X')
qc.rx(angle, n_qubits - 1 - idx)
return qcpython
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp, Statevector
from qiskit.synthesis import SuzukiTrotter
import numpy as np
def trotter_simulation(hamiltonian, time, n_steps):
"""
Simulate time evolution under Hamiltonian using Trotter decomposition.
Args:
hamiltonian: SparsePauliOp Hamiltonian
time: Total evolution time
n_steps: Number of Trotter steps
"""
dt = time / n_steps
# Create Trotter circuit
n_qubits = hamiltonian.num_qubits
qc = QuantumCircuit(n_qubits)
# Initial state (e.g., |0⟩)
# Apply Trotter steps
for _ in range(n_steps):
# For each Pauli term in Hamiltonian
for pauli, coeff in zip(hamiltonian.paulis, hamiltonian.coeffs):
# Apply exp(-i * coeff * dt * pauli)
angle = 2 * float(coeff.real) * dt
# Simple implementation for single Pauli terms
pauli_str = str(pauli)
# Apply appropriate rotation
if 'Z' in pauli_str and pauli_str.count('I') == n_qubits - 1:
idx = pauli_str.index('Z')
qc.rz(angle, n_qubits - 1 - idx)
elif 'X' in pauli_str and pauli_str.count('I') == n_qubits - 1:
idx = pauli_str.index('X')
qc.rx(angle, n_qubits - 1 - idx)
return qcExample: Ising model Hamiltonian
Example: Ising model Hamiltonian
hamiltonian = SparsePauliOp(['ZZ', 'XI', 'IX'], coeffs=[1.0, -0.5, -0.5])
hamiltonian = SparsePauliOp(['ZZ', 'XI', 'IX'], coeffs=[1.0, -0.5, -0.5])
Simulate for time t=1.0 with 10 Trotter steps
Simulate for time t=1.0 with 10 Trotter steps
qc = trotter_simulation(hamiltonian, time=1.0, n_steps=10)
print(f"Trotter circuit depth: {qc.depth()}")
print(f"Gate count: {len(qc.data)}")
qc = trotter_simulation(hamiltonian, time=1.0, n_steps=10)
print(f"Trotter circuit depth: {qc.depth()}")
print(f"Gate count: {len(qc.data)}")
Get final state
Get final state
state = Statevector.from_instruction(qc)
print(f"Final state vector: {state[:4]}") # First 4 amplitudes
undefinedstate = Statevector.from_instruction(qc)
print(f"Final state vector: {state[:4]}") # First 4 amplitudes
undefinedVariational Quantum Simulation
变分量子模拟
python
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import numpy as np
def simulate_dynamics(hamiltonian, initial_state_circuit, times, ansatz_reps=2):
"""
Simulate quantum dynamics using VQE at different times.
Args:
hamiltonian: Time-evolution Hamiltonian
initial_state_circuit: Circuit preparing initial state
times: Array of times to simulate
ansatz_reps: Repetitions in ansatz
"""
n_qubits = hamiltonian.num_qubits
results = []
for t in times:
# Time-evolved Hamiltonian: H(t) = exp(-iHt) ρ(0) exp(iHt)
# Approximate with VQE
ansatz = RealAmplitudes(num_qubits=n_qubits, reps=ansatz_reps)
# Combine initial state + ansatz
full_circuit = initial_state_circuit.copy()
full_circuit.compose(ansatz, inplace=True)
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, full_circuit, optimizer)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
results.append({
'time': t,
'energy': result.eigenvalue,
'parameters': result.optimal_parameters
})
print(f"Time {t:.2f}: Energy = {result.eigenvalue:.6f}")
return resultspython
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import numpy as np
def simulate_dynamics(hamiltonian, initial_state_circuit, times, ansatz_reps=2):
"""
Simulate quantum dynamics using VQE at different times.
Args:
hamiltonian: Time-evolution Hamiltonian
initial_state_circuit: Circuit preparing initial state
times: Array of times to simulate
ansatz_reps: Repetitions in ansatz
"""
n_qubits = hamiltonian.num_qubits
results = []
for t in times:
# Time-evolved Hamiltonian: H(t) = exp(-iHt) ρ(0) exp(iHt)
# Approximate with VQE
ansatz = RealAmplitudes(num_qubits=n_qubits, reps=ansatz_reps)
# Combine initial state + ansatz
full_circuit = initial_state_circuit.copy()
full_circuit.compose(ansatz, inplace=True)
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, full_circuit, optimizer)
result = vqe.compute_minimum_eigenvalue(hamiltonian)
results.append({
'time': t,
'energy': result.eigenvalue,
'parameters': result.optimal_parameters
})
print(f"Time {t:.2f}: Energy = {result.eigenvalue:.6f}")
return resultsExample: Simulate Heisenberg model
Example: Simulate Heisenberg model
hamiltonian = SparsePauliOp(
['XX', 'YY', 'ZZ'],
coeffs=[0.5, 0.5, 0.5]
)
hamiltonian = SparsePauliOp(
['XX', 'YY', 'ZZ'],
coeffs=[0.5, 0.5, 0.5]
)
Initial state: |01⟩
Initial state: |01⟩
initial_state = QuantumCircuit(2)
initial_state.x(1)
initial_state = QuantumCircuit(2)
initial_state.x(1)
Simulate at different times
Simulate at different times
times = np.linspace(0, 2, 5)
results = simulate_dynamics(hamiltonian, initial_state, times)
undefinedtimes = np.linspace(0, 2, 5)
results = simulate_dynamics(hamiltonian, initial_state, times)
undefinedQuantum Machine Learning
量子机器学习
Quantum Kernel Method
量子核方法
python
undefinedpython
undefinedRequires: pip install qiskit-machine-learning
Requires: pip install qiskit-machine-learning
from qiskit_machine_learning.kernels import FidelityQuantumKernel
from qiskit.circuit.library import ZZFeatureMap
from qiskit.primitives import Sampler
from sklearn.svm import SVC
import numpy as np
from qiskit_machine_learning.kernels import FidelityQuantumKernel
from qiskit.circuit.library import ZZFeatureMap
from qiskit.primitives import Sampler
from sklearn.svm import SVC
import numpy as np
Generate synthetic data
Generate synthetic data
np.random.seed(42)
X_train = np.random.rand(20, 2) * 2 * np.pi
y_train = (X_train[:, 0] + X_train[:, 1] > np.pi).astype(int)
X_test = np.random.rand(10, 2) * 2 * np.pi
y_test = (X_test[:, 0] + X_test[:, 1] > np.pi).astype(int)
np.random.seed(42)
X_train = np.random.rand(20, 2) * 2 * np.pi
y_train = (X_train[:, 0] + X_train[:, 1] > np.pi).astype(int)
X_test = np.random.rand(10, 2) * 2 * np.pi
y_test = (X_test[:, 0] + X_test[:, 1] > np.pi).astype(int)
Create feature map
Create feature map
feature_map = ZZFeatureMap(feature_dimension=2, reps=2)
feature_map = ZZFeatureMap(feature_dimension=2, reps=2)
Create quantum kernel
Create quantum kernel
sampler = Sampler()
quantum_kernel = FidelityQuantumKernel(feature_map=feature_map, fidelity=sampler)
sampler = Sampler()
quantum_kernel = FidelityQuantumKernel(feature_map=feature_map, fidelity=sampler)
Compute kernel matrix
Compute kernel matrix
kernel_matrix_train = quantum_kernel.evaluate(x_vec=X_train)
kernel_matrix_test = quantum_kernel.evaluate(x_vec=X_test, y_vec=X_train)
print(f"Training kernel matrix shape: {kernel_matrix_train.shape}")
print(f"Test kernel matrix shape: {kernel_matrix_test.shape}")
kernel_matrix_train = quantum_kernel.evaluate(x_vec=X_train)
kernel_matrix_test = quantum_kernel.evaluate(x_vec=X_test, y_vec=X_train)
print(f"Training kernel matrix shape: {kernel_matrix_train.shape}")
print(f"Test kernel matrix shape: {kernel_matrix_test.shape}")
Use with SVM
Use with SVM
svc = SVC(kernel='precomputed')
svc.fit(kernel_matrix_train, y_train)
svc = SVC(kernel='precomputed')
svc.fit(kernel_matrix_train, y_train)
Predict
Predict
predictions = svc.predict(kernel_matrix_test)
accuracy = np.mean(predictions == y_test)
print(f"\nQuantum Kernel SVM Accuracy: {accuracy:.2%}")
undefinedpredictions = svc.predict(kernel_matrix_test)
accuracy = np.mean(predictions == y_test)
print(f"\nQuantum Kernel SVM Accuracy: {accuracy:.2%}")
undefinedVariational Quantum Classifier (VQC)
变分量子分类器(VQC)
python
from qiskit_machine_learning.algorithms import VQC
from qiskit.circuit.library import RealAmplitudes, ZZFeatureMap
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler
import numpy as nppython
from qiskit_machine_learning.algorithms import VQC
from qiskit.circuit.library import RealAmplitudes, ZZFeatureMap
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler
import numpy as npGenerate training data
Generate training data
np.random.seed(42)
X_train = np.random.rand(40, 2) * 2 - 1 # [-1, 1]
y_train = (X_train[:, 0]**2 + X_train[:, 1]**2 < 0.5).astype(int)
X_test = np.random.rand(20, 2) * 2 - 1
y_test = (X_test[:, 0]**2 + X_test[:, 1]**2 < 0.5).astype(int)
np.random.seed(42)
X_train = np.random.rand(40, 2) * 2 - 1 # [-1, 1]
y_train = (X_train[:, 0]**2 + X_train[:, 1]**2 < 0.5).astype(int)
X_test = np.random.rand(20, 2) * 2 - 1
y_test = (X_test[:, 0]**2 + X_test[:, 1]**2 < 0.5).astype(int)
Feature map
Feature map
feature_map = ZZFeatureMap(2)
feature_map = ZZFeatureMap(2)
Ansatz
Ansatz
ansatz = RealAmplitudes(2, reps=2)
ansatz = RealAmplitudes(2, reps=2)
Create VQC
Create VQC
optimizer = COBYLA(maxiter=100)
sampler = Sampler()
vqc = VQC(
sampler=sampler,
feature_map=feature_map,
ansatz=ansatz,
optimizer=optimizer,
)
optimizer = COBYLA(maxiter=100)
sampler = Sampler()
vqc = VQC(
sampler=sampler,
feature_map=feature_map,
ansatz=ansatz,
optimizer=optimizer,
)
Train
Train
vqc.fit(X_train, y_train)
vqc.fit(X_train, y_train)
Predict
Predict
train_score = vqc.score(X_train, y_train)
test_score = vqc.score(X_test, y_test)
print(f"Training accuracy: {train_score:.2%}")
print(f"Test accuracy: {test_score:.2%}")
train_score = vqc.score(X_train, y_train)
test_score = vqc.score(X_test, y_test)
print(f"Training accuracy: {train_score:.2%}")
print(f"Test accuracy: {test_score:.2%}")
Predictions
Predictions
predictions = vqc.predict(X_test)
print(f"Sample predictions: {predictions[:5]}")
print(f"True labels: {y_test[:5]}")
undefinedpredictions = vqc.predict(X_test)
print(f"Sample predictions: {predictions[:5]}")
print(f"True labels: {y_test[:5]}")
undefinedQuantum Neural Network (QNN)
量子神经网络(QNN)
python
from qiskit_machine_learning.neural_networks import SamplerQNN
from qiskit_machine_learning.algorithms import NeuralNetworkClassifier
from qiskit.circuit import QuantumCircuit, Parameter
from qiskit.circuit.library import RealAmplitudes
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler
import numpy as nppython
from qiskit_machine_learning.neural_networks import SamplerQNN
from qiskit_machine_learning.algorithms import NeuralNetworkClassifier
from qiskit.circuit import QuantumCircuit, Parameter
from qiskit.circuit.library import RealAmplitudes
from qiskit.algorithms.optimizers import COBYLA
from qiskit.primitives import Sampler
import numpy as npCreate parameterized quantum circuit
Create parameterized quantum circuit
def create_qnn_circuit(num_qubits, num_features):
qc = QuantumCircuit(num_qubits)
# Feature map parameters
feature_params = [Parameter(f'x{i}') for i in range(num_features)]
# Encode features
for i, param in enumerate(feature_params):
if i < num_qubits:
qc.ry(param, i)
# Variational part
ansatz = RealAmplitudes(num_qubits, reps=1)
qc.compose(ansatz, inplace=True)
return qc, feature_params, ansatz.parametersnum_qubits = 2
num_features = 2
qc, feature_params, weight_params = create_qnn_circuit(num_qubits, num_features)
def create_qnn_circuit(num_qubits, num_features):
qc = QuantumCircuit(num_qubits)
# Feature map parameters
feature_params = [Parameter(f'x{i}') for i in range(num_features)]
# Encode features
for i, param in enumerate(feature_params):
if i < num_qubits:
qc.ry(param, i)
# Variational part
ansatz = RealAmplitudes(num_qubits, reps=1)
qc.compose(ansatz, inplace=True)
return qc, feature_params, ansatz.parametersnum_qubits = 2
num_features = 2
qc, feature_params, weight_params = create_qnn_circuit(num_qubits, num_features)
Create QNN
Create QNN
sampler = Sampler()
qnn = SamplerQNN(
circuit=qc,
input_params=feature_params,
weight_params=weight_params,
sampler=sampler,
)
sampler = Sampler()
qnn = SamplerQNN(
circuit=qc,
input_params=feature_params,
weight_params=weight_params,
sampler=sampler,
)
Create classifier
Create classifier
optimizer = COBYLA(maxiter=50)
classifier = NeuralNetworkClassifier(
neural_network=qnn,
optimizer=optimizer,
)
optimizer = COBYLA(maxiter=50)
classifier = NeuralNetworkClassifier(
neural_network=qnn,
optimizer=optimizer,
)
Training data
Training data
X_train = np.random.rand(30, 2)
y_train = (X_train[:, 0] > X_train[:, 1]).astype(int)
X_train = np.random.rand(30, 2)
y_train = (X_train[:, 0] > X_train[:, 1]).astype(int)
Train
Train
classifier.fit(X_train, y_train)
classifier.fit(X_train, y_train)
Test
Test
X_test = np.random.rand(10, 2)
y_test = (X_test[:, 0] > X_test[:, 1]).astype(int)
score = classifier.score(X_test, y_test)
print(f"QNN Classifier accuracy: {score:.2%}")
undefinedX_test = np.random.rand(10, 2)
y_test = (X_test[:, 0] > X_test[:, 1]).astype(int)
score = classifier.score(X_test, y_test)
print(f"QNN Classifier accuracy: {score:.2%}")
undefinedNoise Modeling and Error Mitigation
噪声建模与错误缓解
Noise Models
噪声模型
python
from qiskit.providers.aer import AerSimulator
from qiskit.providers.aer.noise import NoiseModel
from qiskit.providers.aer.noise import depolarizing_error, thermal_relaxation_error
from qiskit import QuantumCircuit
import numpy as nppython
from qiskit.providers.aer import AerSimulator
from qiskit.providers.aer.noise import NoiseModel
from qiskit.providers.aer.noise import depolarizing_error, thermal_relaxation_error
from qiskit import QuantumCircuit
import numpy as npCreate noise model
Create noise model
noise_model = NoiseModel()
noise_model = NoiseModel()
Depolarizing error on single-qubit gates
Depolarizing error on single-qubit gates
error_1q = depolarizing_error(0.001, 1) # 0.1% error
noise_model.add_all_qubit_quantum_error(error_1q, ['u1', 'u2', 'u3', 'rx', 'ry', 'rz'])
error_1q = depolarizing_error(0.001, 1) # 0.1% error
noise_model.add_all_qubit_quantum_error(error_1q, ['u1', 'u2', 'u3', 'rx', 'ry', 'rz'])
Depolarizing error on two-qubit gates
Depolarizing error on two-qubit gates
error_2q = depolarizing_error(0.01, 2) # 1% error
noise_model.add_all_qubit_quantum_error(error_2q, ['cx', 'cz', 'swap'])
error_2q = depolarizing_error(0.01, 2) # 1% error
noise_model.add_all_qubit_quantum_error(error_2q, ['cx', 'cz', 'swap'])
Thermal relaxation error
Thermal relaxation error
T1 = 50 microseconds, T2 = 70 microseconds, gate_time = 0.1 microseconds
T1 = 50 microseconds, T2 = 70 microseconds, gate_time = 0.1 microseconds
t1 = 50e3 # ns
t2 = 70e3 # ns
gate_time = 100 # ns
error_thermal = thermal_relaxation_error(t1, t2, gate_time)
noise_model.add_all_qubit_quantum_error(error_thermal, ['id'])
t1 = 50e3 # ns
t2 = 70e3 # ns
gate_time = 100 # ns
error_thermal = thermal_relaxation_error(t1, t2, gate_time)
noise_model.add_all_qubit_quantum_error(error_thermal, ['id'])
Measurement error
Measurement error
from qiskit.providers.aer.noise import ReadoutError
prob_meas0_prep1 = 0.05 # Prob of measuring 0 when prepared in 1
prob_meas1_prep0 = 0.10 # Prob of measuring 1 when prepared in 0
readout_error = ReadoutError([[1 - prob_meas1_prep0, prob_meas1_prep0],
[prob_meas0_prep1, 1 - prob_meas0_prep1]])
noise_model.add_all_qubit_readout_error(readout_error)
print(f"Noise model: {noise_model}")
from qiskit.providers.aer.noise import ReadoutError
prob_meas0_prep1 = 0.05 # Prob of measuring 0 when prepared in 1
prob_meas1_prep0 = 0.10 # Prob of measuring 1 when prepared in 0
readout_error = ReadoutError([[1 - prob_meas1_prep0, prob_meas1_prep0],
[prob_meas0_prep1, 1 - prob_meas0_prep1]])
noise_model.add_all_qubit_readout_error(readout_error)
print(f"Noise model: {noise_model}")
Run circuit with noise
Run circuit with noise
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
Noiseless simulation
Noiseless simulation
simulator_ideal = AerSimulator()
job_ideal = simulator_ideal.run(qc, shots=1000)
counts_ideal = job_ideal.result().get_counts()
simulator_ideal = AerSimulator()
job_ideal = simulator_ideal.run(qc, shots=1000)
counts_ideal = job_ideal.result().get_counts()
Noisy simulation
Noisy simulation
simulator_noisy = AerSimulator(noise_model=noise_model)
job_noisy = simulator_noisy.run(qc, shots=1000)
counts_noisy = job_noisy.result().get_counts()
print(f"\nIdeal results: {counts_ideal}")
print(f"Noisy results: {counts_noisy}")
undefinedsimulator_noisy = AerSimulator(noise_model=noise_model)
job_noisy = simulator_noisy.run(qc, shots=1000)
counts_noisy = job_noisy.result().get_counts()
print(f"\nIdeal results: {counts_ideal}")
print(f"Noisy results: {counts_noisy}")
undefinedZero-Noise Extrapolation (ZNE)
零噪声外推(ZNE)
python
from qiskit import QuantumCircuit, transpile
from qiskit.providers.aer import AerSimulator
from qiskit.providers.aer.noise import NoiseModel, depolarizing_error
import numpy as np
from scipy.optimize import curve_fit
def run_circuit_with_noise(circuit, noise_level, shots=1000):
"""Run circuit with scaled noise."""
# Create noise model
noise_model = NoiseModel()
error = depolarizing_error(noise_level, 1)
noise_model.add_all_qubit_quantum_error(error, ['u1', 'u2', 'u3'])
# Simulate
simulator = AerSimulator(noise_model=noise_model)
job = simulator.run(circuit, shots=shots)
result = job.result()
# Extract expectation value (simplified)
counts = result.get_counts()
expectation = sum(counts.get(bitstring, 0) * (-1)**bitstring.count('1')
for bitstring in counts) / shots
return expectation
def zero_noise_extrapolation(circuit, noise_levels, shots=1000):
"""
Perform zero-noise extrapolation.
Args:
circuit: Quantum circuit
noise_levels: List of noise scaling factors
shots: Number of shots per simulation
"""
expectations = []
for noise in noise_levels:
exp_val = run_circuit_with_noise(circuit, noise, shots)
expectations.append(exp_val)
print(f"Noise {noise:.4f}: Expectation = {exp_val:.4f}")
# Fit exponential model: E(λ) = A + B * exp(-C * λ)
def exp_model(x, a, b, c):
return a + b * np.exp(-c * x)
# Fit
popt, _ = curve_fit(exp_model, noise_levels, expectations)
# Extrapolate to zero noise
zero_noise_value = exp_model(0, *popt)
print(f"\nZero-noise extrapolated value: {zero_noise_value:.4f}")
return zero_noise_value, expectationspython
from qiskit import QuantumCircuit, transpile
from qiskit.providers.aer import AerSimulator
from qiskit.providers.aer.noise import NoiseModel, depolarizing_error
import numpy as np
from scipy.optimize import curve_fit
def run_circuit_with_noise(circuit, noise_level, shots=1000):
"""Run circuit with scaled noise."""
# Create noise model
noise_model = NoiseModel()
error = depolarizing_error(noise_level, 1)
noise_model.add_all_qubit_quantum_error(error, ['u1', 'u2', 'u3'])
# Simulate
simulator = AerSimulator(noise_model=noise_model)
job = simulator.run(circuit, shots=shots)
result = job.result()
# Extract expectation value (simplified)
counts = result.get_counts()
expectation = sum(counts.get(bitstring, 0) * (-1)**bitstring.count('1')
for bitstring in counts) / shots
return expectation
def zero_noise_extrapolation(circuit, noise_levels, shots=1000):
"""
Perform zero-noise extrapolation.
Args:
circuit: Quantum circuit
noise_levels: List of noise scaling factors
shots: Number of shots per simulation
"""
expectations = []
for noise in noise_levels:
exp_val = run_circuit_with_noise(circuit, noise, shots)
expectations.append(exp_val)
print(f"Noise {noise:.4f}: Expectation = {exp_val:.4f}")
# Fit exponential model: E(λ) = A + B * exp(-C * λ)
def exp_model(x, a, b, c):
return a + b * np.exp(-c * x)
# Fit
popt, _ = curve_fit(exp_model, noise_levels, expectations)
# Extrapolate to zero noise
zero_noise_value = exp_model(0, *popt)
print(f"\nZero-noise extrapolated value: {zero_noise_value:.4f}")
return zero_noise_value, expectationsExample circuit
Example circuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
Run ZNE
Run ZNE
noise_levels = np.array([0.001, 0.005, 0.01, 0.02])
zne_value, measured_values = zero_noise_extrapolation(qc, noise_levels)
undefinednoise_levels = np.array([0.001, 0.005, 0.01, 0.02])
zne_value, measured_values = zero_noise_extrapolation(qc, noise_levels)
undefinedMeasurement Error Mitigation
测量错误缓解
python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.providers.aer.noise import NoiseModel, ReadoutError
from qiskit.result import marginal_counts
from qiskit.ignis.mitigation.measurement import (
complete_meas_cal,
CompleteMeasFitter
)python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.providers.aer.noise import NoiseModel, ReadoutError
from qiskit.result import marginal_counts
from qiskit.ignis.mitigation.measurement import (
complete_meas_cal,
CompleteMeasFitter
)Create readout noise
Create readout noise
prob_meas0_prep1 = 0.1
prob_meas1_prep0 = 0.05
readout_error = ReadoutError([[1 - prob_meas1_prep0, prob_meas1_prep0],
[prob_meas0_prep1, 1 - prob_meas0_prep1]])
noise_model = NoiseModel()
noise_model.add_all_qubit_readout_error(readout_error)
prob_meas0_prep1 = 0.1
prob_meas1_prep0 = 0.05
readout_error = ReadoutError([[1 - prob_meas1_prep0, prob_meas1_prep0],
[prob_meas0_prep1, 1 - prob_meas0_prep1]])
noise_model = NoiseModel()
noise_model.add_all_qubit_readout_error(readout_error)
Generate calibration circuits
Generate calibration circuits
n_qubits = 2
meas_calibs, state_labels = complete_meas_cal(qr=list(range(n_qubits)))
n_qubits = 2
meas_calibs, state_labels = complete_meas_cal(qr=list(range(n_qubits)))
Run calibration
Run calibration
simulator = AerSimulator(noise_model=noise_model)
cal_results = []
for circuit in meas_calibs:
job = simulator.run(circuit, shots=1000)
cal_results.append(job.result())
simulator = AerSimulator(noise_model=noise_model)
cal_results = []
for circuit in meas_calibs:
job = simulator.run(circuit, shots=1000)
cal_results.append(job.result())
Fit the calibration
Fit the calibration
meas_fitter = CompleteMeasFitter(cal_results, state_labels)
meas_fitter = CompleteMeasFitter(cal_results, state_labels)
Get mitigation matrix
Get mitigation matrix
print("Calibration matrix:")
print(meas_fitter.cal_matrix)
print("Calibration matrix:")
print(meas_fitter.cal_matrix)
Run actual circuit
Run actual circuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
job = simulator.run(qc, shots=1000)
result = job.result()
noisy_counts = result.get_counts()
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
job = simulator.run(qc, shots=1000)
result = job.result()
noisy_counts = result.get_counts()
Apply mitigation
Apply mitigation
mitigated_counts = meas_fitter.filter.apply(noisy_counts)
print(f"\nNoisy counts: {noisy_counts}")
print(f"Mitigated counts: {mitigated_counts}")
undefinedmitigated_counts = meas_fitter.filter.apply(noisy_counts)
print(f"\nNoisy counts: {noisy_counts}")
print(f"Mitigated counts: {mitigated_counts}")
undefinedTranspilation and Optimization
转译与优化
Basic Transpilation
基础转译
python
from qiskit import QuantumCircuit, transpile
from qiskit.providers.fake_provider import FakeMontreal
from qiskit.visualization import plot_circuit_layout
import matplotlib.pyplot as pltpython
from qiskit import QuantumCircuit, transpile
from qiskit.providers.fake_provider import FakeMontreal
from qiskit.visualization import plot_circuit_layout
import matplotlib.pyplot as pltCreate circuit
Create circuit
qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.cx(0, 2)
qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.cx(0, 2)
Get fake backend (simulates real hardware)
Get fake backend (simulates real hardware)
backend = FakeMontreal()
backend = FakeMontreal()
Transpile with different optimization levels
Transpile with different optimization levels
for level in range(4):
transpiled = transpile(qc, backend=backend, optimization_level=level)
print(f"\nOptimization level {level}:")
print(f" Depth: {transpiled.depth()}")
print(f" Gate count: {len(transpiled.data)}")
print(f" CNOT count: {transpiled.count_ops().get('cx', 0)}")for level in range(4):
transpiled = transpile(qc, backend=backend, optimization_level=level)
print(f"\nOptimization level {level}:")
print(f" Depth: {transpiled.depth()}")
print(f" Gate count: {len(transpiled.data)}")
print(f" CNOT count: {transpiled.count_ops().get('cx', 0)}")Best transpilation
Best transpilation
best_transpiled = transpile(qc, backend=backend, optimization_level=3)
print(f"\nOriginal circuit:")
print(f" Depth: {qc.depth()}")
print(f" Gates: {len(qc.data)}")
print(f"\nTranspiled circuit:")
print(f" Depth: {best_transpiled.depth()}")
print(f" Gates: {len(best_transpiled.data)}")
undefinedbest_transpiled = transpile(qc, backend=backend, optimization_level=3)
print(f"\nOriginal circuit:")
print(f" Depth: {qc.depth()}")
print(f" Gates: {len(qc.data)}")
print(f"\nTranspiled circuit:")
print(f" Depth: {best_transpiled.depth()}")
print(f" Gates: {len(best_transpiled.data)}")
undefinedCustom Transpilation Pass
自定义转译流程
python
from qiskit import QuantumCircuit
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import Optimize1qGates, CommutativeCancellation
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMorepython
from qiskit import QuantumCircuit
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import Optimize1qGates, CommutativeCancellation
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMoreCreate circuit with redundant gates
Create circuit with redundant gates
qc = QuantumCircuit(2)
qc.h(0)
qc.h(0) # Redundant - cancels previous H
qc.x(1)
qc.x(1) # Redundant - cancels previous X
qc.cx(0, 1)
print(f"Original circuit depth: {qc.depth()}")
print(f"Original gate count: {len(qc.data)}")
qc = QuantumCircuit(2)
qc.h(0)
qc.h(0) # Redundant - cancels previous H
qc.x(1)
qc.x(1) # Redundant - cancels previous X
qc.cx(0, 1)
print(f"Original circuit depth: {qc.depth()}")
print(f"Original gate count: {len(qc.data)}")
Create custom pass manager
Create custom pass manager
pm = PassManager()
pm = PassManager()
Add optimization passes
Add optimization passes
pm.append(Optimize1qGates()) # Optimize single-qubit gates
pm.append(CommutativeCancellation()) # Cancel commuting gates
pm.append(Unroll3qOrMore()) # Decompose 3+ qubit gates
pm.append(UnitarySynthesis()) # Synthesize unitaries
pm.append(Optimize1qGates()) # Optimize single-qubit gates
pm.append(CommutativeCancellation()) # Cancel commuting gates
pm.append(Unroll3qOrMore()) # Decompose 3+ qubit gates
pm.append(UnitarySynthesis()) # Synthesize unitaries
Run pass manager
Run pass manager
optimized_qc = pm.run(qc)
print(f"\nOptimized circuit depth: {optimized_qc.depth()}")
print(f"Optimized gate count: {len(optimized_qc.data)}")
print("\nOriginal circuit:")
print(qc.draw())
print("\nOptimized circuit:")
print(optimized_qc.draw())
undefinedoptimized_qc = pm.run(qc)
print(f"\nOptimized circuit depth: {optimized_qc.depth()}")
print(f"Optimized gate count: {len(optimized_qc.data)}")
print("\nOriginal circuit:")
print(qc.draw())
print("\nOptimized circuit:")
print(optimized_qc.draw())
undefinedLayout and Routing
布局与路由
python
from qiskit import QuantumCircuit, transpile
from qiskit.providers.fake_provider import FakeMontreal
from qiskit.transpiler import CouplingMappython
from qiskit import QuantumCircuit, transpile
from qiskit.providers.fake_provider import FakeMontreal
from qiskit.transpiler import CouplingMapCreate circuit that requires routing
Create circuit that requires routing
qc = QuantumCircuit(5)
qc.h(0)
qc.cx(0, 4) # Long-range connection
qc.cx(1, 3)
qc.cx(2, 4)
qc = QuantumCircuit(5)
qc.h(0)
qc.cx(0, 4) # Long-range connection
qc.cx(1, 3)
qc.cx(2, 4)
Fake backend with specific topology
Fake backend with specific topology
backend = FakeMontreal()
coupling_map = backend.configuration().coupling_map
print(f"Backend coupling map: {coupling_map[:10]}...") # First 10 edges
backend = FakeMontreal()
coupling_map = backend.configuration().coupling_map
print(f"Backend coupling map: {coupling_map[:10]}...") # First 10 edges
Transpile with layout awareness
Transpile with layout awareness
transpiled = transpile(
qc,
backend=backend,
optimization_level=3,
seed_transpiler=42 # For reproducibility
)
transpiled = transpile(
qc,
backend=backend,
optimization_level=3,
seed_transpiler=42 # For reproducibility
)
Get final layout
Get final layout
final_layout = transpiled.layout.final_index_layout()
print(f"\nFinal qubit layout: {final_layout}")
print(f"\nOriginal circuit:")
print(f" Depth: {qc.depth()}")
print(f" CNOT count: {qc.count_ops().get('cx', 0)}")
print(f"\nTranspiled circuit (with routing):")
print(f" Depth: {transpiled.depth()}")
print(f" CNOT count: {transpiled.count_ops().get('cx', 0)}")
print(f" SWAP count: {transpiled.count_ops().get('swap', 0)}")
undefinedfinal_layout = transpiled.layout.final_index_layout()
print(f"\nFinal qubit layout: {final_layout}")
print(f"\nOriginal circuit:")
print(f" Depth: {qc.depth()}")
print(f" CNOT count: {qc.count_ops().get('cx', 0)}")
print(f"\nTranspiled circuit (with routing):")
print(f" Depth: {transpiled.depth()}")
print(f" CNOT count: {transpiled.count_ops().get('cx', 0)}")
print(f" SWAP count: {transpiled.count_ops().get('swap', 0)}")
undefinedQuantum Information Theory
量子信息论
Entanglement Measures
纠缠度量
python
from qiskit.quantum_info import Statevector, DensityMatrix, partial_trace
from qiskit.quantum_info import entropy, entanglement_of_formation
from qiskit import QuantumCircuit
import numpy as nppython
from qiskit.quantum_info import Statevector, DensityMatrix, partial_trace
from qiskit.quantum_info import entropy, entanglement_of_formation
from qiskit import QuantumCircuit
import numpy as npCreate entangled state (Bell state)
Create entangled state (Bell state)
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
state = Statevector.from_instruction(qc)
density_matrix = DensityMatrix(state)
print(f"Bell state: {state}")
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
state = Statevector.from_instruction(qc)
density_matrix = DensityMatrix(state)
print(f"Bell state: {state}")
Von Neumann entropy (should be 0 for pure states)
Von Neumann entropy (should be 0 for pure states)
entropy_full = entropy(density_matrix)
print(f"\nFull system entropy: {entropy_full:.6f}")
entropy_full = entropy(density_matrix)
print(f"\nFull system entropy: {entropy_full:.6f}")
Reduced density matrix (trace out qubit 1)
Reduced density matrix (trace out qubit 1)
rho_0 = partial_trace(density_matrix, [1])
entropy_reduced = entropy(rho_0)
print(f"Reduced density matrix entropy: {entropy_reduced:.6f}")
rho_0 = partial_trace(density_matrix, [1])
entropy_reduced = entropy(rho_0)
print(f"Reduced density matrix entropy: {entropy_reduced:.6f}")
Entanglement of formation
Entanglement of formation
For Bell state, should be 1
For Bell state, should be 1
eof = entanglement_of_formation(density_matrix)
print(f"Entanglement of formation: {eof:.6f}")
eof = entanglement_of_formation(density_matrix)
print(f"Entanglement of formation: {eof:.6f}")
Compare with separable state
Compare with separable state
qc_sep = QuantumCircuit(2)
qc_sep.h(0)
qc_sep.h(1)
state_sep = Statevector.from_instruction(qc_sep)
dm_sep = DensityMatrix(state_sep)
rho_0_sep = partial_trace(dm_sep, [1])
entropy_sep = entropy(rho_0_sep)
print(f"\nSeparable state reduced entropy: {entropy_sep:.6f}")
undefinedqc_sep = QuantumCircuit(2)
qc_sep.h(0)
qc_sep.h(1)
state_sep = Statevector.from_instruction(qc_sep)
dm_sep = DensityMatrix(state_sep)
rho_0_sep = partial_trace(dm_sep, [1])
entropy_sep = entropy(rho_0_sep)
print(f"\nSeparable state reduced entropy: {entropy_sep:.6f}")
undefinedQuantum Channels and Process Tomography
量子信道与过程层析
python
from qiskit.quantum_info import Choi, SuperOp, Kraus
from qiskit import QuantumCircuit
import numpy as nppython
from qiskit.quantum_info import Choi, SuperOp, Kraus
from qiskit import QuantumCircuit
import numpy as npDefine a quantum channel (amplitude damping)
Define a quantum channel (amplitude damping)
def amplitude_damping_channel(gamma):
"""
Amplitude damping channel with damping parameter gamma.
Models energy dissipation.
"""
K0 = np.array([[1, 0], [0, np.sqrt(1 - gamma)]])
K1 = np.array([[0, np.sqrt(gamma)], [0, 0]])
return Kraus([K0, K1])def amplitude_damping_channel(gamma):
"""
Amplitude damping channel with damping parameter gamma.
Models energy dissipation.
"""
K0 = np.array([[1, 0], [0, np.sqrt(1 - gamma)]])
K1 = np.array([[0, np.sqrt(gamma)], [0, 0]])
return Kraus([K0, K1])Create channel
Create channel
gamma = 0.3
channel = amplitude_damping_channel(gamma)
print(f"Amplitude damping channel (γ={gamma}):")
print(f"Number of Kraus operators: {len(channel)}")
gamma = 0.3
channel = amplitude_damping_channel(gamma)
print(f"Amplitude damping channel (γ={gamma}):")
print(f"Number of Kraus operators: {len(channel)}")
Convert to different representations
Convert to different representations
superop = SuperOp(channel)
choi = Choi(channel)
print(f"\nSuperoperator shape: {superop.dim}")
print(f"Choi matrix shape: {choi.dim}")
superop = SuperOp(channel)
choi = Choi(channel)
print(f"\nSuperoperator shape: {superop.dim}")
print(f"Choi matrix shape: {choi.dim}")
Apply channel to a state
Apply channel to a state
from qiskit.quantum_info import Statevector, DensityMatrix
from qiskit.quantum_info import Statevector, DensityMatrix
Initial state |1⟩
Initial state |1⟩
state = Statevector([0, 1])
dm = DensityMatrix(state)
state = Statevector([0, 1])
dm = DensityMatrix(state)
Apply channel
Apply channel
dm_evolved = dm.evolve(channel)
print(f"\nInitial state: {state}")
print(f"After channel: {dm_evolved}")
dm_evolved = dm.evolve(channel)
print(f"\nInitial state: {state}")
print(f"After channel: {dm_evolved}")
Measure fidelity
Measure fidelity
from qiskit.quantum_info import state_fidelity
fidelity = state_fidelity(dm, dm_evolved)
print(f"Fidelity: {fidelity:.6f}")
undefinedfrom qiskit.quantum_info import state_fidelity
fidelity = state_fidelity(dm, dm_evolved)
print(f"Fidelity: {fidelity:.6f}")
undefinedQuantum State Tomography
量子态层析
python
from qiskit.quantum_info import Statevector, DensityMatrix
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.quantum_info.states import state_fidelity
import numpy as np
def perform_state_tomography(qc, shots=1000):
"""
Simplified quantum state tomography.
Measures in X, Y, Z bases to reconstruct density matrix.
"""
simulator = AerSimulator()
# Measurement circuits in different bases
measurements = {
'Z': QuantumCircuit(qc.num_qubits, qc.num_qubits),
'X': QuantumCircuit(qc.num_qubits, qc.num_qubits),
'Y': QuantumCircuit(qc.num_qubits, qc.num_qubits)
}
# X basis: apply H before measurement
measurements['X'].h(range(qc.num_qubits))
# Y basis: apply S†H before measurement
measurements['Y'].sdg(range(qc.num_qubits))
measurements['Y'].h(range(qc.num_qubits))
# Measure all
for basis_circ in measurements.values():
basis_circ.measure(range(qc.num_qubits), range(qc.num_qubits))
# Run measurements
results = {}
for basis, meas_circ in measurements.items():
full_circ = qc.copy()
full_circ.compose(meas_circ, inplace=True)
job = simulator.run(full_circ, shots=shots)
results[basis] = job.result().get_counts()
print(f"Z-basis measurements: {results['Z']}")
print(f"X-basis measurements: {results['X']}")
print(f"Y-basis measurements: {results['Y']}")
# Simplified reconstruction (for single qubit)
if qc.num_qubits == 1:
# Extract Pauli expectation values
z_exp = (results['Z'].get('0', 0) - results['Z'].get('1', 0)) / shots
x_exp = (results['X'].get('0', 0) - results['X'].get('1', 0)) / shots
y_exp = (results['Y'].get('0', 0) - results['Y'].get('1', 0)) / shots
# Reconstruct density matrix: ρ = (I + x⟨X⟩ + y⟨Y⟩ + z⟨Z⟩)/2
rho = np.array([
[0.5 + 0.5*z_exp, 0.5*x_exp - 0.5j*y_exp],
[0.5*x_exp + 0.5j*y_exp, 0.5 - 0.5*z_exp]
])
return DensityMatrix(rho)
return Nonepython
from qiskit.quantum_info import Statevector, DensityMatrix
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.quantum_info.states import state_fidelity
import numpy as np
def perform_state_tomography(qc, shots=1000):
"""
Simplified quantum state tomography.
Measures in X, Y, Z bases to reconstruct density matrix.
"""
simulator = AerSimulator()
# Measurement circuits in different bases
measurements = {
'Z': QuantumCircuit(qc.num_qubits, qc.num_qubits),
'X': QuantumCircuit(qc.num_qubits, qc.num_qubits),
'Y': QuantumCircuit(qc.num_qubits, qc.num_qubits)
}
# X basis: apply H before measurement
measurements['X'].h(range(qc.num_qubits))
# Y basis: apply S†H before measurement
measurements['Y'].sdg(range(qc.num_qubits))
measurements['Y'].h(range(qc.num_qubits))
# Measure all
for basis_circ in measurements.values():
basis_circ.measure(range(qc.num_qubits), range(qc.num_qubits))
# Run measurements
results = {}
for basis, meas_circ in measurements.items():
full_circ = qc.copy()
full_circ.compose(meas_circ, inplace=True)
job = simulator.run(full_circ, shots=shots)
results[basis] = job.result().get_counts()
print(f"Z-basis measurements: {results['Z']}")
print(f"X-basis measurements: {results['X']}")
print(f"Y-basis measurements: {results['Y']}")
# Simplified reconstruction (for single qubit)
if qc.num_qubits == 1:
# Extract Pauli expectation values
z_exp = (results['Z'].get('0', 0) - results['Z'].get('1', 0)) / shots
x_exp = (results['X'].get('0', 0) - results['X'].get('1', 0)) / shots
y_exp = (results['Y'].get('0', 0) - results['Y'].get('1', 0)) / shots
# Reconstruct density matrix: ρ = (I + x⟨X⟩ + y⟨Y⟩ + z⟨Z⟩)/2
rho = np.array([
[0.5 + 0.5*z_exp, 0.5*x_exp - 0.5j*y_exp],
[0.5*x_exp + 0.5j*y_exp, 0.5 - 0.5*z_exp]
])
return DensityMatrix(rho)
return NoneTest on a known state
Test on a known state
qc = QuantumCircuit(1)
qc.ry(np.pi/3, 0) # Rotate to create superposition
qc = QuantumCircuit(1)
qc.ry(np.pi/3, 0) # Rotate to create superposition
True state
True state
true_state = Statevector.from_instruction(qc)
true_dm = DensityMatrix(true_state)
true_state = Statevector.from_instruction(qc)
true_dm = DensityMatrix(true_state)
Tomography
Tomography
reconstructed_dm = perform_state_tomography(qc, shots=10000)
if reconstructed_dm is not None:
fidelity = state_fidelity(true_dm, reconstructed_dm)
print(f"\nReconstruction fidelity: {fidelity:.6f}")
print(f"\nTrue density matrix:\n{np.array(true_dm)}")
print(f"\nReconstructed density matrix:\n{np.array(reconstructed_dm)}")
undefinedreconstructed_dm = perform_state_tomography(qc, shots=10000)
if reconstructed_dm is not None:
fidelity = state_fidelity(true_dm, reconstructed_dm)
print(f"\nReconstruction fidelity: {fidelity:.6f}")
print(f"\nTrue density matrix:\n{np.array(true_dm)}")
print(f"\nReconstructed density matrix:\n{np.array(reconstructed_dm)}")
undefinedVisualization
可视化
Circuit Visualization
电路可视化
python
from qiskit import QuantumCircuit
from qiskit.visualization import circuit_drawer
import matplotlib.pyplot as pltpython
from qiskit import QuantumCircuit
from qiskit.visualization import circuit_drawer
import matplotlib.pyplot as pltCreate complex circuit
Create complex circuit
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.barrier()
qc.measure([0, 1, 2], [0, 1, 2])
qc = QuantumCircuit(3, 3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
qc.barrier()
qc.measure([0, 1, 2], [0, 1, 2])
Different drawing styles
Different drawing styles
print("Text representation:")
print(qc.draw(output='text'))
print("Text representation:")
print(qc.draw(output='text'))
Matplotlib style (most common)
Matplotlib style (most common)
print("\nMatplotlib style:")
qc.draw(output='mpl')
plt.show()
print("\nMatplotlib style:")
qc.draw(output='mpl')
plt.show()
LaTeX style (for publications)
LaTeX style (for publications)
qc.draw(output='latex')
qc.draw(output='latex')
With gate labels
With gate labels
qc_labeled = QuantumCircuit(2, 2)
qc_labeled.h(0)
qc_labeled.cx(0, 1)
qc_labeled.measure_all()
qc_labeled.draw(output='mpl', style={'name': 'bw'})
plt.show()
undefinedqc_labeled = QuantumCircuit(2, 2)
qc_labeled.h(0)
qc_labeled.cx(0, 1)
qc_labeled.measure_all()
qc_labeled.draw(output='mpl', style={'name': 'bw'})
plt.show()
undefinedResult Visualization
结果可视化
python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit.quantum_info import Statevector
import matplotlib.pyplot as pltpython
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
from qiskit.visualization import plot_histogram, plot_bloch_multivector
from qiskit.quantum_info import Statevector
import matplotlib.pyplot as pltRun circuit
Run circuit
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
simulator = AerSimulator()
job = simulator.run(qc, shots=1000)
counts = job.result().get_counts()
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.measure([0, 1], [0, 1])
simulator = AerSimulator()
job = simulator.run(qc, shots=1000)
counts = job.result().get_counts()
Histogram
Histogram
plot_histogram(counts, title='Bell State Measurement')
plt.show()
plot_histogram(counts, title='Bell State Measurement')
plt.show()
Multiple result comparison
Multiple result comparison
qc2 = QuantumCircuit(2, 2)
qc2.h(0)
qc2.h(1)
qc2.measure([0, 1], [0, 1])
job2 = simulator.run(qc2, shots=1000)
counts2 = job2.result().get_counts()
plot_histogram([counts, counts2],
legend=['Bell State', 'Product State'],
title='State Comparison')
plt.show()
qc2 = QuantumCircuit(2, 2)
qc2.h(0)
qc2.h(1)
qc2.measure([0, 1], [0, 1])
job2 = simulator.run(qc2, shots=1000)
counts2 = job2.result().get_counts()
plot_histogram([counts, counts2],
legend=['Bell State', 'Product State'],
title='State Comparison')
plt.show()
Bloch sphere visualization
Bloch sphere visualization
qc_bloch = QuantumCircuit(1)
qc_bloch.ry(np.pi/4, 0)
state = Statevector.from_instruction(qc_bloch)
plot_bloch_multivector(state)
plt.show()
undefinedqc_bloch = QuantumCircuit(1)
qc_bloch.ry(np.pi/4, 0)
state = Statevector.from_instruction(qc_bloch)
plot_bloch_multivector(state)
plt.show()
undefinedState Visualization
态可视化
python
from qiskit.quantum_info import Statevector, DensityMatrix
from qiskit.visualization import plot_state_qsphere, plot_state_city
from qiskit.visualization import plot_state_hinton, plot_state_paulivec
import matplotlib.pyplot as pltpython
from qiskit.quantum_info import Statevector, DensityMatrix
from qiskit.visualization import plot_state_qsphere, plot_state_city
from qiskit.visualization import plot_state_hinton, plot_state_paulivec
import matplotlib.pyplot as pltCreate an interesting state
Create an interesting state
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.h(0)
qc.ry(np.pi/4, 1)
qc.cx(0, 1)
state = Statevector.from_instruction(qc)
from qiskit import QuantumCircuit
qc = QuantumCircuit(2)
qc.h(0)
qc.ry(np.pi/4, 1)
qc.cx(0, 1)
state = Statevector.from_instruction(qc)
Q-sphere
Q-sphere
plot_state_qsphere(state, title='Q-sphere')
plt.show()
plot_state_qsphere(state, title='Q-sphere')
plt.show()
City plot
City plot
plot_state_city(state, title='State City')
plt.show()
plot_state_city(state, title='State City')
plt.show()
Hinton plot
Hinton plot
dm = DensityMatrix(state)
plot_state_hinton(dm, title='Density Matrix')
plt.show()
dm = DensityMatrix(state)
plot_state_hinton(dm, title='Density Matrix')
plt.show()
Pauli vector representation
Pauli vector representation
plot_state_paulivec(state, title='Pauli Vector')
plt.show()
undefinedplot_state_paulivec(state, title='Pauli Vector')
plt.show()
undefinedPractical Workflows
实用工作流
Complete VQE Workflow for Molecule
分子VQE完整工作流
python
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.circuit.library import UCCSD, HartreeFock
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
import numpy as np
def calculate_molecule_energy(atom_string, basis='sto3g', charge=0, spin=0):
"""
Complete workflow for molecular energy calculation.
Args:
atom_string: Atomic coordinates (e.g., 'H 0 0 0; H 0 0 0.735')
basis: Basis set
charge: Molecular charge
spin: Spin multiplicity
"""
print(f"Calculating energy for: {atom_string}")
print(f"Basis: {basis}, Charge: {charge}, Spin: {spin}\n")
# 1. Setup driver
driver = PySCFDriver(
atom=atom_string,
basis=basis,
charge=charge,
spin=spin
)
# 2. Get electronic structure problem
problem = driver.run()
# 3. Setup mapper
mapper = JordanWignerMapper()
# 4. Get Hamiltonian
hamiltonian = problem.hamiltonian.second_q_op()
qubit_op = mapper.map(hamiltonian)
print(f"Number of qubits: {qubit_op.num_qubits}")
print(f"Number of Hamiltonian terms: {len(qubit_op)}")
# 5. Setup initial state and ansatz
num_particles = problem.num_particles
num_spatial_orbitals = problem.num_spatial_orbitals
init_state = HartreeFock(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper
)
ansatz = UCCSD(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper,
initial_state=init_state
)
print(f"Ansatz circuit depth: {ansatz.depth()}")
print(f"Number of parameters: {ansatz.num_parameters}\n")
# 6. Run VQE
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(qubit_op)
# 7. Extract results
vqe_energy = result.eigenvalue
hf_energy = problem.reference_energy
print(f"Hartree-Fock energy: {hf_energy:.6f} Ha")
print(f"VQE energy: {vqe_energy:.6f} Ha")
print(f"Correlation energy: {vqe_energy - hf_energy:.6f} Ha")
print(f"Optimizer evaluations: {result.cost_function_evals}")
return {
'vqe_energy': vqe_energy,
'hf_energy': hf_energy,
'correlation': vqe_energy - hf_energy,
'optimal_parameters': result.optimal_parameters,
'num_qubits': qubit_op.num_qubits
}python
from qiskit_nature.second_q.drivers import PySCFDriver
from qiskit_nature.second_q.mappers import JordanWignerMapper
from qiskit_nature.second_q.circuit.library import UCCSD, HartreeFock
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP
from qiskit.primitives import Estimator
import numpy as np
def calculate_molecule_energy(atom_string, basis='sto3g', charge=0, spin=0):
"""
Complete workflow for molecular energy calculation.
Args:
atom_string: Atomic coordinates (e.g., 'H 0 0 0; H 0 0 0.735')
basis: Basis set
charge: Molecular charge
spin: Spin multiplicity
"""
print(f"Calculating energy for: {atom_string}")
print(f"Basis: {basis}, Charge: {charge}, Spin: {spin}\n")
# 1. Setup driver
driver = PySCFDriver(
atom=atom_string,
basis=basis,
charge=charge,
spin=spin
)
# 2. Get electronic structure problem
problem = driver.run()
# 3. Setup mapper
mapper = JordanWignerMapper()
# 4. Get Hamiltonian
hamiltonian = problem.hamiltonian.second_q_op()
qubit_op = mapper.map(hamiltonian)
print(f"Number of qubits: {qubit_op.num_qubits}")
print(f"Number of Hamiltonian terms: {len(qubit_op)}")
# 5. Setup initial state and ansatz
num_particles = problem.num_particles
num_spatial_orbitals = problem.num_spatial_orbitals
init_state = HartreeFock(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper
)
ansatz = UCCSD(
num_spatial_orbitals=num_spatial_orbitals,
num_particles=num_particles,
qubit_mapper=mapper,
initial_state=init_state
)
print(f"Ansatz circuit depth: {ansatz.depth()}")
print(f"Number of parameters: {ansatz.num_parameters}\n")
# 6. Run VQE
optimizer = SLSQP(maxiter=100)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
result = vqe.compute_minimum_eigenvalue(qubit_op)
# 7. Extract results
vqe_energy = result.eigenvalue
hf_energy = problem.reference_energy
print(f"Hartree-Fock energy: {hf_energy:.6f} Ha")
print(f"VQE energy: {vqe_energy:.6f} Ha")
print(f"Correlation energy: {vqe_energy - hf_energy:.6f} Ha")
print(f"Optimizer evaluations: {result.cost_function_evals}")
return {
'vqe_energy': vqe_energy,
'hf_energy': hf_energy,
'correlation': vqe_energy - hf_energy,
'optimal_parameters': result.optimal_parameters,
'num_qubits': qubit_op.num_qubits
}Example: H2 molecule
Example: H2 molecule
results = calculate_molecule_energy('H 0 0 0; H 0 0 0.735')
undefinedresults = calculate_molecule_energy('H 0 0 0; H 0 0 0.735')
undefinedQuantum Circuit Optimization Pipeline
量子电路优化流水线
python
from qiskit import QuantumCircuit, transpile
from qiskit.providers.fake_provider import FakeMontreal
from qiskit.transpiler import PassManager, CouplingMap
from qiskit.transpiler.passes import *
import matplotlib.pyplot as plt
def optimize_circuit_for_hardware(qc, backend=None, optimization_level=3):
"""
Complete circuit optimization pipeline.
Args:
qc: Input quantum circuit
backend: Target backend (or None for generic optimization)
optimization_level: 0-3
"""
print(f"Original circuit:")
print(f" Qubits: {qc.num_qubits}")
print(f" Depth: {qc.depth()}")
print(f" Gate count: {len(qc.data)}")
print(f" Operations: {qc.count_ops()}\n")
if backend is None:
backend = FakeMontreal()
# Standard transpilation
transpiled = transpile(
qc,
backend=backend,
optimization_level=optimization_level,
seed_transpiler=42
)
print(f"After transpilation (level {optimization_level}):")
print(f" Depth: {transpiled.depth()}")
print(f" Gate count: {len(transpiled.data)}")
print(f" Operations: {transpiled.count_ops()}")
print(f" SWAP gates: {transpiled.count_ops().get('swap', 0)}\n")
# Custom optimization passes
pm = PassManager()
# Add passes
pm.append(Optimize1qGates())
pm.append(CommutativeCancellation())
pm.append(CXCancellation())
further_optimized = pm.run(transpiled)
print(f"After custom optimization:")
print(f" Depth: {further_optimized.depth()}")
print(f" Gate count: {len(further_optimized.data)}")
print(f" Operations: {further_optimized.count_ops()}\n")
# Calculate reduction
depth_reduction = (1 - further_optimized.depth() / qc.depth()) * 100
gate_reduction = (1 - len(further_optimized.data) / len(qc.data)) * 100
print(f"Optimization results:")
print(f" Depth reduction: {depth_reduction:.1f}%")
print(f" Gate count reduction: {gate_reduction:.1f}%")
return further_optimizedpython
from qiskit import QuantumCircuit, transpile
from qiskit.providers.fake_provider import FakeMontreal
from qiskit.transpiler import PassManager, CouplingMap
from qiskit.transpiler.passes import *
import matplotlib.pyplot as plt
def optimize_circuit_for_hardware(qc, backend=None, optimization_level=3):
"""
Complete circuit optimization pipeline.
Args:
qc: Input quantum circuit
backend: Target backend (or None for generic optimization)
optimization_level: 0-3
"""
print(f"Original circuit:")
print(f" Qubits: {qc.num_qubits}")
print(f" Depth: {qc.depth()}")
print(f" Gate count: {len(qc.data)}")
print(f" Operations: {qc.count_ops()}\n")
if backend is None:
backend = FakeMontreal()
# Standard transpilation
transpiled = transpile(
qc,
backend=backend,
optimization_level=optimization_level,
seed_transpiler=42
)
print(f"After transpilation (level {optimization_level}):")
print(f" Depth: {transpiled.depth()}")
print(f" Gate count: {len(transpiled.data)}")
print(f" Operations: {transpiled.count_ops()}")
print(f" SWAP gates: {transpiled.count_ops().get('swap', 0)}\n")
# Custom optimization passes
pm = PassManager()
# Add passes
pm.append(Optimize1qGates())
pm.append(CommutativeCancellation())
pm.append(CXCancellation())
further_optimized = pm.run(transpiled)
print(f"After custom optimization:")
print(f" Depth: {further_optimized.depth()}")
print(f" Gate count: {len(further_optimized.data)}")
print(f" Operations: {further_optimized.count_ops()}\n")
# Calculate reduction
depth_reduction = (1 - further_optimized.depth() / qc.depth()) * 100
gate_reduction = (1 - len(further_optimized.data) / len(qc.data)) * 100
print(f"Optimization results:")
print(f" Depth reduction: {depth_reduction:.1f}%")
print(f" Gate count reduction: {gate_reduction:.1f}%")
return further_optimizedExample: Complex circuit
Example: Complex circuit
qc = QuantumCircuit(4)
qc.h(range(4))
for i in range(3):
qc.cx(i, i+1)
qc.barrier()
for i in range(4):
qc.ry(np.pi/4, i)
qc.barrier()
for i in range(2):
qc.cx(i, i+2)
optimized = optimize_circuit_for_hardware(qc)
undefinedqc = QuantumCircuit(4)
qc.h(range(4))
for i in range(3):
qc.cx(i, i+1)
qc.barrier()
for i in range(4):
qc.ry(np.pi/4, i)
qc.barrier()
for i in range(2):
qc.cx(i, i+2)
optimized = optimize_circuit_for_hardware(qc)
undefinedQuantum Algorithm Benchmarking
量子算法基准测试
python
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE, QAOA
from qiskit.algorithms.optimizers import SLSQP, COBYLA, SPSA
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import time
import numpy as np
def benchmark_vqe_optimizers(hamiltonian, ansatz, optimizers_dict, trials=3):
"""
Benchmark different optimizers for VQE.
Args:
hamiltonian: Problem Hamiltonian
ansatz: Variational ansatz
optimizers_dict: Dict of optimizer name -> optimizer instance
trials: Number of trials per optimizer
"""
results = {}
for opt_name, optimizer in optimizers_dict.items():
print(f"\nBenchmarking {opt_name}...")
trial_results = []
for trial in range(trials):
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
start_time = time.time()
result = vqe.compute_minimum_eigenvalue(hamiltonian)
elapsed_time = time.time() - start_time
trial_results.append({
'energy': result.eigenvalue,
'time': elapsed_time,
'evals': result.cost_function_evals
})
print(f" Trial {trial + 1}: E = {result.eigenvalue:.6f}, "
f"Time = {elapsed_time:.2f}s, Evals = {result.cost_function_evals}")
# Aggregate results
energies = [r['energy'] for r in trial_results]
times = [r['time'] for r in trial_results]
evals = [r['evals'] for r in trial_results]
results[opt_name] = {
'mean_energy': np.mean(energies),
'std_energy': np.std(energies),
'mean_time': np.mean(times),
'mean_evals': np.mean(evals),
'best_energy': min(energies)
}
# Print summary
print("\n" + "="*60)
print("BENCHMARK SUMMARY")
print("="*60)
print(f"{'Optimizer':<15} {'Best Energy':>12} {'Mean Time':>12} {'Mean Evals':>12}")
print("-"*60)
for opt_name, res in results.items():
print(f"{opt_name:<15} {res['best_energy']:>12.6f} "
f"{res['mean_time']:>12.2f}s {res['mean_evals']:>12.0f}")
return resultspython
from qiskit import QuantumCircuit
from qiskit.algorithms import VQE, QAOA
from qiskit.algorithms.optimizers import SLSQP, COBYLA, SPSA
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import time
import numpy as np
def benchmark_vqe_optimizers(hamiltonian, ansatz, optimizers_dict, trials=3):
"""
Benchmark different optimizers for VQE.
Args:
hamiltonian: Problem Hamiltonian
ansatz: Variational ansatz
optimizers_dict: Dict of optimizer name -> optimizer instance
trials: Number of trials per optimizer
"""
results = {}
for opt_name, optimizer in optimizers_dict.items():
print(f"\nBenchmarking {opt_name}...")
trial_results = []
for trial in range(trials):
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer)
start_time = time.time()
result = vqe.compute_minimum_eigenvalue(hamiltonian)
elapsed_time = time.time() - start_time
trial_results.append({
'energy': result.eigenvalue,
'time': elapsed_time,
'evals': result.cost_function_evals
})
print(f" Trial {trial + 1}: E = {result.eigenvalue:.6f}, "
f"Time = {elapsed_time:.2f}s, Evals = {result.cost_function_evals}")
# Aggregate results
energies = [r['energy'] for r in trial_results]
times = [r['time'] for r in trial_results]
evals = [r['evals'] for r in trial_results]
results[opt_name] = {
'mean_energy': np.mean(energies),
'std_energy': np.std(energies),
'mean_time': np.mean(times),
'mean_evals': np.mean(evals),
'best_energy': min(energies)
}
# Print summary
print("\n" + "="*60)
print("BENCHMARK SUMMARY")
print("="*60)
print(f"{'Optimizer':<15} {'Best Energy':>12} {'Mean Time':>12} {'Mean Evals':>12}")
print("-"*60)
for opt_name, res in results.items():
print(f"{opt_name:<15} {res['best_energy']:>12.6f} "
f"{res['mean_time']:>12.2f}s {res['mean_evals']:>12.0f}")
return resultsExample: Benchmark for simple Hamiltonian
Example: Benchmark for simple Hamiltonian
hamiltonian = SparsePauliOp(['ZZ', 'XI', 'IX'], coeffs=[1.0, -0.5, -0.5])
ansatz = RealAmplitudes(num_qubits=2, reps=2)
optimizers = {
'SLSQP': SLSQP(maxiter=100),
'COBYLA': COBYLA(maxiter=100),
'SPSA': SPSA(maxiter=100)
}
benchmark_results = benchmark_vqe_optimizers(hamiltonian, ansatz, optimizers, trials=3)
undefinedhamiltonian = SparsePauliOp(['ZZ', 'XI', 'IX'], coeffs=[1.0, -0.5, -0.5])
ansatz = RealAmplitudes(num_qubits=2, reps=2)
optimizers = {
'SLSQP': SLSQP(maxiter=100),
'COBYLA': COBYLA(maxiter=100),
'SPSA': SPSA(maxiter=100)
}
benchmark_results = benchmark_vqe_optimizers(hamiltonian, ansatz, optimizers, trials=3)
undefinedCommon Pitfalls and Solutions
常见陷阱与解决方案
Memory Management for Large Circuits
大电路内存管理
python
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
import numpy as nppython
from qiskit import QuantumCircuit
from qiskit.providers.aer import AerSimulator
import numpy as npProblem: Simulating too many qubits
Problem: Simulating too many qubits
def bad_simulation():
# DON'T DO THIS - will use ~2^25 * 16 bytes = 512 MB per state vector
qc = QuantumCircuit(25)
for i in range(25):
qc.h(i)
# This will be very slow or crash
# simulator = AerSimulator(method='statevector')
# result = simulator.run(qc).result()def bad_simulation():
# DON'T DO THIS - will use ~2^25 * 16 bytes = 512 MB per state vector
qc = QuantumCircuit(25)
for i in range(25):
qc.h(i)
# This will be very slow or crash
# simulator = AerSimulator(method='statevector')
# result = simulator.run(qc).result()Solution 1: Use sampling instead of statevector
Solution 1: Use sampling instead of statevector
def good_simulation_sampling():
qc = QuantumCircuit(25, 25)
for i in range(25):
qc.h(i)
qc.measure_all()
# Much more efficient - doesn't store full state vector
simulator = AerSimulator(method='automatic') # Chooses best method
result = simulator.run(qc, shots=1000).result()
counts = result.get_counts()
return countsdef good_simulation_sampling():
qc = QuantumCircuit(25, 25)
for i in range(25):
qc.h(i)
qc.measure_all()
# Much more efficient - doesn't store full state vector
simulator = AerSimulator(method='automatic') # Chooses best method
result = simulator.run(qc, shots=1000).result()
counts = result.get_counts()
return countsSolution 2: Use Matrix Product State for certain circuits
Solution 2: Use Matrix Product State for certain circuits
def good_simulation_mps():
qc = QuantumCircuit(50) # Can handle more qubits!
# MPS works well for circuits with limited entanglement
for i in range(49):
qc.h(i)
qc.cx(i, i+1) # Nearest-neighbor only
simulator = AerSimulator(method='matrix_product_state')
qc.measure_all()
result = simulator.run(qc, shots=1000).result()
return result.get_counts()def good_simulation_mps():
qc = QuantumCircuit(50) # Can handle more qubits!
# MPS works well for circuits with limited entanglement
for i in range(49):
qc.h(i)
qc.cx(i, i+1) # Nearest-neighbor only
simulator = AerSimulator(method='matrix_product_state')
qc.measure_all()
result = simulator.run(qc, shots=1000).result()
return result.get_counts()Solution 3: Reduce circuit size
Solution 3: Reduce circuit size
def good_simulation_reduced():
# Use fewer qubits or simpler circuits
qc = QuantumCircuit(10) # More manageable
for i in range(10):
qc.h(i)
simulator = AerSimulator()
qc.measure_all()
result = simulator.run(qc, shots=1000).result()
return result.get_counts()def good_simulation_reduced():
# Use fewer qubits or simpler circuits
qc = QuantumCircuit(10) # More manageable
for i in range(10):
qc.h(i)
simulator = AerSimulator()
qc.measure_all()
result = simulator.run(qc, shots=1000).result()
return result.get_counts()Test solutions
Test solutions
counts = good_simulation_sampling()
print(f"Sampling method: {len(counts)} unique outcomes")
undefinedcounts = good_simulation_sampling()
print(f"Sampling method: {len(counts)} unique outcomes")
undefinedHandling Convergence Issues in VQE
VQE收敛问题处理
python
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP, COBYLA
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import numpy as np
def robust_vqe(hamiltonian, n_qubits, max_attempts=5):
"""
VQE with multiple restart attempts and parameter initialization.
Args:
hamiltonian: Problem Hamiltonian
n_qubits: Number of qubits
max_attempts: Maximum restart attempts
"""
best_result = None
best_energy = float('inf')
for attempt in range(max_attempts):
print(f"\nAttempt {attempt + 1}/{max_attempts}")
# Create fresh ansatz
ansatz = RealAmplitudes(num_qubits=n_qubits, reps=2)
# Initialize parameters randomly (but bounded)
initial_point = np.random.uniform(-np.pi, np.pi, ansatz.num_parameters)
# Try different optimizers
if attempt < max_attempts // 2:
optimizer = COBYLA(maxiter=200)
else:
optimizer = SLSQP(maxiter=200)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer, initial_point=initial_point)
try:
result = vqe.compute_minimum_eigenvalue(hamiltonian)
print(f" Energy: {result.eigenvalue:.6f}")
print(f" Evaluations: {result.cost_function_evals}")
if result.eigenvalue < best_energy:
best_energy = result.eigenvalue
best_result = result
print(f" ✓ New best energy!")
except Exception as e:
print(f" ✗ Failed: {e}")
continue
if best_result is None:
raise RuntimeError("All VQE attempts failed")
print(f"\nBest energy found: {best_energy:.6f}")
return best_resultpython
from qiskit.algorithms import VQE
from qiskit.algorithms.optimizers import SLSQP, COBYLA
from qiskit.circuit.library import RealAmplitudes
from qiskit.primitives import Estimator
from qiskit.quantum_info import SparsePauliOp
import numpy as np
def robust_vqe(hamiltonian, n_qubits, max_attempts=5):
"""
VQE with multiple restart attempts and parameter initialization.
Args:
hamiltonian: Problem Hamiltonian
n_qubits: Number of qubits
max_attempts: Maximum restart attempts
"""
best_result = None
best_energy = float('inf')
for attempt in range(max_attempts):
print(f"\nAttempt {attempt + 1}/{max_attempts}")
# Create fresh ansatz
ansatz = RealAmplitudes(num_qubits=n_qubits, reps=2)
# Initialize parameters randomly (but bounded)
initial_point = np.random.uniform(-np.pi, np.pi, ansatz.num_parameters)
# Try different optimizers
if attempt < max_attempts // 2:
optimizer = COBYLA(maxiter=200)
else:
optimizer = SLSQP(maxiter=200)
estimator = Estimator()
vqe = VQE(estimator, ansatz, optimizer, initial_point=initial_point)
try:
result = vqe.compute_minimum_eigenvalue(hamiltonian)
print(f" Energy: {result.eigenvalue:.6f}")
print(f" Evaluations: {result.cost_function_evals}")
if result.eigenvalue < best_energy:
best_energy = result.eigenvalue
best_result = result
print(f" ✓ New best energy!")
except Exception as e:
print(f" ✗ Failed: {e}")
continue
if best_result is None:
raise RuntimeError("All VQE attempts failed")
print(f"\nBest energy found: {best_energy:.6f}")
return best_resultExample usage
Example usage
hamiltonian = SparsePauliOp(['ZZ', 'XI', 'IX'], coeffs=[1.0, -0.5, -0.5])
result = robust_vqe(hamiltonian, n_qubits=2, max_attempts=3)
undefinedhamiltonian = SparsePauliOp(['ZZ', 'XI', 'IX'], coeffs=[1.0, -0.5, -0.5])
result = robust_vqe(hamiltonian, n_qubits=2, max_attempts=3)
undefined