格罗弗的算法¶
在干草堆针:蛮力搜索¶
设想以下场景:你清理一些旧的东西已经在你的衣柜里,因为你是一个孩子,和你遇到一个笔记本。在这个笔记本,你找到一个电话号码不附加任何名字。你不知道它属于一个朋友,或者一个你以前从未见过,也不知道,但你的好奇心已经被激怒了,,你要算出来。你的战略是什么?
首先,你前几位数输入到你的手机,看看它是否足够过滤你的联系人,你可以找到一个匹配。你试一试,但没有这样的运气。接下来,你试着做一个网络搜索。结果告诉你大约的数字,但不给你任何信息谁拥有它。作为一个最后的努力,你抓住一个老式纸质电话本从你小时候去查。
但是有一个问题!电话本不是按数量排序,按名称排序。为了找出谁属于数量,你基本上都必须经过整本书,逐行,直到你找到一个匹配。有成千上万的清单在电话簿里。永远需要你查看,你没有这样的时间。你叹了口气,把笔记本扔到回收的箱子。你永远不会知道,神秘的数字属于谁,或者为什么你写下来所有这些年前。
现在,你将通过你的衣橱,你完全忘了找一个旧的笔记本电脑。当然有一些怀旧的东西——老和朋友谈话,老照片,几个游戏你玩…你代入,引导它,,它就会自动弹出一个登录提示。你不知道密码是什么。你随意尝试很多不同的事物你认为你记得从很久以前,但似乎没有人工作。你会有更好的运气只是在每一个可能的密码,直到你终于正确的。即使你知道多长时间,如果是任何明智的大小,需要太长时间试试所有的组合键。你摇头,祈祷你没有加密的硬盘,所以你至少可以把它插到另一台电脑上看到的。
哎呀!原来你是偏执的少年,和你做加密硬盘所以没有人会偷你所有的宝贵数据。你知道什么是算法,你知道它有一个80位的密钥。这意味着有\ (2 ^ {80}\)可能的钥匙,就是的\ (10 ^ {24}\)。如果你可以检查每秒一百万键,它会带你约400亿年破解代码。
叹息。
上述三种情况的需要的问题蛮力搜索解决:鉴于一些函数,所有可能的输入,一个是“正确”的,所有的人都是错误的。如果你有什么,你唯一的策略都是尝试,希望你得到幸运。更具体地说,对于一个n位输入空间,你必须试一试\ (2 ^ n \)输入之前你找到正确的一个。这个指数增长问题是非常重要的;很多现代密码学,包括对称密钥算法AES或加密哈希函数sha - 256,取决于这个属性。
幸运的是,量子计算机不遵守相同的规则。在1996年,一个计算机科学家命名的值列表Grover发现量子算法能找到这个“正确”状态,不管实际的函数是什么,\ \√2 ^ {n} = 2 ^ {n∕2} \)几乎每次迭代。把到的角度来看,你的笔记本电脑是80位加密算法只会要求\ (2 ^ {40}\)迭代——在每秒一百万的支票,你可以敲出来不到13天。这是一个大问题。
Grover的搜索算法¶
Grover的算法叫做deutsch - jozsa有点类似:它使用叠加和干扰”强调“我们关心的特殊状态。然而,与叫做deutsch - jozsa Grover的算法需要多次迭代才能工作。这不是一个简单的算法看一下就完了。同时,Grover的算法概率算法:它没有返回正确答案的可能性为100%。它有一个非常高的机会,实际上随输入空间的大小,但它不是100%。然而,在大多数情况下,如果第一次运行不给你正确的答案,你可以再试一次。在上面的例子中,即使花了你4试图破解代码,这仍然是只有52天。这是一个比400亿年更好。根据我们的经验,它几乎总是在1 - 3试着找到正确的答案。
在高级别上,格罗弗的算法把所有可能的输入叠加成一个统一的输入,这样每一个州都有一个小(但非零)的振幅。它使用几轮的干扰逐渐放大的振幅的正确状态,同时减少振幅不正确的状态,直到正确状态的振幅是如此之高,以至于它极有可能是测量。这种技术被称为振幅放大,叫做deutsch - jozsa不同,它不是一个玩具的问题。量子技术,这是一个严肃的科学家和工程师非常兴奋,因为它有重大影响,…嗯,几乎任何类型的问题,包括寻找的东西。Grover的算法是量子计算机的主要实际用例,今天你要建造它。
这里有一个线路图的算法。这将需要一些解释,但我将带您亲历:
表面上,这看起来非常类似于叫做deutsch - jozsa。有一个输入寄存器和一个目标量子位,输入开始时所有可能的状态和输出作为开始\ \(刃{1}\),发生了一些东西,然后输入测量。所有这些应该感到相当熟悉。需要解释的是“一些东西发生”算法的一部分,这是贴上“Grover迭代”的画面。这是什么这个子程序,一步一步。
Grover迭代步骤1:Oracle¶
迭代所做的第一件事是运行oracle。像以前一样,这个甲骨文是一个黑盒功能,需要在一些输入,如果输入符合某些标准,它翻转目标量子位的相位造成阶段回扣输入状态。在这种情况下,然而,我们没有看到一个常数或平衡甲骨文;我们唯一知道的是,有一个“正确”状态的所有可能的状态,而这phase-flip甲骨文将国旗。这就是我们得到的。
更简单,运行时在所有可能的输入的叠加,oracle将phase-flip正确的状态,让所有的错误状态。它不碰振幅,它不会神奇地揭示了状态,它所做的是让它消极,把其他国家积极。
让我们用一个例子证明了这一点。说我们有一个oracle 3-qubit寄存器作为输入,和“正确”的状态\ \(刃{101}\)。这里有怪癖的输出是什么样子,如果我们建立这个电路:
这个电路的控制Z是甲骨文。注意所有的振幅都是积极的,除了\ \(刃{101}\)这是负的。
Grover迭代,第二步:H¶
一旦正确的状态被标记为一个阶段,接下来的迭代是H适用于所有的输入量子位。这导致量子干涉,产生一种奇怪的状态:
没有甲骨文,这将把输入回\ \(刃{000}\)状态。然而,与甲骨文\ \(刃{000}\)国家仍然有大的振幅,但现在所有其他的州都有一些非零振幅。此外,他们中的一些人是积极的,有些是负面的。
解释发生了什么,让我们回到Hadamatrix。当oracle phase-flipped正确的状态,它最终翻转一行矩阵:
这个row-flip会产生这种状态:
这一步所做的实际上是计算每个州的mod-2点积与正确的人(在这个例子中,\ \(刃{101}\))。mod-2点积是这样的操作:
基本上,它使每一对位在一起,xor一起的结果。如果有偶数个双,两位都是1,总的结果将是零。如果有奇数\ ((1⋅1)\)对,结果将是一个。关于这个\ (H_{所有}\)操作,所有的州与偶数个双负的,和所有的州数为奇数的对保持积极的:
然而,有一个明显的例外:状态\ \(刃{000}\)有偶数个对(0),所以它应该是负的。它不是。它是正的。这给我们带来第三步。
Grover迭代步骤3——零状态¶
第三步是一个函数标记为“检查输入是否都是零”。这个函数实际上是一个oracle,它正是你所期望的:它检查是否输入0(在\ \(刃{0 . . 0}\)状态),如果是这样,它翻转阶段。换句话说,它修复这一事实\ \(刃{0 . . 0}\)在步骤2错误的阶段。在我们的例子中,它将导致这种状态:
话虽这么说,记住,标准的惯例是假设\ \(刃{0 . . 0}\)国家没有一个阶段。而不是否定这一阶段,我们说这一步否定阶段其他国家的叠加:
这是第一个例子一样,乘以全球阶段1,所以他们实际上是同一个州。现在,所有的积极状态的mod-2点积\ \(刃{101}\)是0(美国有偶数个吗\ \(刃{1}\)量子位对),所有的消极状态的产品是1(奇数\ \(刃{1}\)量子位对)。mod-2点积阶段恢复正常!这里有怪癖的输出:
现在,我们准备看的最后一步迭代。
Grover迭代,第四步:H¶
最后一步迭代的适用\ (H_{所有}\)再次输入。在其当前状态,准确输入将被否定的一半。这是Hadamatrix对于我们的示例:
明显的是,所有的条款列正确的状态,\ \(刃{101}\)都是积极的,而其他列有相同数量的优势与不足。所有这些错误的州将相消干涉,正确的国家将有建设性的干预,提高其振幅牺牲所有的其他人。
做数学,最终状态变成这样:
这是怪癖:
的振幅\ \(刃{101}\)状态是5 x比其他的大,使它25 x更可能比任何其他的测量。不过,由于有7其他州,它只有一个\(25/32 \大约78 \ % \)被测的机会。然而,如果我们只是再次运行迭代…
现在它有94.5%的几率被测量,这实际上是高达三量子位。如果我们尝试再次运行的迭代,我们实际上过度和振幅下降。请注意,我们已经走过了这一点,因为正确的状态已经的振幅-第二次迭代,实际上把它过去的100%,回落至94.5%。
总之,这是Grover的搜索算法是如何工作的。很多精明狡猾的光带来正确的国家干涉比蛮迫使它与古典电脑快得多。难怪每个人都激动的量子计算机!
实现¶
下面是代码实现Grover的算法的步骤:
- 应用H的所有输入量子位,导致一个统一的叠加\ (2 ^ n \)可能的状态。
- 应用X的输出量子位,所以它是\ \(刃{1}\)状态。
- 运行Grover迭代\ ([2 ^ {n∕2}] \)*(四舍五入为最接近的整数)。
- 在输入寄存器运行oracle和目标量子位。
- 应用H量子位的所有输入。
- 否定的\ \(刃{0 . . 0}\)状态和输出量子位zero-controlled Z,使用整个输入寄存器作为控制。
- 应用H量子位的所有输入。
- 测量输入寄存器。由此产生的位串(可能)是正确的状态。
- 运行结果的经典实现功能,并检查如果是正确答案。如果是,那你就完成了。如果不是,重新开始,再次运行整个算法。
实验室7¶
好的,你准备把你问#技能测试和构建Grover的算法在实验室7 !