用量子计算机模拟器解释Shor算法

2020-06-22 07:45:16

几年前,我写了一篇关于格罗弗的量子搜索算法如何工作的帖子。我认为它很受欢迎。我从几个人那里听说,这是他们第一次得到有关量子计算的任何东西。今天我想做同样的事情,不过是用肖尔的量子分解算法。

我猜有两个原因让某些人觉得我在Grover Search上的帖子很有帮助。第一,我只是在学习所有这些量子计算的东西。我不需要猜测人们会感到困惑的是什么,我是亲身经历过的。第二,我实际上正在努力解决这个问题。我没有试图用可怕的类比来解释Grover Search。我没有只是说了一些荒谬的夸张的胡说八道。我也没有过度使用这些无稽之谈。我没有用可怕的类比来解释Grover Search。我没有说一些荒谬的、夸张的胡说八道的话。我没有使用过多的语言。我没有用太多的比喻来解释Grover Search。我没有说一些荒谬的、夸张的胡说八道。我也没有过度使用。同时进行除了混乱之外不可能进行任何交流的每一次计算。我从基础开始,解释各个部分,将它们组合在一起,然后一直这样做,直到出现了搜索算法。

我可能再也不能从初学者的角度来写解释了,但我仍然可以帮助读者实际解决这个需要理解的问题。这就是我打算在这篇文章中做的事情。我想解释肖尔的算法,我想以这样一种方式来做,至少对编码略知一二的读者在离开时会认为这就是它的工作原理,而不是什么都没有,只剩下一个。

我会尽我最大的努力使事情简单易懂,但我会深入研究数学细节。我承认,在没有太多数学知识的情况下,有人勇敢地尝试过解释肖尔。但我认为,真正的理解需要比斯科特在那篇帖子中涉及的更多细节。

为了理解肖尔的量子因式分解算法,我们将首先了解几个较小的东西。然后,看看它们是如何拼凑成一个将数字分割成碎片的故事。每一个小东西都需要一些工作才能理解,但我会尽我最大的努力让核心思想变得通俗易懂。

量子计算机如何制作一个周期信号,与分解一个数字$R$相关,然后根据它的频率进行采样?

我意识到这些问题使用了一大堆我还没有解释过的术语和概念。例如,信号的频率到底是多少?……嗯,我想这是一个很好的开始的地方。

在很长一段时间里,从历史上看,声音是一个有点神秘的东西。人们知道敲钟会发出响亮的声音,但他们对实际发生的事情并没有真正的了解。为了找出潜在的机制,以及它与我们实际经历的联系,人们花了大量的工作和思考。

声音的机制只是一个单一的变量(空气中的振动/耳朵中的压力)随着时间的推移而上升和下降。例如,扬声器通过非常快速地来回移动振膜来产生声音。来回运动的特定模式决定了产生什么声音。你听到的每一件事都可以简化为一系列扬声器振膜的位置。事实上,这正是早期的音频格式(如WAV文件)存储音乐的方式:未加工的。

声音可能是一个单一的变量,但我们体验声音的方式似乎完全不是这样的。我们听到的是许多频率的频谱,所有的频率都是独立的,我认为这是声音的一大谜团:一个单一的上下信号是如何转化为由许多变量组成的丰富的上下频谱的呢?

幸运的是,这是我们实际上知道答案的谜团之一。如果你把原始音频分成块,然后对每一块进行傅立叶变换,出来的就是(更接近)我们听到的:来来去去的频率频谱。

例如,使用Audacity等声音编辑软件时,音频的默认视图实质上是扬声器振膜位置随时间变化的曲线图:

这个视图很简单,很容易看到哪里有寂静,哪里有响亮的声音。但当你试图弄清楚是什么声音时,这个视图并不是很有信息。要想找出细节,你需要更接近我们对声音的体验的东西:语谱图。

光谱图显示随时间变化的频率信息。在下图中,垂直轴是频率,水平轴是时间,每个像素的亮度表示特定频率在特定时间点的强度:

通过一些阅读光谱图的练习,您可以识别音符、乐器,甚至单词。有趣的是,您可以将现代音乐符号视为极其简化的光谱图:

无论如何,我想在这里说明的大体观点是:a)我们知道如何将原始信号转换为频率信息;b)尽管频率信息在技术上与原始信号是冗余的,但使用它会更容易。如果您想了解更多关于声音和频率的知识,可以从数字信号处理的维基百科页面开始。

现在我们对频率稍微熟悉了一点,让我们进入一个特定的相关案例,在这个案例中,传播在原始信号中的信息以一种有用的方式集中在频率空间中。

假设我制作了一首歌曲,其中扬声器-振膜位置列表几乎全部都是尽可能靠后,但每10个条目都是尽可能靠前的。也就是说,我制作了一首带有周期性闪烁的歌曲:一个数据为[0,0,0,0,0,0,0,0,0,0,255]的WAV文件。这首歌将是什么?

如果你熟悉信号处理,上面的问题可能听起来…。甚至不是错误的?为了谈论频率,你需要更多的信息。例如,采样率是多少?那带宽呢?那么窗口函数呢?但是周期性闪烁信号的有趣之处在于,不管所有这些选项,频谱基本上看起来都是一样的。

为了演示,我编写了一些Python代码来生成存储我描述的周期信号的wav文件,具有几种不同的采样率:

为[8000,16000,44100,192000]中的SAMPLE_RATE导入波形DAT_PERIOD=10:path=';dit{}dat{}.wav';。format(dat_Period-1,Sample_Rate)Cycle=bytearray。从十六进制(';00';*(DAT_PERIOD-1)+';FF';)Num_Cycle_10sec=10*Sample_Rate//Len(周期)WAVE。将(Path,';WB&39;)打开为f:f。setparams((1,1,sample_rate,0,';NONE';,';NOT';,';NOT COMPRESSED';))f.。写入帧(周期*编号_周期_10秒)。

运行生成文件的代码后,我在Audacity中打开文件并切换到光谱图视图。以下是每个文件的光谱图(为清晰起见,调整了对比度):

这些文件有不同的采样率,它们的频谱图并不完全相同,但它们看起来基本上是一样的:四个均匀分布的强峰,它们随时间保持不变。实际上,有第五个峰隐藏在0处,而Audacity隐藏了频谱的镜像一半。所以实际上有十个峰。隐含的峰的数量等于我们输入信号的周期,这并不是巧合。

请记住,上图中的每个频谱图都有不同的频率尺度。不同的采样率会对频率峰值产生影响:当采样率高一倍时,频率就会高一倍。但按比例而言,频谱图在相同的位置都有峰值,这就是我们所关心的。

(如果您实际生成并播放这些音频文件,您会发现它们实际上听起来确实像是由几个频率组成的恒定音调。)。

如果您有一台可以存储5个经典位的计算机,则您的计算机可能处于32种状态。有00000、00001、00010、00011、00100,以此类推,最高可达11111。每种方式都有一种状态,您可以为每一位分配0或1。

量子计算机与经典计算机的不同之处在于,量子计算机可以通过经典状态的特殊加权组合(称为叠加;)。您可以通过将5位可实现的32个经典态的不同比例相加来写下5量子位量子计算机的可能状态,只要重量的平方大小加起来为1即可。因此,5量子位量子计算机可以处于状态$|00000\rangle$,或处于状态$\frac{1}{\sqrt{2}}|00000\rangle+\frac{1}{\sqrt{2}}|11111\rangle$,或者处于状态$\frac{1}{\sqrt{2}}|11111\rangle$,或者处于状态$\frac{1}{\sqrt{2}}|11111\rangle$,或者处于状态$\frac{1}{\sqrt{2}}|。或处于以下状态:$\frac{1}{\sqrt{3}}|00001\rangle-\frac{1}{\sqrt{3}}|00100\rac+\frac{1}{\sqrt{5}}|10000\rac$,或各种其他有趣的组合。

在这篇文章中,当我说周期态时,我指的是经典态的权重类似于零,而不是零,零,也不是零,以此类推的叠加。换句话说,具有非零权重的经典态应该是均匀分布的(它们都应该具有相同的非零权重)。

例如,。状态$\frac{1}{\sqrt{7}}|00000\range+\frac{1}{\sqrt{7}}|00101\range+\frac{1}{\sqrt{7}}|01010\range+\frac{1}{\sqrt{7}}|01111\range+\frac{1}{\sqrt{7}}|10100\range+\frac{1}{\sqrt{。将$\frac{1}{\sqrt{7}}$权重赋予状态00000,状态00101,以此类推,直到11110。所有其他状态都是#39;t指定任何权重。以十进制数表示的非零权重状态为0、5、10、15、20、25和30。这是一个周期为5的周期状态。更简洁的写此状态的方法是使用求和记数法,如下所示:$\frac{1}{\sqrt{7}}\sum_{k=0}^{6}|5k\Rangle$。状态$\frac{1}{\sqrt{7}}\sum_{k=0}^{6}|5k\Rangle$。状态$\frac{1}{\sqrt{7}}\sum_{k=$\frac{1}{\sqrt{7}}\sum_{k=。

在这一点上,某个子集的读者可能正在沿着字里行间叠加的思路思考一些事情?哈!我打赌量子计算机正秘密地处于其中一种非零重量的状态,但我们不知道是哪种状态!这与概率分布有什么不同?

“如何知道叠加是真实的?”这个问题的答案是:因为我们可以对状态进行操作,而这些操作的结果取决于你是从状态的叠加还是单个状态(或状态的概率分布)开始的。

我们在这篇文章中关心的具体量子操作是量子傅立叶变换(QFT)。QFT所做的是…。它就像是取状态的权重,假装它们是组成音频文件的样本,计算出音频中的频率,然后用每个频率的强度作为新的权重来定义计算机的状态。(对于你是否稍微理解了最后一句话,一个很好的预测指标就是你的大脑是否刚刚被吹得很厉害。)关键是:在应用QFT之后,对量子计算机的状态进行采样可以告诉我们输入状态的主要频率(如果有的话)是什么。(如果有的话,这是一个很好的预测指标,可以预测你是否稍微理解了最后一句话。)关键是:在应用QFT之后,对量子计算机的状态进行采样可以告诉我们输入状态的主要频率是什么(如果有的话)。

如果你从经典状态开始,应用QFT运算,得到的频谱看起来完全是平坦的(所有的作用都在相位上,而不是幅度上)。相比之下,周期信号的频谱绝对不是平坦的。就像早先的频谱图一样,周期信号的频谱有尖锐的峰值。而且,频率峰值的数量不是某个单独状态的属性。峰值的数量等于状态之间的间距。

(如果量子计算机真的只处于一种经典状态,那么关于可能状态之间的间隔的属性怎么会进入输出呢?频谱告诉我们一个非常清楚的故事,说明到底是怎么回事。)。

作为一个具体的例子,我用我的拖放量子电路模拟器Quirk准备了一个周期量子态(稍后将详细介绍),然后使用量子傅立叶变换操作将该态切换到它自己的频率空间。结果是:

左边的绿色矩形是机会显示,它显示了从0000000到1111111的每个经典状态的测量叠加返回该状态的概率。您可以看出输入状态是周期性的,因为机会显示中的峰值(对应于具有非零权重的状态)是均匀分布且大小相同的。

中间的白框写着$\text{qft}^\dagger$是(逆)量子傅立叶变换操作,它将输入状态切换到自己的频域。我不会详细介绍QFT是如何在引擎盖下实现的。就本文而言,重要的是它是否可以实现。如果您需要更多信息,请参阅维基百科的文章。

右边的绿色矩形是一个机会显示,显示在测量输出状态时获得各种结果的概率。它有十个等间距的峰值。为什么是十个?因为频率峰值的数量就像周期性闪烁的歌曲一样。输入状态的周期是十,所以频率空间输出有十个峰值。

为了检查这是否真的有效,让我们将输入状态的周期从10个减少到5个。我们应该会得到一半的峰值:

是的,输出的峰值数目等于输入的周期。

在我们继续之前,我想先谈谈为什么我们要为频率空间而烦恼。如果我们是在信号的周期之后,为什么不直接看着输入信号来得到它呢?

请记住,图表中的绿色显示在现实生活中是不可用的。我们不能看到分布,我们只能从中取样。取样可以有效地告诉我们各种峰在哪里(如果它们足够高),但不能告诉我们有多少峰。

不过,为什么我们不简单地对初始信号采样几次并观察模式呢?为什么我们不能通过采样输入信号并注意到这里肯定有很多5的倍数来计算出周期呢。?

注意到某个倍数不断发生的问题是,正如您稍后将看到的,在我们关心的问题中,我们重新采样的信号将具有随机偏移量。如果我们采样数字213,则可能是$50\cOT 4$,偏移量为$13$,或$10\cdot 21$,偏移量为$3$,或偏移量和倍数的任何其他组合。每次采样时,都会有一个不同的未知偏移量,这会阻止我们找出潜在的模式,从具有随机偏移量的输入状态采样会看起来完全像随机噪声。

随机偏移量使在频率空间中工作变得有用,因为频率峰值不受偏移量的影响。当您移动信号时,您可以将相位a因子应用于每个频率,但这些频率的幅度都保持不变。

为了演示这一点,我在Quirk中制作了另一个电路。这一次我使用了一个操作,在QFT发生之前将越来越大的偏移量添加到输入寄存器中,Quirk模拟每个偏移量发生的情况。请注意,在整个生成的动画中,输入状态是循环的,但输出峰值完全保持不变:

输出的相位(未显示)正在改变,但大小保持不变。当结束量子计算时,大小才是最重要的。大小决定了测量每个状态的概率。(如果你要做更多的后续操作,相位是重要的。)。但我们不是。)。

在上图中你应该注意到的另一件事是,频率峰值对微小的缺陷是有弹性的。因为状态的数量($2^7=128$)不是周期($5$)的倍数,所以在斑点之间的间距是3而不是5的情况下,有一个小小的扭结。尽管有这个扭结,这些峰值非常接近于0/5,1/5&39;th,2/5';th,3/5';尽管有这种扭结,但峰值非常接近于0/5&39;th,1/5&39;th,2/5&39;th,3/5&39;

我已经解释过,如果我们有一个周期未知的周期性量子态,我们可以从它的频率空间的峰值中取样,以便了解一些关于这个周期的信息。但是,我们如何首先准备那个周期态呢?

首先,一个简单的例子。如果我们想要的周期是2的幂,让';假设为$2^3$,那么准备周期态就很简单。首先将$n$量子位量子寄存器初始化为0,对前3个量子位不做任何操作,然后用阿达玛门命中其余的量子位。您用阿达玛门命中的每个量子位都将从$|0\Rangle$状态转换到$\frac{1}{\sqrt{2}}|0\Rangle+\frac{1}{\sqrt{2}。将整个qureg置于状态$\frac{1}{\sqrt{2^{n-3}}\sum_{k=0}^{2^{n-3}}|8k\Rangle$.That';它是周期为$2^3$的周期状态。

创建周期为8的量子态的另一种方法是用阿达玛门击中每个量子比特,将我们要准备的寄存器添加到大小为3的寄存器中,然后测量另一个寄存器,如果结果不是0,则重试。这就是它看起来的样子:

请注意,这是一个中等机会显示具有误导性的情况。看起来加法并没有更改为我们正在准备的寄存器的状态。实际上,它的状态受到了非常重要的影响。

要使添加引起的变化更加明显,一种方法是使用Quirk的密度矩阵显示器:

我不指望读者知道如何读取密度矩阵。需要注意的重要一点是,加法将左侧显示器中的细粒度网格图案变成了中间显示器中的一串对角线。对角线实际上是由一串间距更大的网格的偏移副本组成的,就像右边的显示屏中所示的那样。每个偏移副本都代表叠加的一部分,不能再与其他部分交互。

让将前七个量子位称为输入寄存器,后三个量子位称为Ancilla寄存器。当我们将输入寄存器添加到Ancilla寄存器中时,基本上是将输入寄存器的值复制到Ancilla寄存器中,模数为8(因为Ancilla寄存器有3个量子位,$2^3=8$)。您可以认为这是将输入寄存器的叠加分成8。S是余数为0的经典态的一部分,余数为1的值的一部分,余数为2的一部分,以此类推,直到余数7的部分。

如果我们测量Ancilla寄存器,它会告诉我们一些关于输入寄存器的信息,具体地说,它会告诉我们叠加的八个部分中哪些幸存下来了,但是,无论测量结果如何,幸存的态总是一个周期为8的量子态,只有态的偏移量发生变化。

请注意,即使我们还没有测量Ancilla寄存器,我们也可以合理地说输入寄存器包含周期为8&34;的周期量子态。事实上,即使我们计划丢弃Ancilla寄存器而不费心测量它,这也是合理的。Ancilla寄存器的初始化将输入寄存器分成独立的非交互部分。

..