跳到内容

叫做deutsch - jozsa算法

一个简单的问题

叫做deutsch - jozsa算法算法是第一个我们要看看,它提供了一个指数加速在经典计算机上。我们称之为一个“玩具”的问题,因为它是非常不自然的,并没有任何实用价值,但这是一个很好,简单的例子的力量,量子计算机可以掌控一个经典。这通常是第一个“hello world”风格算法教人新的量子计算。它非常容易实现,但它很难理解为什么它除非你经历了所有的背景,到目前为止我们所做的(特别是干扰)。之前,尽管如此,我们应该解释的问题解决了。

忘记量子计算机一分钟。让我们回到经典计算机的世界。假设你有黑盒功能。你不知道这个函数是如何工作的,但是你知道它有这个签名(在一些通用的伪代码):

公共bool黑箱([]输入)

这个函数是一个所谓的甲骨文。它接受某种形式的输入,输出一个点:0或1。“是”或“否”。正确的或不正确的。你不知道这个甲骨文函数或它所做的工作;所有你知道的是,在一些输入和基于它将返回true或false。

任何函数实现这种行为可以被视为一个oracle。例如,假设我们有一个密码检查功能用户是否进入“正确”给定帐户密码。可能需要在一个字符串并返回true,如果密码匹配,如果密码正确,或假:

公共boolCheckPassword(字符串输入)

在这种情况下,有很多可能的输入,但只有其中一个会返回true。

对于这个问题,我们承诺以下关于这个函数:它不是常数,或平衡

  • 一个常数函数将总是有相同的行为,不管输入是什么。也就是说,它总是返回true或总是返回false。
  • 一个平衡函数将返回true一半的可能的输入,并返回错误的另一半。我们不知道哪个输入属于哪个一半,我们只知道一半会触发它,不会的一半。

例如,这是一个常数函数:

公共bool黑箱([]输入){返回;}

事实上,只有两个可能常数函数(其他总是返回true)。

这是一个平衡函数的例子:

公共bool黑箱([]输入){返回输入(0]= =1;}

一半的所有可能的输入函数,第一位是0,所以将返回false。对于另一半,第一个1所以它会返回true。

问题是:给定一个黑盒功能,您需要运行多少迭代之前知道有100%的把握是否它是常数或平衡?

经典计算机上,oracle将通常被实现为一个函数,它接受一个输入寄存器,并返回一个单一- 0或1。我们就没有任何其他选择比试试各种输入输出是什么。在最好的情况下,我们会得到超级幸运,找到两个不同的输出我们的两次尝试。由于常数函数总是相同的值为每一个输入,我们知道这个函数不能恒定,因此它必须平衡。在最坏的情况下,我们会得到超级倒霉;我们会尝试完全一半的输入和得到相同的结果,然后再试一次吧,得到不同的结果。在这种情况下,函数是平衡的,但是我们不得不排气整个输入数字的一半。如果我们试着最后一个额外的价值和它给相同的结果作为上半年,我们知道它是常数,不需要检查了。

如你所知,\ (n \)的输入,有\ (2 ^ n \)可能的函数的输入值。如果我们不走运,我们要试一试\ (2 ^ {n} + 1 \)迭代,这可能是完全不切实际的大投入。这是这个问题的答案:\ (2 ^ {n} + 1 \)尝试完整的确定性。把到的角度来看,如果我们有一个128位的输入(像一些加密算法使用),可以每秒执行十亿年检查,它仍会\ \ (1.7 * 10 ^ {29}\)秒,约\ (5 \ * 10 ^ {21}\)算出来。

量子计算机,另一方面,可以算出来一次迭代

实现Oracle作为量子操作

现在,让我们从一个经典函数转换成量子操作。这样做的主要障碍是,量子操作需要可逆的——他们需要相同数量的输入,输出。这意味着我们不能把一个输入寄存器中并返回一个量子位;我们必须提供输入寄存器和“输出”量子位作为单独的输入功能。觉得这像一个“了”参数,如果您曾经使用过这些。

问#黑盒函数的签名看起来像这样:

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

这个操作的行为将是相同的经典实现,除了而不是返回真或假,这个特殊的甲骨文将不得不修改输出量子位。如果我们通过\ \(刃{0}\)作为输出量子位,甲骨文可以简单地应用X门它如果输入符合条件;这样输出仍然是\ \(刃{0}\)如果输入“失败”,或\ \(刃{1}\)如果输入“成功”:

dj-1

这是一个完全有效的解释如何将古典甲骨文转化为量子函数,而且它很有意义。

它也不是我们要做的事情。

相反,我们要做的:

  1. 把输出量子位\ \(刃{1}\)在运行oracle之前状态。
  2. 如果输入“正确”,运用Z门量子位的输出。否则,别管它。

如您所料,知道输入是否“正确”的量子操作会涉及条件逻辑,这意味着控制盖茨。基本上oracle需要运行一个控制输出量子位Z——控制量子位的确切性质取决于甲骨文的实现,但是我们知道为了满足这种行为,它将不得不做一个控制Z:

dj-2

所以这样做的意义是什么?本质上,我们要迫使甲骨文阶段回扣对我们来说。而不是返回真或假对于任何给定的输入,它将输入的量子态是积极的还是消极的。如果国家消极,然后输入“正确”。自“目标”量子位(这里将输出量子位)\ \(刃{1}\)状态,应用控制Z不会缠绕控制量子位,但它将使阶段的控制项消极的。

解释为什么我们决定实现oracle作为一个阶段回扣函数而不是一个量子位翻转功能,是时候谈谈叫做deutsch - jozsa。

叫做deutsch - jozsa算法

叫做deutsch - jozsa量子算法,解决了整个constant-or-balanced问题利用叠加和干扰。在高级别上,它将输入到一个统一的叠加,所以检查所有可能的输入都是由oracle。这是通常被称为量子并行性,因为它有效地运行在所有的函数\ (2 ^ n \)同时输入。如果函数是常数,结果都不会彼此干扰,和输入寄存器将处于同样的状态,因为它最初。如果函数是平衡的,有一半的输入将会干扰另一半,和输入最终将在其他国家。检查输入是否处于原始状态函数运行后不容易,,告诉你是否oracle是恒定的平衡。

这里有一个线路图的算法:

dj-3

这个电路展示了量子算法最奇怪的事情之一:我们通常测量的输入函数后,运行时,而不是像我们的输出与经典计算机做使用。在这种情况下,我们实际上并不关心发生了什么目标点(事实上,它仍将在\ \(刃{1}\)状态函数运行后)。我们真正想知道的是怎么输入,根据阶段回扣和干扰引起的第二轮\ (H_{所有}\)运行在oracle之后。

它是如何工作的

该算法的关键是甲骨文保证常数或平衡。这个算法并不适合任何旧甲骨文;它只能如果我们知道一个事实,甲骨文是一个或另一个。为了证明为什么它的工作原理,让我们打开3-qubit Hadamatrix:

dj-4

如果我们开始状态\ \(刃{000}\)作为输入,然后在第一次\ (H_{所有}\)操作,我们知道它将在一个统一的所有可能状态的叠加。一个常数函数要么离开整个矩阵(因为它从不翻目标量子位),还是否定所有的矩阵中的行(因为它翻转每个输入状态)。现在,考虑在第二次会发生什么\ (H_{所有}\)操作:

dj-5

表中的每一列都同等数量的+和-,所以他们都将影响和相互抵消…除了\ \(刃{000}\)状态。的\ \(刃{000}\)状态是积极的(或所有负面的,如果oracle翻转所有的输入状态)这将只剩下状态非零振幅。如果是消极的,它只是意味着它有一个消极的全球阶段,所以它是一样有效的。

简而言之,如果我们开始\ \(刃{000}\)常数函数的状态,那么,我们将永远结束了\ \(刃{000}\)状态。它不会是叠加;如果我们测量\ \(刃{000}\)该算法完成后,我们100%知道这个函数是常数。

现在,考虑平衡函数会发生什么。准确输入将翻转目标量子位的一半。由于相位回扣,这意味着完全的一半输入叠加的条件会否定,这意味着我们可以翻转Hadamatrix中的一半的行。作为一个例子,让我们翻第一个四行:

dj-6

看看发生了什么\ \(刃{000}\)列:而不是全部为正,现在到底是一半的一半是积极的和负面的。换句话说,所有的\ \(刃{000}\)相消干涉的条件,所以它会有一个幅度为0。意外的是:因为原来的\ \(刃{000}\)列都是积极的,不管哪一行了。只要一半的,\ \(刃{000}\)国家总有0振幅由于量子干涉。

为了让这一切变得简单,如果我们开始\ \(刃{000}\)状态,然后对于平衡函数,我们永远不会最终测量\ \(刃{000}\)状态。可以是任何东西,包括一些奇异的叠加,但叠加不会包括\ \(刃{000}\)国家之一。至少一个量子位元的\ \(刃{1}\)当你测量它。

总而言之,当我们运行算法和测量量子比特输入寄存器中,如果其中任何一个\ \(刃{1}\),那么函数是平衡的。如果他们都是\ \(刃{0}\),那么这个函数是常数。就是这样。由于叠加和干扰,量子计算机可以回答这个问题在一个迭代。

实现

这里是实现叫做deutsch - jozsa算法的步骤:

  1. 应用H的所有输入量子位,导致一个统一的叠加\ \(刃{2 ^ n} \)可能的状态。
  2. 应用X的输出量子位,所以它是\ \(刃{1}\)状态。
  3. 在输入寄存器和输出运行oracle量子位。
  4. 应用H量子位的所有输入。
  5. 测量所有的输入量子位。如果他们都是\ \(刃{0}\),那么这个函数常数。如果输入的量子位\ \(刃{1}\),那么这个函数平衡

实验室5

不出所料,在实验室5个,你要实现叫做deutsch - jozsa连同几个甲骨文功能练习。玩得开心!


最后更新:2021年6月26日