郑州网站建设首选创新,六盘水遵义网站建设怎么做,ai设计室内设计,设计制作参考文献#xff1a;
IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算#xff1a;基本概念常见的几类矩阵#xff08;正交矩阵、酉矩阵、正规矩阵等#xff09;Qiskit 安装指南-博客园使用Python实现量子电路模拟#x…参考文献
IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算基本概念常见的几类矩阵正交矩阵、酉矩阵、正规矩阵等Qiskit 安装指南-博客园使用Python实现量子电路模拟走进量子计算的世界-腾讯云开发者社区-腾讯云如何在 Python 中使用 qiskit 包进行量子计算机编程 - 知乎 文章目录 模拟环境功能简介如何使用量子算法QFTGrover 模拟环境
IBM 的开源库 Qiskit 提供了量子计算中的必要模块甚至可以在量子真机上实验需注册账号但 IP in CN 被拒绝。运行如下的指令
pip install qiskit # qiskit 主体IBM 团队
pip install qiskit[visualization] # 可视化功能IBM 团队
pip install qiskit-ibm-runtime # 量子真机IBM 团队
pip install qiskit-aer # 量子计算模拟器其他团队
pip install qiskit-algorithms # 量子算法实现其他团队目前安装的是 V2.0.2 版本有不少 V1.x的函数已被弃用。因此中文网络上找到的教程中很多代码早已无法正常执行。
然后再安装一些依赖包
pip install pylatexenc
pip install seaborn并且可能需要更新一些包
pip install --upgrade numpy
pip install --upgrade scipy
pip install --upgrade matplotlib不知为何VScode 里的 Jupter 编辑器报错 Could not initialize webview: Error: Could not register service worker: InvalidStateError: Failed to register a ServiceWorker: The document is in an invalid state..}弄了半天。最后是进 任务管理器 杀死全部相关进程重启解决。
下面给一个 .py 测试代码看一下它能否正常执行
import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit_aer import Aer
from qiskit.visualization import plot_histogram# Use Aers qasm_simulator
simulator Aer.get_backend(qasm_simulator)# Create a Quantum Circuit acting on the q register
circuit QuantumCircuit(2, 2)# Add a H gate on qubit 0
circuit.h(0)# Add a CX (CNOT) gate on control qubit 0 and target qubit 1
circuit.cx(0, 1)# Map the quantum measurement to the classical bits
circuit.measure([0,1], [0,1])# Execute the circuit on the qasm simulator
transpiled_circuit transpile(circuit, simulator)
job simulator.run(transpiled_circuit, shots1024)# Grab results from the job
result job.result()# Returns counts
counts result.get_counts(circuit)
print(\nTotal count for 00 and 11 are:,counts)# Draw the circuit
circuit.draw()
其结果应当为
Total count for 00 and 11 are: {00: 492, 11: 532}功能简介
Qiskit SDK包名 qiskit是一个开源的软件开发工具包用于在扩展的静态、动态和预定量子电路、算符和原语层面上与量子计算机协同工作。这个库是 Qiskit 的核心组件是其名下最大的包拥有用于量子计算的最广泛工具集并且许多其他组件都与其交互。 一些最有用的功能包括
Circuit-building toolsqiskit.circuit用于初始化和操作寄存器、电路、指令、门、参数以及控制流对象。Circuit libraryqiskit.circuit.library包含大量的电路、指令和门这些是基于电路的量子计算的关键构建模块。Quantum info libraryqiskit.quantum_info这是一个用于处理量子态、算符和量子通道的工具包采用精确计算无采样噪声。使用此模块来指定输入可观测量并分析来自原语查询的输出保真度。Transpilerqiskit.transpiler用于转换和调整量子电路以适应特定的设备拓扑结构并针对在真实量子处理单元QPUs上的执行进行优化。Primitivesqiskit.primitives该模块包含 Sampler 和 Estimator 原语的基本定义和参考实现不同的量子硬件供应商可以从中派生出自己的实现。
有许多开源项目使用 “Qiskit” 这个名称但并非 Qiskit 本身的一部分相反它们与Qiskit交互并能提供有价值的额外功能以补充 Qiskit 的核心工作流程。其中一些项目由 IBM 量子团队维护而其他项目则得到更广泛的开源社区支持。 一些受欢迎的项目包括
Qiskit Aerqiskit-aer一个用于带有逼真噪声模型的量子计算模拟器的软件包。它提供了接口可使用多种不同的模拟方法运行有无噪声的量子电路。由 IBM 量子团队维护。qBraid SDKqbraid一个对量子软件和硬件供应商均适用、与平台无关的量子运行时框架旨在简化量子任务的全生命周期管理从定义程序规范到任务提交再到结果的后处理和可视化。由 qBraid 维护。mthreemthree一个用于实现 M3Matrix-free Measurement Mitigation的软件包M3 是一种测量缓解技术通过降维步骤然后采用直接 LU 分解或一种通常在 O ( 1 ) O(1) O(1) 步内收敛且可并行计算的预处理迭代方法求解修正后的测量概率。由 IBM 量子团队维护。
这些扩展项目可以在 Qiskit-ecosystem 中找到。
如何使用
使用 Qiskit 编写量子程序的四个步骤是
Map the problem to a quantum-native format.Optimize the circuits and operators.Execute using a quantum primitive function.Analyze the results.
现在新建一个 .ipynb 文件学一下如何使用 Qiskit 模拟环境。简单来说我们用一个长度为 2 n 2^n 2n 的复数向量各个基态的组合系数来表示一个长度 n n n 的量子态。每个量子门就是一个形状 2 n × 2 n 2^n \times 2^n 2n×2n 的酉矩阵幺正矩阵满足 A A H A H A I AA^HA^HAI AAHAHAI 即 A H A − 1 A^HA^{-1} AHA−1其中 A H : A ˉ T A^H:\bar A^T AH:AˉT 是共轭转置包括单量子位门Pauli、Hadamard、Phase、T双量子位门CNOT、Swap三量子位门Toffoli、Fredkin以及一般的量子门等等。
下面的代码来自 这里展示了在带噪的量子系统中制备 Bell 态的电路及其测量。 首先引入必要的库函数 from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit.quantum_info import Statevector然后创建如下的双量子电路简单堆砌量子门它可以构造出 Bell 态即 ∣ 00 ⟩ → ∣ ϕ ⟩ , ∣ 01 ⟩ → ∣ ψ ⟩ , ∣ 10 ⟩ → ∣ ϕ − ⟩ , ∣ 10 ⟩ → ∣ ψ − ⟩ |00\rangle\to|\phi^\rangle,|01\rangle\to|\psi^\rangle,|10\rangle\to|\phi^-\rangle,|10\rangle\to|\psi^-\rangle ∣00⟩→∣ϕ⟩,∣01⟩→∣ψ⟩,∣10⟩→∣ϕ−⟩,∣10⟩→∣ψ−⟩ # Create a new circuit with two qubits
qc QuantumCircuit(2)# initial state |01
state Statevector.from_label(01)
qc.initialize(state, [0, 1])# Add a Hadamard gate to qubit 0
qc.h(0)# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0, 1)# Return a drawing of the circuit using MatPlotLib (mpl). This is the
# last line of the cell, so the drawing appears in the cell output.
# Remove the mpl argument to get a text drawing.
qc.draw(mpl)绘制出的电路如下 定义如下的测量算子 # Set up six different observables.observables_labels [IZ, IX, ZI, XI, ZZ, XX]
observables [SparsePauliOp(label) for label in observables_labels]将上述电路转化为 ISAInstruction Set Architecture 格式然后放到到量子真机CN 被禁用/ 仿真使用 qiskit-aer 包环境中 #from qiskit_ibm_runtime import QiskitRuntimeService# If you have not previously saved your credentials, follow instructions at
# https://docs.quantum.ibm.com/guides/setup-channel#iqp
# to authenticate with your API token.
#service QiskitRuntimeService()
#backend service.least_busy(simulatorFalse, operationalTrue)from qiskit_aer import Aer
backend Aer.get_backend(qasm_simulator)# Convert to an ISA circuit and layout-mapped observables.
pm generate_preset_pass_manager(backendbackend, optimization_level1)
isa_circuit pm.run(qc)isa_circuit.draw(mpl, idle_wiresFalse)如果用 IBM 真机应该会得到与上述不同的图像。不过使用 Aer 绘制的电路并没有改变。 多次执行上述电路并进行相应测量 # Construct the Estimator instance.estimator Estimator(modebackend)
estimator.options.resilience_level 1
estimator.options.default_shots 5000mapped_observables [observable.apply_layout(isa_circuit.layout) for observable in observables
]# One pub, with one circuit to run against five different observables.
job estimator.run([(isa_circuit, mapped_observables)])# Use the job ID to retrieve your job data later
print(f Job ID: {job.job_id()})获得测量结果期望、标准差 # This is the result of the entire submission. You submitted one Pub,
# so this contains one inner result (and some metadata of its own).
job_result job.result()# This is the result from our single pub, which had six observables,
# so contains information on all six.
pub_result job.result()[0]最后分析结果 # Plot the resultvalues pub_result.data.evs
errors pub_result.data.stds# plotting graph
plt plot_errorbar(x_data[observables_labels],y_data[values],y_err[errors],labels[result],title,xlabelObservables,ylabelValues
)plt.show()这里的 plot_errorbar 详见 这里其绘制结果如下
可以看到测量 Z ⊗ Z Z \otimes Z Z⊗Z 和 X ⊗ X X \otimes X X⊗X 上的值为 ± 1 \pm1 ±1其他测量上的值为 0 0 0这说明电路的输出是纠缠的两比特这是 Bell 态的特征。
量子算法
QFT
下面是 QFT 算法的实现
import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit.visualization import plot_histogram
from qiskit_aer import Aer
from qiskit.quantum_info import Statevector# QFT 算法
def qft(n):n-qubit QFTqc_qft QuantumCircuit(n)for i in range(n):qc_qft.h(i)for j in range(i1, n):qc_qft.cp(np.pi / 2**(j-i), i, j)qc_qft.barrier()return qc_qft# 创建 3-qubit 大小的 QFT 电路
qc_qft qft(3)# 测量算子
qc_qft.measure_all()# 绘制量子电路
qc_qft.draw(outputmpl)# 执行量子电路并获取结果
simulator Aer.get_backend(qasm_simulator)
transpiled_circuit transpile(qc_qft, simulator)
job simulator.run(transpiled_circuit, shots1000)result job.result()
counts result.get_counts(qc_qft)print(QFT Measurement results:, counts)
plot_histogram(counts)Grover
下面是 Grover 算法的实现对 3-qubit 的函数 f ( x ) 1 ⟺ x ∣ 010 ⟩ f(x)1 \iff x|010\rangle f(x)1⟺x∣010⟩ 做搜索
import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit_aer import Aer
from qiskit.visualization import plot_histogram, plot_bloch_multivector# 3-qubit Grover搜索算法实现
def build_oracle():构建针对|010⟩的Oracle电路oracle QuantumCircuit(3, nameOracle)# 对|010⟩取反Qiskit中量子比特顺序为从右到左oracle.x(0) # 将第0个量子比特从0变为1oracle.x(2) # 将第2个量子比特从0变为1# 多控制Z门MCZoracle.h(2)oracle.mcx([0, 1], 2) # 控制比特0和1目标比特2oracle.h(2)# 恢复取反操作oracle.x(0)oracle.x(2)return oracledef build_diffuser(n_qubits):构建振幅放大部分扩散算子diffuser QuantumCircuit(n_qubits, nameDiffuser)# 应用Hadamard门和X门for qubit in range(n_qubits):diffuser.h(qubit)diffuser.x(qubit)# 多控制Z门MCZdiffuser.h(n_qubits-1)diffuser.mcx(list(range(n_qubits-1)), n_qubits-1)diffuser.h(n_qubits-1)# 恢复Hadamard门和X门for qubit in range(n_qubits):diffuser.x(qubit)diffuser.h(qubit)return diffuserdef run_grover_algorithm():运行完整的Grover搜索算法# 创建量子电路n_qubits 3qc QuantumCircuit(n_qubits, n_qubits)# 步骤1: 初始化所有量子比特到|⟩状态for qubit in range(n_qubits):qc.h(qubit)qc.barrier()# 步骤2: 应用Oracle和Diffuser# 对于3个量子比特需要进行π/4 * √(2^3) ≈ 1.11次迭代取整为1次iterations 1oracle build_oracle()diffuser build_diffuser(n_qubits)for _ in range(iterations):qc.append(oracle, range(n_qubits))qc.barrier()qc.append(diffuser, range(n_qubits))qc.barrier()# 步骤3: 测量所有量子比特qc.measure(range(n_qubits), range(n_qubits))return qc# 构建Grover电路
grover_circuit run_grover_algorithm()# 绘制电路
print(Grover搜索电路:)
print(grover_circuit.draw())# 使用模拟器执行电路
shots1000
simulator Aer.get_backend(qasm_simulator)
transpiled_circuit transpile(grover_circuit, simulator)
job simulator.run(transpiled_circuit, shotsshots)result job.result()
counts result.get_counts(grover_circuit)# 打印结果
print(\n测量结果:)
for state, count in counts.items():print(f状态 |{state[::-1]}⟩ 出现次数: {count} ({count/shots*100:.2f}%))# 可视化结果
plot_histogram(counts)