QPanda3
Supported by OriginQ
载入中...
搜索中...
未找到
量子模拟器

上一章: 量子线路与量子程序

下一章: 噪声


量子计算中的量子模拟器

量子模拟器在量子计算领域中扮演着重要角色,为研究人员和开发人员提供了有效的工具来模拟和分析量子系统的行为。这些工具不仅有助于理解量子算法和量子系统的特性,还在算法设计和验证中发挥着重要作用,特别是在实际量子计算机尚未广泛普及的情况下。

全振幅量子模拟器

全振幅模拟器可以同时模拟并存储量子态的所有振幅。然而,它受到计算机内存的限制,当量子比特数超过 50 的时候,模拟变得不可行。这类模拟器适用于低比特数、高深度的量子线路,例如谷歌提出的低比特数随机量子线路,以及需要获取完整模拟结果的场景。

经典计算机对量子线路的模拟对于深入理解量子计算的操作和行为至关重要,这种模拟允许研究人员和开发者评估新的量子算法的复杂性并验证量子设备的有效性。

全振幅模拟是量子计算中最经典的模拟方案之一,主要用于模拟小规模量子系统。在该模拟方法中,可以精确模拟整个量子系统的状态,从而深入了解系统在不同时间点的演化情况。该方法的核心思想是表示和跟踪量子态的完整振幅信息,使用密度矩阵或纯态向量来描述量子系统的状态。

对于单个量子比特,它可以被视为一个二能级系统,量子态 \(|\psi\rangle\) 可表示为:

\[|\psi\rangle = a_0|0\rangle + a_1|1\rangle \]

其中 \(a_0\) 和 \(a_1\) 是复数振幅,满足归一化条件:

\[|a_0|^2 + |a_1|^2 = 1 \]

在这个方程中, \(∣0 \rangle\) 和 \(∣1\rangle \) 是计算基态。量子态也可以表示为:

\[|\psi\rangle = a_0 \begin{bmatrix} 1 \\ 0 \end{bmatrix} + a_1 \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} a_0 \\ a_1 \end{bmatrix} \]

对于一个 \(n\) 量子比特的量子系统,其状态可以由 \(2^n\) 个振幅表示:

\[|\psi\rangle = a_{0\ldots00}|0\ldots00\rangle + a_{0\ldots01}|0\ldots01\rangle + \ldots + a_{1\ldots11}|1\ldots11\rangle \]

所有振幅参数必须满足归一化条件:

\[\sum_i |a_i|^2 = 1 \]

在量子计算过程中,所有量子逻辑门都以矩阵形式作用于系统。对第 \(k\) 个量子比特应用单量子门 \(U\) 可表示为:

\[A = I^{\otimes (n-k-1)} \otimes U \otimes I^{\otimes k} \]

其中 \(I\) 是 \(2×2\) 单位矩阵, \(U\) 是 \(2×2\) 酉矩阵。对于双比特门,操作方式类似。

随着量子比特数的增加,所需的量子态振幅数量呈指数级增长。

模拟的量子比特数 存储所有量子态所需的最小内存(GB)
26 1
27 2
28 4
29 8
30 16
... ...
48 \( 2^{22} \)
49 \( 2^{23} \)
50 \( 2^{24} \)

当量子比特数达到 50 或以上的时候,所需要的内存量变得极其庞大。这一个问题被称为量子优越性(Quantum Supremacy),即量子计算机在某些特定任务上的计算能力超越经典计算机,而经典计算机可能需要数年、数百年甚至更长的时间才能完成相同的任务。

这一现象凸显了量子计算机在某些领域的巨大潜力,因为它们能够解决经典计算机在可行时间内无法解决的问题。

我们使用 CPUQVM 运行全振幅模拟算法。首先,我们构造量子线路,然后使用 run(prog, shots, noise_model) 运行它,最后通过 result 获取结果。

执行后的结果如下:

{'000': 16, '101': 330, '110': 129, '111': 168, '010': 10, '100': 322, '001': 15, '011': 10}

此外,还可以传递噪声模型参数。

执行后的结果如下:

{'000': 12, '101': 339, '001': 15, '100': 303, '110': 169, '011': 8, '111': 143, '010': 11}

QResult 的成员函数 get_prob_dictget_prob_list 可以分别以字典或列表的形式检索结果的概率。如果线路中包含测量操作,它们返回转换后的测量结果(这些结果是非确定性的,每次运行可能有所不同)。否则,它们返回理想概率分布的结果(这些结果是确定性的,并在多次运行中保持一致)。

如果线路中包含测量节点,则输出测量结果,以字典或列表的形式表示。如果线路中没有测量节点,则输出理想概率分布,以字典或列表的形式表示。

执行后的结果如下:

[0.023446405129712404, 0.0005355593660222884, 0.010630318352576206, 0.46538771715168914, 0.46538771715168914, 0.01063031835257.010630318352576206, 0.0005355593660222884, 0.023446405129712404]
{'000': 0.023446405129712404, '001': 0.0005355593660222884, '010': 0.010630318352576206, '011': 0.46538771715168914, '100': 0.8914, '100': 0.46538771715168914, '101': 0.010630318352576206, '110': 0.0005355593660222884, '111': 0.023446405129712404}
[0.481, 0.496, 0.011, 0.012]
{'00': 0.481, '01': 0.011, '10': 0.012, '11': 0.496}

基于 GPU 的全振幅量子模拟器

全振幅模拟算法在内部使用大量的并行计算进行加速,在多核计算机上可以实现更高的性能提升。

我们可以使用 GPUQVM 来加速相同线路的量子线路模拟,其用法与 CPUQVM 相同。然而,在使用前必须安装 CUDA 并在计算机上配置 GPU 环境。

执行后的输出如下:

{'000': 19, '101': 327, '110': 122, '111': 175, '010': 9, '100': 323, '001': 14, '011': 11}

部分振幅量子模拟器

部分振幅模拟器依赖于提供低量子比特线路振幅结果的其他模拟器。它们可以模拟更多量子比特,但线路深度会受限。这些模拟器通常用于获取量子态的部分振幅模拟结果。

近年来,半导体量子芯片取得了重大进展。量子霸权理论指出,如果能够构建一个包含 50 个量子比特的设备,它将超越经典计算机的计算能力(即直接模拟 50 个量子比特大约需要 16 PB 的 RAM 来存储完整的向量)。

谷歌和 IBM 团队提出了有效的方法来模拟 49 量子比特以上的低深度线路(例如延迟纠缠门)。

在这里,我们提出了一种优化经典模拟大规模低深度量子线路的方案,该方法可用于大规模采样,已经能够模拟包含 64 量子比特的线路。具体而言,该方法通过将多个受控-Z(CZ)门转换为测量门和单量子比特门,将线路映射到多个附加子线路。这些子线路由两个彼此不纠缠的模块组成,从而将一个 \(N\) 量子比特的模拟问题转化为一组 \(N/2\) 量子比特的线路求解问题。该方法类似于二维网格的平衡切割:对于一个 CZ 门,它被拆分为四个子线路,最终通过对所有子线路的结果求和来重建最终状态。

部分振幅量子虚拟机(Partial-Amplitude Quantum Virtual Machine)的基本思想是将一个大规模量子线路拆分成多个小规模量子线路,每个小量子线路使用全振幅算法计算。

量子线路拆分的原则如下:当量子线路中出现跨节点的双量子比特门时,拆分量子线路。具体而言,线路按照量子比特总数的一半进行拆分。例如,如果总共 10 个量子比特,则边界在量子比特 4 和 5 之间。

当一个双量子比特门的控制比特和目标比特位于边界的两侧时,称其为跨节点(cross-node)。例如,在 10 量子比特的情况下,CNOT(1,5) 是跨节点门,而 CNOT(1,4) 不是。

CZ 门可以转换为测量门和单量子比特门的组合,如下所示:

\[\mathrm{CZ} = P_0 \otimes I + P_1 \otimes Z \]

其中 \(I\) 为单位矩阵, \(Z\) 为泡利-Z矩阵。

\[P_0 = \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix}, \quad P_1 = \begin{bmatrix} 0 & 0 \\ 0 & 1 \end{bmatrix} \]

对于其他双量子比特门(如 CR、iSWAP 和 SQiSWAP),它们可以转换为单量子比特门和可拆分的双量子比特门的组合,然后采用类似的拆分方法进行模拟。

我们使用 PartialAmplitudeQVM 来运行全振幅模拟算法。首先构造线路,然后使用 run(prog) 运行,最后通过 get_state_vector(list) 获取结果。

执行后的结果如下:

[(0.11203780214230272-0.1043740198556836j), (0.01693285765754904-0.015774590250509563j), (0.07543963588749045-0.0702792977322559j)]

密度矩阵模拟器

对于混合态(Mixed States),使用状态向量难以完全表示系统的量子态,而是采用密度矩阵(Density Matrix)来表示:

\[\rho = \sum_{i}^{n} p_i |\varphi_i\rangle \langle \varphi_i| \]

对于纯态(Pure States),密度矩阵形式简化为:

\[\rho = |\varphi\rangle \langle \varphi| \]

对于前面提到的混合态,其密度矩阵表示如下:

\[\rho = \frac{1}{2} |0\rangle \langle 0| + \frac{1}{2} |1\rangle \langle 1| = \frac{1}{2} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \]

对于纯态 \( |\psi\rangle = \frac{1}{\sqrt{2}}|0\rangle + \frac{1}{\sqrt{2}}|1\rangle \),其密度矩阵为:

\[\rho = |\psi\rangle \langle \psi| = \frac{1}{2} \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix} \]

从密度矩阵可以看出,不同的量子态具有不同的表示方式。

对于纯态, \( \text{tr}(\rho^2) = 1 \),而对于混合态, \( \text{tr}(\rho^2) < 1 \)。其中 \( \text{tr}(A) \) 代表矩阵 \( A \) 的迹(Trace),即矩阵对角线元素之和。

酉矩阵逻辑门与密度矩阵表示

对于一般的酉矩阵,我们可以使用密度矩阵来表示系统状态的演化:

\[\rho' = U \rho U^{\dagger} \]

使用密度矩阵,我们可以表示测量结果,其中测得结果 \( m \) 的概率为:

\[p(m) = \text{tr}(M_m^{\dagger} M_m \rho) \]

其中, \( M_m \) 是测量算符,也称为投影算符。例如,如果我们的计算基是 \( |0\rangle \),则投影算符为 \( |0\rangle \langle 0| \)。因此,测得 \( |0\rangle \) 的概率为:

\[p(|0\rangle) = \text{tr}(|0\rangle \langle 0| |0\rangle \langle 0| \rho) \]

混合态与纯态的示例计算

使用前面定义的混合态和纯态,我们可以计算测量结果如下:

混合态

\[p(|0\rangle) = \text{tr}\left( \frac{1}{2} \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \right) = \frac{1}{2} \]

纯态

\[p(|0\rangle) = \text{tr}\left( \frac{1}{2} \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix} \right) = \frac{1}{2} \]

密度矩阵提供了一种替代方法来表示量子态。密度矩阵模拟器可用于计算量子态的密度矩阵、量子态概率分布、模拟噪声量子线路及计算哈密顿量的期望值等任务。

我们使用 DensityMatrixSimulator 来模拟量子态的密度矩阵。首先,我们构造线路,然后像之前一样使用 run(prog) 运行线路。

density_matrix 用于获取整个系统演化后的密度矩阵,而 reduced_density_matrix 用于获取子系统的密度矩阵。执行后的输出如下:

#density_matrix
[[ 0.25 +0.j 0.25 +0.j 0.25 +0.j
-0.24397436+0.05455741j]
[ 0.25 +0.j 0.25 +0.j 0.25 +0.j
-0.24397436+0.05455741j]
[ 0.25 +0.j 0.25 +0.j 0.25 +0.j
-0.24397436+0.05455741j]
[-0.24397436-0.05455741j -0.24397436-0.05455741j -0.24397436-0.05455741j
0.25 +0.j ]]
#reduced_density_matrix
[[0.5 +0.j 0.00602564+0.05455741j]
[0.00602564-0.05455741j 0.5 +0.j ]]

密度矩阵模拟器还支持传递额外的噪声模型参数。

执行后的输出如下:

#density_matrix
[[ 0.44389147+0.00000000e+00j 0. -1.57816659e-01j
0. -1.57816659e-01j 0.08279125+4.36102334e-01j]
[-0. +1.57816659e-01j 0.05610853+0.00000000e+00j
0.05610853+0.00000000e+00j -0.15504739+2.94347591e-02j]
[-0. +1.57816659e-01j 0.05610853+0.00000000e+00j
0.05610853+0.00000000e+00j -0.15504739+2.94347591e-02j]
[ 0.08279125-4.36102334e-01j -0.15504739-2.94347591e-02j
-0.15504739-2.94347591e-02j 0.44389147+1.38777878e-17j]]
#density_matrix with noise
[[ 4.26306051e-04+0.j 0.00000000e+00+0.01459354j
-0.00000000e+00+0.01459354j 7.95113517e-05+0.00041883j]
[-0.00000000e+00-0.01459354j 4.99573694e-01-0.j
4.99573694e-01-0.j 1.43374574e-02-0.00272187j]
[ 0.00000000e+00-0.01459354j 4.99573694e-01-0.j
4.99573694e-01+0.j 1.43374574e-02-0.00272187j]
[ 7.95113517e-05-0.00041883j 1.43374574e-02+0.00272187j
1.43374574e-02+0.00272187j 4.26306051e-04+0.j ]]

稳定器与Clifford模拟器

叠加(Superposition)和纠缠(Entanglement)是量子优势的典型来源。然而,当系统中的量子比特数 \( N \) 增加的时候,量子态系数的数量会随着 \( N \) 指数级增长。这使得使用经典计算机进行传统的全振幅模拟变得不可能,这一问题被称为指数墙(Exponential Wall)

根据Gottesman-Knill 定理,我们知道对于由特定门集构成的稳定子(Stabilizer)线路,模拟可以在多项式时间(Polynomial Time)内完成。这意味着,在某些由特定逻辑门构成的线路中,可以打破量子计算的指数优势,从而使用经典模拟进行量子线路计算,并验证量子计算机的结果。此外,在未来的容错量子计算机中,错误纠正需要冗余资源,而当前的量子模拟框架尚无法处理大规模量子线路的错误纠正需求。

为了解决这一问题,我们可以采取不同的方法:利用稳定子(Stabilizer)和对应的Clifford 门集模拟器,可以高效地利用其多项式时间可模拟性来研究基于 Pauli 噪声的容错量子计算。此外,为了扩展至更通用的量子计算,我们可以将稳定子的理论属性应用于Clifford+T模拟。使用Clifford+T模拟器,我们可以在非 Clifford 逻辑门较少的情况下模拟大规模量子线路(因为 Clifford+T 可以逼近任何逻辑门)。

原理介绍

对于一个量子态 \( |\psi\rangle \)(通常指纯态),如果存在酉矩阵 \( U \),使得:

\[U|\psi\rangle = |\psi\rangle \]

则称 \( |\psi\rangle \) \( U \) 稳定 , \( U \) 是 \( |\psi\rangle \) 的稳定子(Stabilizer)。例如:

\[Z|0\rangle = |0\rangle \]

显然,一个量子态可以具有多个稳定子。当有多个稳定子时,这些稳定子的乘积也是稳定子:

\[Z_1 Z_2 X_1 X_2 |\psi\rangle = Z_1 Z_2 |\psi\rangle = |\psi\rangle \]

这种封闭的乘法运算表明稳定子形成了一个集合(Group)

对于一个量子态 \( |\psi\rangle \),如果酉变换集合 \( S \) 中的每个元素都是 \( |\psi\rangle \) 的稳定子,则整个 \( S \) 称为 \( |\psi\rangle \) 的Stabilizer 群

通常,我们关注的稳定子是Pauli 矩阵 \( \{ X, Y, Z, I \} \)。由此形成的酉变换集合称为Pauli 集合,其定义如下:

\[\text{Stab}(|\psi\rangle) = \{ P \in \mathcal{P}_n : P|\psi\rangle = |\psi\rangle \} \]

其中,Pauli 集合 \( \mathcal{P}_n \) 是作用于 \( n \) 量子比特的 Pauli 算符的集合,并且相位系数为 \( \pm 1 \) 或 \( \pm i \):

\[\mathcal{P}_n = \{ i^{\gamma} X(a) Z(b) : \gamma \in \{ 0, 1, 2, 3 \}, a, b \in \{0, 1\}^n \} \]

如果 \( P^{(1)}, \dots, P^{(m)} \in \mathcal{P}_n \) 是 Pauli 集合的独立元素,那么我们可以利用 Pauli 集合的特殊性质得到:

\[\begin{matrix} \text{Stab}(|00\rangle) = \{ I, Z_1, Z_2, Z_1 Z_2 \} = \langle Z_1, Z_2 \rangle \\ \text{Stab}(|++\rangle) = \{ I, X_1, X_2, X_1 X_2 \} = \langle X_1, X_2 \rangle \\ \text{Stab}\left( \frac{|00\rangle + |11\rangle}{\sqrt{2}} \right) = \{ I, X_1 X_2, Z_1 Z_2, -Y_1 Y_2 \} = \langle X_1 X_2, Z_1 Z_2 \rangle \\ \text{Stab}(|0^n\rangle) = \{ Z(a) : a \in \{0, 1\}^n \} = \langle Z_1, \dots, Z_n \rangle \end{matrix} \]

问题在于如何构造Stabilizer 群。在这里,我们需要提到,当Clifford群中的元素作用于 Pauli 群时,它们会引发一种变换:

\[\mathbf{P|\psi\rangle = |\psi\rangle} \Longleftrightarrow \left( \mathbf{UPU^{\dagger}} \right) \mathbf{U|\psi\rangle = U|\psi\rangle} \]

当我们将集合写为 \( P = i^{\gamma} X(a) Z(b) \) 时,Clifford 群的作用如下:

\[U_j P U_j^{\dagger} = i^{\gamma} X^{a_1} Z^{b_1} \otimes \ldots \otimes X^{a_{j-1}} Z^{b_{j-1}} \otimes U X^{a_j} Z^{b_j} U^{\dagger} \otimes X^{a_{j+1}} Z^{b_{j+1}} \otimes \ldots \otimes X^{a_n} Z^{b_n} \]

可以发现:

\[U_j P U_j^{\dagger} = P_{\text{new}} \]

这在下图中得到了说明:

量子逻辑门 输入 输出 量子逻辑门 输入 输出
\( CNOT \) \( X_1 \) \( X_1X_2 \) \( X \) \( X \) \( X \)
\( X_2 \) \( X_2 \) \( Z \) \( -Z \)
\( Z_1 \) \( Z_1 \) \( Y \) \( X \) \( -X \)
\( Z_2 \) \( Z_1Z_2 \) \( Z \) \( -Z \)
\( H \) \( X \) \( Z \) \( Z \) \( X \) \( -X \)
\( Z \) \( X \) \( Z \) \( Z \)
\( S \) \( X \) \( Y \)
\( Z \) \( Z \)

在这里,我们可以看到 \( Y \) 的变换被去除了,因为 \( Y = IXZ \)。

因此, \( |\psi\rangle \rightarrow U|\psi\rangle \) 等价于追踪稳定子的演化。这使我们能够获得系统的完整动力学信息。

\[S \rightarrow U S U^{\dagger} \]

通过将量子门演化问题转化为更新量子态的稳定子集合问题,使用稳定子模拟量子线路的核心思想是使用稳定子集合来表示量子态,而不是传统模拟器中使用的幅度。

换句话说,对于由特定门集组成的稳定子线路,只要线路由Clifford量子逻辑门集及其派生集中的门组成: \( H, S, X, Y, Z, CNOT, CY, CZ, \text{SWAP} \),我们就可以在多项式时间内模拟大型量子线路。

我们使用 Stabilizer 来运行大比特 Clifford 线路。其用法与其他模拟器相同;在通过 run(prog, shots, noise_model) 运行后,我们通过 result 获取结果。

Stabilizer 支持最多 5000 量子比特的 Clifford 线路模拟,示例输出如下:

{'011': 239, '001': 260, '010': 257, '000': 244}