用Q#介绍量子计算–第18部分,量子傅里叶变换

在今天'S帖子我们将探索量子计算理论中的重要算法构建块之一,称为量子傅里叶变换。它是古典的量子变体离散傅里叶变换并且用于许多算法,如怪物'S的线性系统的分解算法,量子相位估计或量子算法。

历史背景

原来的傅里叶变换在19世纪初被法国数学家发现了约瑟夫傅里叶,谁在那个时候专注于分析的热量理论。傅里叶变换,或者特别是离散的傅里叶变换(DFT)是可用于处理信号频率的极大有用的数学工具。因此,它在各种科学域中具有非常丰富的应用方案谱,例如数字声音处理,图像处理或数值算法,以命名少数。然而,它超出了这篇博客文章的范围讨论DFT;我们将专注于它的量子版本。傅里叶变换作用在向量上,即由复杂数字组成的向量,并将其转换为另一个复杂的数字矢量。从那个角度来看,它并不奇怪存在它的量子版本–毕竟量子系统状态也是如此由向量表示在多维希尔伯特空间中。

Quantum Finier变换在1994年6月在内部发现了由美国数学家唐Coppersmith的IBM研究部门。它为彼得怪在同一年后开发的着名因子算法提供了突破。几年后,2002年,描述了描述QFT的原始内部研究报告与量子科学界共享,就像它一样发布为可自由的纸张.

量子傅里叶变换在经典的对应上提供了戏剧性的速度。在古典案例中,傅里叶变换的最有效实现,快速傅里叶变换,具有$ O(n2 ^ n)$的复杂性来计算结果。另一方面,它的量子版本可以通过$ O(n ^ 2)$算法复杂性来实现相同的结果,从而导致壮观的指数性能改进。 Quantum傅里叶变换类似于FFT,Quantum状态表示自然是基于两个的自然功率,而最常见的FFT算法需要两个用于所用的数据点的数量的均匀功率。

理论

给定输入和输出复数号码矢量$ x $和$ y $ n $ n $,傅里叶变换的一般数学公式如下:

$$ y_k = \ frac {1} {\ sum_ {n}} \ sum_ {j = 0} ^ {n-1} x_je ^ {\ frac {2 {\ pi} ijk} {n}}
$$

我们可以将其重写为Quantum表单,用量子状态$ \ KET {j} $替换向量$ x $和$ y $作为输入,并表示为$ \ ket {k} $,并假设$ n = 2 ^ n $,$ n $是QUBITS的数量:

$$ \ ket {j} = qft \ ket {k} = \ frac {1} {\ sum_ {n}} \ sum_ {k = 0} ^ {n-1} ^ {n-1} ^ {rac {2 {\ pi } IJK} {n}} \ \ ket {k}
$$

我们也知道–这是一个在过去的几个博客帖子中经常发出的主题–我们可以使用以下通用公式(其中$ n = 2 ^ n $)表达任意$ n $ qubit量子状态$ \ ket {\ psi} $:

$$ \ ket {\ psi} = \ frac {1} {\ sqrt {n}} \ sum_ {j = 0} ^ {n-1} x_j \ ket {j}
$$

转换为州$ \ KET {\ PSI} $的转换$ U $,然后可以总结为将上述状态取决于以下状态:

$$ u \ ket {\ psi} = \ frac {1} {\ sum_ {n}} \ sum_ {k = 0} ^ {n-1} y_k \ \ ket {k}
$$

自$ y_k $是一个复杂的数字,我们可以用傅里叶变换的初始公式替代$ y_k $,然后我们可以组合上面的所有公式,以获得量子傅里叶变换的通用定义,按任意$ n作用$ qubit量子状态:

$$ qft \ ket {\ psi} = \ frac {1}} \ sum_ {j = 0} ^ {n-1} \ sum_ {k = 0} ^ {n-1} x_ke ^ {\ frac {2 {\ pi} ijk} {n}} \ ket {j}
$$

最后,这里有一个额外的简化可以应用于这里的事实,即$ e ^ {\ frac {2 {\ pi} i} {n}} $实际上是统一的第n个根源:

$$ \ omega = e ^ {\ frac {2 {\ pi} i} {n}}
$$

这为我们提供了最终的QFT定义:

$$ qft \ ket {\ psi} = \ frac {1} {\ sum_ {n}} \ sum_ {j = 0} ^ {n-1} \ sum_ {k = 0} ^ {n-1} x_k \ omega ^ {jk} \ ket {j}
$$

QFT.变换的一般矩阵定义如下所示。

$$
qft = \ frac {1} {\ sqrt {n}} \ begin {bmatrix}
1 & 1 & 1 & \dots & 1 \\
1 & \omega & \omega^2 & \dots & \omega^{N-1} \\
1 & \omega^2 & \omega^4 & \dots & \omega^{N-2} \\
\ vdots.& \vdots & \vdots & \ddots & \vdots \\
1 & \omega^{N-1} & \omega^{N-2} & \dots & \omega
\结束{bmatrix}
$$

有趣的是,对于单个Qubit案例,其中$ n = 1 $,因此$ n = 2 $,我们可以观察到:

$$ \ Omega = e ^ {{\ pi} i} = -1
$$

这会为单个Qubit生成以下QFT矩阵:

$$
qft_1 = \ frac {1} {\ sqrt {2}} \ begin {bmatrix} 1& 1 \\ 1 &-1 \end{bmatrix}
$$

这当然是别的东西哈马德转型。然而,它是$ H $和$ QFT $对齐的唯一情况–对于多个Qubits,转换确实不同。例如,对于两个Qubits,我们获取以下定义QFT:

$$ \ omega = e ^ {\ frac {{\ pi} i} {2}} = i
$$

$$
qft_2 = \ frac {1} {2} \ begin {bmatrix}
1 & 1 & 1 & 1 \\
1 & i & -1 & -i \\
1 & -1 & 1 & -1 \\
1 & -i & -1 & i
\结束{bmatrix}
$$

QFT.变换是单一的,制作适合用作量子计算中的变换,并且可以使用Z轴旋转门的组合来实现。从本系列的早期部分之一我们应该记住旋转门$ r_z $看起来如下:

$$
r_z = \ begin {bmatrix} e ^ { - i \ frac {\ theta} {2}}& 0 \\ 0 &e ^ {i \ frac {\ theta} {2}} \ neg {bmatrix} = \ begin {bmatrix} 1& 0 \\ 0 &e ^ {i \ theta} \结束{bmatrix}
$$

在量子计算中,使用$ s $和$ t $ gate名称在$ r_z $的特殊轮换案例中使用$ s $–即当旋转角度为$ \ frac {\ pi} {2} $和$ \ frac {\ pi} {4} $。这为我们提供了以下门定义:

$$
s = \ begin {bmatrix} 1& 0 \\ 0 &e ^ {\ frac {{\ pi} i} {2}} \ end {bmatrix} = \ begin {bmatrix} 1& 0 \\ 0 & i \end{bmatrix}
$$

$$
t = \ begin {bmatrix} 1& 0 \\ 0 &e ^ {\ frac {{\ pi} i} {4}} \结束{bmatrix}
$$

以下电路显示使用受控$ S $和$ T $栅栏的三个QUBBIT QFT实现。

当为大于三个大于三个Qubits实现这一点时,模式会相同,每个额外的旋转是前一个的一半(就像$ t $的一半是$ s $的旋转的一半)。我们稍后会在Q#示例代码中看到这一点,在实现四个Qubit Qft时,我们需要一半的$ t $旋转,或者是精确的,是$ \ frac {\ pi} {8} $回转。

值得注意的是,在大多数主题文献中讨论了QFT,包括最流行的量子计算资源,"量子计算和量子信息"从 尼尔森和庄,假定输入和输出以使用Qubits的大endian排序。但是,来自程序员'S的角度来看,小型恩天通常是一个更自然的方式来推理计划'因此,S状态,因此在各种高级量子计算编程语言和框架中是首选– including Qiskit.或者Cirq.。因此,它是一种常见的问题,当使用电路建立基于QFT的量子程序时发现量子计算文献,与使用基于框架的QFT实现时,可以获得不同的结果。这也解释了为什么您可以遇到各种来源中QFT电路的镜像变体。

在那个前面,Q#可以选择在大多数运营中选择的小型或大型欧洲比特注册服务,确实有两种不同的内置QFT实现,一个基于大endian的一个基础,另一个在小型endian注册表中。

对于小型endian注册表相关的三个Qubit QFT电路如下所示:

q#实现

有两种方式可以接近量子傅里叶变换的Q#实现。通过简单地构建程序根据我们刚刚讨论的电路来构建程序的手动方式,如果需要,可以适当地将其缩放到涉及的QUBITS的数量。第二种方法肯定是推荐的和更开发者友好的技术,是简单地依赖于Q#核心库的内置QFT。让'在四个QUBBIT量子系统上尝试这两种。

首先,我们将手动实施电路,为此,我们需要使用受控$ S $,受控$ T $和受控$ Rz $盖茨的混合物,所有这些都是Q#的一部分。由于我们在这里执行了四个Qubits,而不是我们所描绘的三个Qubits,因此我们必须包含$ PI()/ 8.0 $弧度的额外旋转。此外,从三到四个Qubits移动需要我们执行两个,而不是单个交换–正确地反转QUBITS的顺序。 Q#代码实现如下所示。

这是一切,它可以按预期工作,尽管我们必须意识到实施遵循这里的大endian排序–就像在我们定义电路时注意到一样。使用我们已经采用的模式可以扩展该方法:为每个额外的qubit添加额外的减半旋转,以及每个额外的额外qubit的额外交换。与此同时,当然很难不皱这种手动方法,因为它不是非常可维护的,非常繁琐,易于错误。

替代方案更简单,并依赖于从$ Microsoft.quantum.canon $命名空间从Q#的核心库中的内置$ QFT $转换。代码急剧上更简单,如下所示。

输入到$ qft $ work的输入不是原始的qubits数组,而是一个$ bigendian $注册表–类似于我们在上面的手动实现中的情况。关于使用内置库功能的大件事是,这现在略微缩放到任意数量的Qubits,并且Q#语言团队保证了实现的正确性。

在我们结束这一部分之前,我们也可以看出与小型联系排序合作的QFT实现。对于手动方法,它将意味着颠倒Qubits,因为它在较早的电路图上描绘。下一步显示更新的代码。

对于库方法,我们必须调用不同的库函数,称为$ qftle $,也来自$ microsoft.quantum.canon $名称空间。当然,在这种情况下,输入注册表必须是$ little endian $。

在四种情况下,我们可以通过从$ Microsoft.quantum.diagnostics $命名空间执行$ DumpMachine $函数来浅薄地显示转换结果。这只会在模拟器上工作–毕竟,在真正的量子硬件上,我们无法在测量前检查状态–但它允许我们在两对实现中验证,我们能够达到相同的结果。

概括

在这篇文章中,我们通过了量子傅里叶变换的数学基础,并讨论了实现它的Q#代码。根据QFT的理论模型和核心Q#库提供的框架功能,代码依赖于手动电路执行。这允许我们对比两种方法进行染色并验证我们的推理是否正确。

在下一部分,我们将了解QFT的一些应用案例。