跳到内容

西蒙的算法

另一个黑盒甲骨文问题

假设我们有一个未知的,黑盒量子操作。我们知道它有这个签名:

操作黑箱(输入:量子位[],输出:量子位[]):单位

需要在两个寄存器,一个“输入”和“输出”。我们知道这两个寄存器必须是相同的大小。同时,我们知道操作将本质上执行一些计算的输入注册并把结果输出寄存器。例如,假设这个操作需要在3-qubit寄存器,并left-shifts输入1位。这将是一个表的输入和输出:

输入 输出
000年 000年
001年 010年
010年 One hundred.
011年 110年
One hundred. 000年
101年 010年
110年 One hundred.
111年 110年

我们还知道,这个操作是一个以2函数。这意味着每一个可能的输出,有2输入生产它。在上面的左移的例子中,有四个输出值:000,010,100,110。对于每一个,有两个输入,提供:例如,在100年010年和110年两个结果。

最后我们知道这个操作,这是关键的信息,它包含一个字符串“秘密”\ (\)。每一对输入产生相同的输出值,当XOR一起,结果在这个秘密的字符串。数学上来说,如果我们有一对输入\ (x_0 \)\ (x_1 \)导致输出\ (y \),那么:

\ [\ displaylines {f(从)= y \ qquad f (x_1) = y \ \ ~ \ \ (x_0 \ oplus x_1 = s} \]

演示:让我们看看对左移函数。对000年和100年,001年和101年,010年和110年,011年和111年:

f (\ \ [\ displaylines{刃{000})= 000,\ qquad f(\刃{100})= 000,\ qquad \刃{000}\ oplus \刃{100}= \刃{100}\ \ ~ \ \ f(\刃{001})= 010,\ qquad f(\刃{101})= 010,\ qquad \刃{001}\ oplus \刃{101}= \刃{100}\ \ ~ \ \ f(\刃{010})= 100,\ qquad f(\刃{110})= 100,\ qquad \刃{010}\ oplus \刃{110}= \刃{100}\ \ ~ \ \ f(\刃{011})= 110,\ qquad f(\刃{111})= 110,\ qquad \刃{011}\ oplus \刃{111}= \刃{100}}\]

所以left-shift-by-1操作3个量子位,字符串的秘密\ (\ s = 100)

这是另一个例子问题(弄明白这是如何工作的问题实际上是一个挑战挑战实验室2):

输入 输出
000年 101年
001年 010年
010年 000年
011年 110年
One hundred. 000年
101年 110年
110年 101年
111年 010年

对这个000年和110年,001年和111年,010年和100年、011年和101年。下面让我们评价他们找到秘密字符串:

f (\ \ [\ displaylines{刃{000})= 101,\ qquad f(\刃{110})= 101,\ qquad \刃{000}\ oplus \刃{110}= \刃{110}\ \ ~ \ \ f(\刃{001})= 010,\ qquad f(\刃{111})= 010,\ qquad \刃{001}\ oplus \刃{111}= \刃{110}\ \ ~ \ \ f(\刃{010})= 000,\ qquad f(\刃{100})= 000,\ qquad \刃{010}\ oplus \刃{100}= \刃{110}\ \ ~ \ \ f(\刃{011})= 110,\ qquad f(\刃{101})= 110,\ qquad \刃{011}\ oplus \刃{101}= \刃{110}}\]

对于本例中,字符串的秘密\ (\ s = 110)

现在,它可能变得明显,我们实际上并不需要评估的所有对找出秘密字符串;我们可以通过寻找任何一对输入,产生相同的输出,和xor在一起。(注意:有一个特殊情况\ (\ s = 000)函数的结果是1:1,但是我们可以稍后)。这给我们带来了手边的问题:

给定一个2比1功能有秘密的字符串,要多长时间你找出字符串的秘密是什么?换句话说,你需要做多少迭代为了找到一对输入产生相同的输出?

这是另一个的情况下,如果我们在经典计算机上运行操作,一切都取决于运气。如果我们幸运的话,我们会发现一对在我们第一次两个输入检查。如果我们非常不走运,我们咀嚼通过一半的可能的输入没有找到一双,然后下一个迭代(半+ 1)保证给我们一双。像叫做deutsch - jozsa算法,这意味着我们的最坏的时间\ (2 ^ {n−1} + 1 \)试,但是有一个问题:这需要存储所有的输入输出对我们在字典或地图。如果输入是128位,我们必须存储\ (2 ^ {127}\)对这是在\ (10 ^ {40}\)位,一个完全不切实际的号码。现实地讲,我们要选择一个小的子集输出跟踪,寻找配对,所以我们看周围\ (2 ^ {128}\)经典计算机的数量级估计。具体而言,\ (n \)的输入,需要\ (2 ^ n \)试图解决这个问题。

幸运的是,有一个量子算法能够解决它\ (n \)尝试。

西蒙的算法

量子算法,解决了这一问题西蒙的算法命名一个名叫丹尼尔·西蒙的计算机科学家,1994年算出来。从量子计算的角度来看,西蒙的算法是我们四个人最喜欢的一个原因:

  1. 它实际上是一个混合动力算法,它具有量子部分和一个经典的后处理部分
  2. 它利用量子计算的三个关键特征:叠加,干扰和纠缠
  3. 这不是概率像Grover的算法;它提供了一个正确的答案100%的时间
  4. 叫做deutsch - jozsa不同,它不仅仅是一个玩具问题;它有一些实际的应用程序量子密码

经典的后处理是很难解释的。我们花了9页来写的一篇论文中。长话短说版本,您可以使用量子一步给你随机比特串,保证mod-2点积零运行时对秘密的字符串,可以收集到足够的解决一堆经典线性独立的方程,一个非常有效的算法高斯消去法

稍微详细地,西蒙的算法是这样运作的:

  • 量子运行oracle与输入寄存器的叠加所有可能的输入,然后应用H门口所有的输入量子位和测量它们。这将“神奇”给你一个位串\ (y \)mod-2点积的一些字符串和字符串的秘密吗\ (\)是0:

    \ (\ qquad (y_0 \ cdot s_0) \ oplus (y_1 \ cdot s_1) \ oplus…\ oplus (y_ {n} \ cdot s_ {n}) = 0 \)

    我以后再进入这是如何工作的。

  • 有些字符串添加到输出的集合。

  • 再次运行量子一步。检查是否输出线性无关的与所有的输出收集到目前为止。如果是,保留它。如果不是这样,忽略它。
  • 重复这个过程,直到你\ (n−1 \)线性无关的字符串。如果你有点不走运,你可能需要做多一点\ (n \)次,但根据我们的经验,这个数字的“额外”尝试通常是在个位数和较大的输入大小几乎消失了。在这一点上,你现在拥有的\ (n−1 \)线性无关的长字符串的形式:

    \ \ qquad (y_ {0} \ cdot s_0) \ oplus y_ ({0,1} \ cdot s_1) \ oplus…\ oplus (y_ {0, n - 1} \ cdot s_ {n}) = 0 \)

    \ \ qquad (y_ {1, 0} \ cdot s_0) \ oplus (y_ {1 1} \ cdot s_1) \ oplus…\ oplus (y_ {1, n - 1} \ cdot s_ {n}) = 0 \)

    \ (\ qquad…\ \ \)

    \ \ qquad (y_ {n, 0} \ cdot s_0) \ oplus (y_ {n - 1} \ cdot s_1) \ oplus…\ oplus (y_ {n, n - 1} \ cdot s_ {n}) = 0 \)

    这有效地形式的一个矩阵\ (n−1 \)线性方程。使用一个聪明的古典过程找到一个从这些生产一个矩阵方程\ (n \)线性方程。

  • 使用高效、古典mod-2高斯消去法和回代过程解决矩阵。

  • 这将给你的秘密字符串\ (\)
  • 甲骨文的“经典”模式下运行,输入的\ \(刃{0 . . 0}\)状态和测量输出。再次运行它的输入\ \(刃{年代}\)状态和测量输出。比较两个输出。如果他们是一样的,你发现了秘密字符串!如果他们不同,秘密实际上是字符串\ (s = \刃{0 . . 0}\),所以甲骨文不遵守规则的问题,它可能没有一个秘密的字符串。

在挑战实验2中,我已经为你实现所有经典的东西(因为这是一个量子软件开发类,c#开发,所以这是不公平的,如果你不知道已经c#)。你只需要担心量子一步。

量子一步,第1部分:Oracle

我们讨论了量子干涉页面,\ (H_{所有}\)操作与mod-2点积函数。西蒙的quantup一步利用这一点来产生一个位串的值为0时mod-2点积是应用秘字符串。这一事实是保证0就是算法的实际工作。所以量子如何一步呢?

这里有一个线路图对西蒙的量子步骤:

这有点不同于oracle样式用于叫做deutsch - jozsa和Grover的算法,因为不是频繁的换一个目标量子位,这实际上处理整个输入到一个完全独立和才输出寄存器。概念仍然是相同的:\ (H_{所有}\)输入量子位,量子操作运行,\ (H_{所有}\)再次输入量子位,测量输入寄存器。

现在,因为输出取决于输入,操作几乎肯定会纠缠两个寄存器控制盖茨。显示这些是做什么的,让我们使用left-shift-by-1例子和构建怪癖。这是前两个步骤后的电路(H所有量子比特和运行oracle):

如图所示,left-shift-by-1操作可以很容易实现一些小心翼翼的把cnot。正如预期的那样,输入和输出寄存器现在纠缠在一起。他们都将给整个状态:

\[开始\{对齐}\压裂{1}{\ sqrt{8}} \左(\右。& \刃{000000}+ \刃{001010}+ \刃{010100}+ \刃{100000}+ \ \ & \离开了。\ \刃{101010}+尿酮体{110100}+ \刃{111110}\)\{对齐}结束\]

他们现在在所有可能的输入和输出的叠加组合,所以无论输入寄存器作为衡量,总是会输出测量结果操作的输入值。

量子一步,第2部分:H(所有)的输入

让我们看看会发生什么在接下来的部分,在H又应用于输入寄存器:

输入和输出寄存器仍然纠缠,和输出仍有一个同样可能的几率被测量的任何可能的输出函数,但是看看发生在输入:减少一半,而不是8可能的输入,现在只有4 (\ \(刃{000}\),\ \(刃{001}\),\ \(刃{010}\),\ \(刃{011}\))。所有这些值的第4值的mod-2点积值和字符串的秘密\ (s = \刃{100}\)是0:

\ [\ displaylines {\ {000}, \ qquad (0 \ cdot 1) \ oplus (0 \ cdot 0) \ oplus (0 \ cdot 0) = 0 \ \ cdot cdot 0 0 = 0 ~ \ \ \ \ \刃,{001}\ qquad (0 \ cdot 1) \ oplus (0 \ cdot 0) \ oplus (1 \ cdot 0) = 0 \ \ cdot cdot 0 0 = 0 ~ \ \ \ \ \刃,{010}\ qquad (0 \ cdot 1) \ oplus (1 \ cdot 0) \ oplus (0 \ cdot 0) = 0 \ \ cdot cdot 0 0 = 0 ~ \ \ \ \ \刃,{011}\ qquad (0 \ cdot 1) \ oplus (1 \ cdot 0) \ oplus (1 \ cdot 0) = 0 \ \ cdot cdot 0 0 = 0} \]

其他四个输入值有一个mod-2点积的,他们都被淘汰出局。

这是如何发生的呢?像往常一样,这涉及到量子干涉。自西蒙的算法仅适用于H输入,输出将独处——这意味着我们可以打破\ (H_{}(输入)\)操作分成四个组,每一个输出值:

\[开始\{对齐}\刃{H_{所有}(输入),输出}= & \输入textcolor{蓝}{\刃{H_{所有}(000),000}}+ \输入textcolor{紫色}{\刃{H_{所有}(001),010}}+ \ \ & \输入textcolor{绿}{\刃{H_{所有}(010),100}}+ \输入textcolor{红}{\刃{H_{所有}(011),110}}+输入textcolor{蓝}\ \ & \{\刃{H_{所有}(100),000}}+ \输入textcolor{紫色}{\刃{H_{所有}(101),010}}+ \ \ & \输入textcolor{绿}{\刃{H_{所有}(110),100}}+ \输入textcolor{红}{\刃{H_{所有}(111),110}}\{对齐}结束\]
{对齐}= & \ \[\开始输入textcolor{蓝}{\刃{(H_{所有}H_(000) +{所有}(100)),000}}+ \输入textcolor{紫色}{\刃{(H_{所有}H_(001) +{所有}(101)),010}}+ \ \ & \输入textcolor{绿}{\刃{(H_{所有}H_(010) +{所有}(110)),100}}+ \输入textcolor{红}{\刃{(H_{所有}H_(011) +{所有}(111)),110}}\{对齐}结束\]
{对齐}= & \ \[\开始输入textcolor{蓝}{\刃{H_{所有}(000 + 100),000}}+ \输入textcolor{紫色}{\刃{H_{所有}(001 + 101),010}}+ \ \ & \输入textcolor{绿}{\刃{H_{所有}(010 + 110),100}}+ \输入textcolor{红}{\刃{H_{所有}(011 + 111),110}}\{对齐}结束\]

这是我们可以一起工作。让我们的两项输出\ (000 |⟩\)作为一个例子,我们要评估\ (H_ {} (000 + 100) \)。与Hadamatrix我们可以这样做很容易,只是除了通过消除所有的行\ \(刃{000}\)\ \(刃{100}\):

显然第一个四个州是相长干涉,最后四个州要相消干涉。因此,前四将被放大,最后四将完全消除最后的叠加。

让我们再试一次使用不同的一对,怎么样\ \(刃{010}\)\ \(刃{110}\)吗?

再一次,前4项建设性干涉,最后四相消干涉。\ \(刃{010}\)\ \(刃{011}\)最终会有一个负相,你可以看到这个怪癖截图在列输出在哪里吗\ \(刃{100}\)。幸运的是,一个负相并不重要,因为我们只关心整体在测量大小。

你走吧!所有的州mod-2点积在秘密状态= 1将消除由于建设性和破坏性的干扰。

量子一步,第3部分:测量

西蒙的算法的一个奇怪的事情是,在第二次\ (H_{}(输入)\)操作,输入和输出仍然纠缠。这意味着我们无法表达输入注册为一个完全独立的事情——它不能被分离成自己的状态向量,这是整体的一部分状态向量之间的输入和输出寄存器。话虽这么说,仅仅因为它是纠缠并不意味着我们不能测量它。

让我们看看发生了什么怪癖,如果我们单独隔离振幅与输入寄存器:

显然,由于输入仍纠结输出振幅本身贴上“语无伦次”,因为他们不能被孤立。每个输入寄存器级的状态,然而,仍然是公平的游戏。如图所示,如果我们只是测量输入注册,我们将有25%的机会测量\ \(刃{000}\),\ \(刃{001}\),\ \(刃{010}\),或\ \(刃{011}\)每一个。尽管纠结输出,所有的输入状态,不能满足特殊字符串都被淘汰了。我们不知道哪个国家我们会得到当我们测量输入,但有一件事是肯定的:测量结果,mod-2秘密状态,点积为0。由于这种保证,我们可以使用量子一步快速建立一组线性方程和在古典后处理步骤找到秘密字符串。

实验室6

解释,你准备好了应对西蒙的算法在实验室6。正如我们前面所提到的,经典的一部分已经实现。你可以看一看它的代码,如果你很好奇,很彻底的记录,但这并不是一个阶级学习c#或古典技术像高斯消去法,我们一切都是为了你。所有您需要做的是量子的步骤,如果你特别敢于冒险,有一些额外的甲骨文功能可以实现和运行西蒙的算法在实验室的结束。

一旦运行单元测试,点击打开额外输出……链接底部的测试结果:

实际上这将给你一个输出日志的整个测试运行。例如,这是一个测试的输出left-shift-by-1函数量子位9日:

测试实现打印字符串,量子一步发现,是否线性无关与迄今为止发现的,并显示了最终的秘密字符串由高斯消去法后处理步骤。您可以使用这个输出字符串的秘密。


最后更新:2021年6月26日