跳转至

量子模拟

经典计算机上的量子计算模拟

如何验证量子算法的正确性是量子计算最重要的部分之一,使用经典机器模拟量子电路是验证量子算法的一种方式。在 QuICT 中, Simulator 用于模拟量子电路运行过程中量子比特的状态,目前支持五种量子电路模拟器,分别是酉矩阵、状态向量、密度矩阵、矩阵乘积态和分块量子电路模拟。

模拟器后端 CPU GPU Noise 量子比特数 深度
状态向量
酉矩阵
密度矩阵
矩阵乘积态
分块量子电路

Simulator模拟器是一个量子电路模拟器的集合类,目前支持状态向量、密度矩阵和酉矩阵模拟器,输入为硬件参数、模拟器后端选择以及对应模拟器参数,将返回一个 Dict 数据结构,该数据结构存储有关量子电路模拟的信息

  • ID:电路名称
  • SHOTS:模拟的重复次数
  • 模拟器参数:
    • 设备:硬件类型 [CPU, GPU]
    • 后端:模拟器的模式
    • 选项:模拟器的参数
  • 数据:
    • 计数:每次模拟的测量结果
    • 状态向量:经过模拟之后的量子比特状态向量
    • 密度矩阵:经过模拟之后的量子比特密度矩阵 [只针对后端为密度矩阵模拟器]

Simulator 类代码示例

from QuICT.core import Circuit
from QuICT.simulation import Simulator

# Build circuit with 100 random gates and 5 qubits
circuit = Circuit(5)
circuit.random_append(rand_size=100)

# Initial Simulator
simulator = Simulator(
    device="CPU",
    backend="state_vector",
    precision="double"
)
result = simulator.run(circuit, shots=1000)    # get simulation's result

全振幅量子电路模拟

全振幅量子电路模拟是使用经典计算机来模拟量子电路运行中量子比特的状态,并输出所有比特状态的振幅。全振幅量子电路模拟器适用于比特数有限、深度大的量子电路。在 QuICT 中,我们实现了三种全振幅量子电路模拟器,分别是:状态向量模拟器、密度矩阵模拟器和酉矩阵模拟器

状态向量模拟器

状态向量表示量子比特在状态空间中的向量。量子比特是一个二维的状态空间。假设 \(|0⟩\)\(|1⟩\) 形成了这个状态空间的一组标准正交基。那么这个状态空间的任意向量都可以写成:

\[ |\psi⟩ = \alpha|0⟩ + \beta|1⟩ \]

其中 \(\alpha\)\(\beta\) 是任意的复数。

对于多个量子比特的复合状态空间则是其独立量子比特状态空间的张量积,设多个量子比特编号为 1 到 n ,且量子比特 \(i\) 对应的状态向量为 \(|\psi_i⟩\) ,则整个多量子比特状态向量为:

\[ |\psi_1⟩ \otimes |\psi_2⟩ \otimes \dots \otimes |\psi_n⟩ \]

当然量子比特的状态在电路中并不是一成不变的,状态向量的演化可用 酉变换 (unitary transformation) 来描述。也就是说,量子比特在 \(t_1\) 时所处的状态 \(|\psi⟩\) 和在 \(t_2\) 时所处的状态 \(|\psi^′⟩\) 是通过一个仅与时间 \(t_1\)\(t_2\) 有关的酉算子 \(U\) ,即量子门联系起来的。

\[ |\psi^′⟩ = U|ψ⟩ \]

状态向量模拟器就是在给定的量子电路和初始量子比特状态下,不断演化量子比特状态的变化,直到量子电路结束并返回最终的量子比特状态。

from QuICT.core import Circuit
from QuICT.simulation.state_vector import StateVectorSimulator

# Build circuit with 100 random gates and 4 qubits
circuit = Circuit(4)
circuit.random_append(rand_size=100)

# Simulate Quantum Circuit
simulator = StateVectorSimulator(
    device="CPU",
    precision="double"
)
result = simulator.run(circuit)
sample = simulator.sample(1000)

SV Sample

酉矩阵模拟 (Unitary Simulator)

与状态向量模拟器不同的是,酉矩阵模拟器会先将量子电路内的所有量子门的矩阵,融合成为一个酉矩阵。之后,再将量子状态与酉矩阵相乘,生成最终的量子比特状态。

from QuICT.core import Circuit
from QuICT.simulation.unitary import UnitarySimulator

# Build circuit with 100 random gates and 4 qubits
circuit = Circuit(4)
circuit.random_append(rand_size=100)

# Simulate Quantum Circuit
simulator = UnitarySimulator(device="CPU", precision="double")
result = simulator.run(circuit)
sample = simulator.sample(1000)

U Sample

密度矩阵模拟器

与状态向量等价,我们也可以使用密度矩阵来描述量子系统的演化。假设一个量子系统以概率 \(p_i\) 处于多个状态 \(|\psi_i⟩\) 之一,其中 \(i\) 是一个指标,我们将把 \({p_i, |\psi_i⟩}\) 称为一个纯态系综 (ensemble of pure states) 。系统的密度矩阵定义为:

\[ ρ \equiv \sum_i p_i|\psi_i⟩⟨\psi_i| \]

密度矩阵的演化也是由酉算子 \(U\) 描述的,如果系统初态为 \(|\psi_i⟩\) 的概率为 \(p_i\) ,那 么在演化之后,系统将以概率 \(p_i\) 处于状态 \(U|\psi_i⟩\) 。因此,密度算子的演化由下式描述:

\[ ρ \equiv \sum_i p_i|\psi_i⟩⟨\psi_i| \stackrel{U}{\longrightarrow} \sum_i p_i U|\psi_i⟩⟨\psi_i|U^† = UρU^† \]

与状态向量等价,我们也可以使用密度矩阵来描述量子系统的演化。假设一个量子系统以概率 \(p_i\) 处于多个状态 \(|\psi_i⟩\) 之一,其中 \(i\) 是一个指标,我们将把 \({p_i, |\psi_i⟩}\) 称为一个纯态系综 (ensemble of pure states) 。系统的密度矩阵定义为:

\[ρ \equiv \sum_i p_i|\psi_i⟩⟨\psi_i|\]

密度矩阵的演化也是由酉算子 \(U\) 描述的,如果系统初态为 \(|\psi_i⟩\) 的概率为 \(p_i\),那 么在演化之后,系统将以概率 \(p_i\) 处于状态 \(U|\psi_i⟩\) 。因此,密度算子的演化由下式描述:

\[ρ \equiv \sum_i p_i|\psi_i⟩⟨\psi_i| \stackrel{U}{\longrightarrow} \sum_i p_i U|\psi_i⟩⟨\psi_i|U^† = UρU^†\]
from QuICT.core import Circuit
from QuICT.simulation.density_matrix import DensityMatrixSimulator

# Build circuit with 100 random gates and 4 qubits
circuit = Circuit(4)
circuit.random_append(rand_size=100)

# Simulate Quantum Circuit
simulator = DensityMatrixSimulator(device="CPU", precision="double")
result = simulator.run(circuit)
sample = simulator.sample(1000)

DM Dm

DM Sample

单振幅量子电路模拟器

随着量子计算的不断发展,量子计算机的规模也日益增加,相对应的量子电路的量子比特数也越来越多。对于经典计算机模拟验证来说,由于模拟状态向量的复杂度是随着量子电路比特数的增加而指数级上升的,全振幅量子电路模拟变得越来越困难。很多时候,研究人员仅关注部分比特位的振幅或者仅需要计算一定比例的振幅结果;单振幅量子电路模拟器通过将比特信息单独存储或者将部分比特进行张量操作,来避免全振幅量子电路模拟所面临的内存爆炸问题,也可以满足计算研究人员所需要的特定比特位的振幅。单振幅量子电路模拟器适用于比特数大、深度浅、仅需要计算部分振幅的量子电路。 QuICT 量子计算平台实现了基于矩阵乘积态的单振幅量子电路模拟器和分块量子电路模拟器。

基于矩阵乘积态的量子电路模拟器

对于量子计算模拟来说,最大的挑战是对于一个拥有\(N\)个量子比特的自旋体系来说,其对应的希尔伯特空间的大小会是指数级\((d^N = 2^N)\)。对于此系统的状态演化问题,全振幅模拟器通常会使用其拥有\(2^N\)个状态振幅的向量,因此,随着量子比特数的增长,所需的内存空间也会指数级的增长,使得大规模的量子比特模拟变得难以实现。

幸运的是,我们可以通过张量网络这一技术手段,避免状态向量的指数级增长。我们将量子模拟中的所有量子门操作,均可以通过对量子比特的状态向量的合并和分解来完成。矩阵乘积态是其常见的表示形式。

MPS Represent

Singular Value Decomposition (SVD) and Schmidt Decomposition

我们可以通过使用线性代数中的奇异值分解来实现多维量子态的分解。对于任意矩阵 \(M\),其维度为\((N_A \times N_B)\), 存在一种分解

\[ M = U*S*V^{\dag} \]

其中: - \(U\) 是左奇异值向量,维度为\((N_A \times min(N_A, N_B))\); 如果 \(N_A \leq N_B\),则其为酉矩阵。 - \(S\) 表示为奇异值(非负、对角矩阵),维度为\(( min(N_A, N_B) \times min(N_A, N_B))\)。 - \(V\) 是右奇异值向量,维度为\((min(N_A, N_B) \times N_B)\); 如果 \(N_A \geq N_B\),则其为酉矩阵。

我们可以使用\(SVD\)来进一步推导对于一般量子态的施密特分解。任何\(A,B\)上的纯态 $|\psi \rangle $ 都可以写成

\[ |\psi \rangle = \sum_{ij} \Psi_{ij} |i \rangle_A |j \rangle_B \\ = \sum_{ij} \sum_{a=1}^{min(N_A, N_B)} U_{ia} S_{aa} V_{ja}^* |i \rangle_A |j \rangle_B \\ = \sum_{a=1}^{min(N_A, N_B)} [\sum_i U_{ia} |i \rangle_A] [\sum_j V_{ja}^* |j \rangle_B] \\ = \sum_{a=1}^{min(N_A, N_B)} s_a |a \rangle_A |a \rangle_B \]

代码示例

from QuICT.core import Circuit
from QuICT.simulation.matrix_product_state import MatrixProductStateSimulator

# Construct the quantum circuit with 4 qubits and 40 random quantum gates
cir = Circuit(4)
cir.random_append(40)

# Using MPS Simulator to simulate the quantum circuit, and show the final state vector
mps_sim = MatrixProductStateSimulator(
    device="CPU",
    precision="double"
)
mps = sim1.run(cir)
single_amp = mps.single_amplitude_calculate(3)  # 计算比特状态为 0011 时的振幅
state_vector = mps.to_statevector()     # 转换为状态向量
[0.03661165-0.26516504j]

MPS Amplitude

参考文献

[1] Schollwöck, U. (2011, January 1). The density-matrix renormalization group in the age of matrix product states. Annals of Physics. [https://doi.org/10.1016/j.aop.2010.09.012]