我将如何在Deutsch算法中实现量子预言?


13

我正在尝试模拟Deutsch的算法(Deutsch-Josza算法的基本情况),但我不确定要如何实现实现该算法功能所需的量子预言,而又不违背算法的目的和“看起来”通过评估功能确定输入的功能是什么。



为什么不每次运行测试时都随机选择它?这样你就不知道了。
DaftWullie

@DaftWullie您是指在每次模拟中随机选择一个函数吗?仍然存在问题,即计算机必须通过量子预言机知道输入功能的输出是什么,以便创建所需的功能。
杰克·塞罗尼

是的,计算机需要知道,但是您可以将其本地化为一个函数,该函数以量子状态作为输入,并以量子状态作为输出。只有那个函数会知道它(有些必须知道)。而且,如果随机选择在该函数中是局部的,并且每次调用都不同,那么就可以选择只调用一次。
DaftWullie '18

@DaftWullie如果您计算随机函数的属性,为什么不立即产生随机输出呢?
诺伯特·舒奇

Answers:


9

这里有两个问题。第一个问题询问您可能如何在代码中实际实现此目标,第二个问题询问您是否知道要传递的预言。

实作

最好的方法可能是创建一个IsBlackBoxConstant将oracle作为输入的函数,然后运行Deutsch Oracle程序来确定它是否恒定。如果需要,您可以随机选择Oracle。这是在Q#中实现的:

operation IsBlackBoxConstant(blackBox: ((Qubit, Qubit) => ())) : (Bool)
{
    body
    {
        mutable inputResult = Zero;
        mutable outputResult = Zero;

        // Allocate two qbits
        using (qbits = Qubit[2])
        {
            // Label qbits as inputs and outputs
            let input = qbits[0];
            let output = qbits[1];

            // Pre-processing
            X(input);
            X(output);
            H(input);
            H(output);

            // Send qbits into black box
            blackBox(input, output);

            // Post-processing
            H(input);
            H(output);

            // Measure both qbits
            set inputResult = M(input);
            set outputResult = M(output);

            // Clear qbits before release
            ResetAll(qbits);
        }

        // If input qbit is 1, then black box is constant; if 0, is variable
        return One == inputResult;
    }
}

重点是什么?

查询复杂度

计算复杂度是涉及根据算法消耗的资源量(作为输入大小的函数)对算法进行分类的领域。这些资源包括时间(按步骤/指令衡量),内存以及称为查询复杂度的内容。查询复杂度与算法查询黑匣子oracle函数的次数有关。

n2n1

2n1

实际应用

如果您不是复杂性理论家,那么您可能不太在乎查询的复杂性,而是想知道为什么Deutsch oracle问题在“无规则”世界中很重要,在该世界中您可以查看黑匣子。试图将一个Oracle问题作为非Oracle问题来分析是很困难的,而且我不相信任何人都可以通过分析oracle电路来解决Deutsch Oracle问题的最佳经典算法问题。您可能会想-有什么要分析的?只有四个可能的电路!实际上,它要复杂得多。

如果我们看一下一位Deutsch Oracle 的最简单表示形式,则门的构造如下:

C1,0

X0C1,0

I4

X0

但是,这些绝不是实现预言的唯一方法。所有这些都可以使用成百上千,甚至数百万个逻辑门来重写!重要的是这些逻辑门的累积效应等效于上述简单构造。考虑以下常量1的替代实现:

H0Z0H0

事实证明,对于您可以提供的任何输入:

H0Z0H0|ψ=X0|ψ

H0Z0H0X0

H0Z0H0=[12121212][1001][12121212]=[0110]=X0

因此,我们有:

(H0(Z0(H0|ψ)))=(((H0Z0)H0)|ψ)=X0|ψ

H0Z0H0X0

由于历史和教学原因很重要

首先,出于历史和教学原因,Deutsch Oracle问题非常重要。这是第一个教给学生的算法,因为它是最简单的算法,并且只要您不问太多问题,它似乎就可以证明量子加速。它也是学习Simon的周期问题和Shor算法的良好起点。


在Gotteman-Knill之前,我一直陪着你。为什么将复杂的电路限制为(i)一量子位门和(ii)稳定器门?
诺伯特·舒奇

据我了解,有有效的算法来确定任意量子电路是否实现了几种简单的经典电路之一。正在研究具有量子优势的随机电路需要更复杂的行为。
ahelwer

我不认为这是真的。如果我没记错的话,问两个电路是否做相同的事情就可以完成QMA。只有您对Clifford门的限制才可以通过Gottesman-Knill进行模拟。
诺伯特·舒奇

没错,我将进一步研究电路简化,然后更新我的文章以阐明Gottesman-Knill的作用。
ahelwer

在通过电子邮件向Robin Kothari提出了一些问题之后,我更新了答案。
期待

3

没有办法以不会破坏Deutsch算法的观点的方式来构建Oracle,这就是为什么它是基于Oracle的算法。

xf(x)f(0)=f(1)

f(x)1xNf(x)yf(x+y)=f(x)f(x)

因此,要点是,基于oracle的算法证明,如果您对该结构有问题(例如,您只想了解函数的某些特定属性),则可以加快速度,但是并不能告诉您是否存在这样的问题。

因此,如果您想实现Deutsch,则任何执行oracle的方法都可以-它是一种“原理证明”算法,不会对实际问题产生实际的提速(至少我们没有人知道)。



2

我没有适用于Deutsch算法的示例,但是这里此处有两个教程,它们将引导您实现Deutsch-Jozsa算法以及它在Q#中使用的oracle。

这两种算法的想法是相同的:您必须向算法提供oracle作为在其他地方实现的操作。这样,该算法不知道它是由哪个Oracle提供的,除了调用它之外,没有其他方法可以“查看”该Oracle。这些教程还具有一个工具,可以计算调用oracle的次数,因此,如果您的解决方案多次调用oracle,则测试将失败。

诚然,这仍然是oracle算法经常遇到的一个问题:人们可以查看测试和oracle的实现,并通过弄清楚哪个oracle被实现来找出答案。正如DaftWullie所建议的,这可以通过随机化Oracle选择来解决。


1

我认为,ahelwer答案是我们思考算法复杂性的某些方式。但是-鉴于我们在现实世界中确实没有想要查询的“ oracle”,您可能想知道为什么我们要担心查询的复杂性或根本没有oracle的想法。我将尝试对此提供一些观点,尤其是描述您如何试图以一种好像您在作弊的方式来思考构建“ Deutsch-Josza oracle”的方法。

(正如Norbert Schuch指出的那样,对于作为Deutsch-Josza的基本情况的Deutsch问题,没有太多见识的余地,但是我希望您关于oracle的问题也能更普遍地适用。这就是我在这里要说的。)

关于甲骨文的直觉

甲骨文的概念是一种使自己简化我们谈论计算问题的方式。

甲骨文概念的最初应用是假设地考虑如果可以解决困难的问题,甚至是不可能的问题,而又不致力于原则上怎么做,该怎么办。但是 如今,在计算复杂性方面,尤其是在量子计算中,例如在Deutsch-Josza,Bernstein-Vazirani和其他Oracle问题的情况下,情况有所不同:Oracle描述了作为问题基础的函数。它是一个“甲骨文”的事实是一种构造我们如何描述问题中心的函数的方式:不是我们绝不能考虑函数的计算方式,而只是不提供此信息问题,并且我们不关心与该功能相关的时间或其他复杂性。

当我们采用这种方法时,我们实际上可以获得与计算中非常困难的问题有关的答案。例如,你可能知道,我们不知道如何证明无论是P  ≠  NPP  =  NP,但我们可以表明,有预言一个这样的,我们可以证明,P  ≠  NP 一个。oracle A在这里所做的事情并不能帮助计算机(更确切地说是确定性Turing机器或非确定性Turing机器)解决问题-它代表了计算机必须解决的问题。我们可以在某些情况下证明P A的事实 ≠  NP ,并不意味着P真的从不同的NP:那只是用了不确定性,那只是意味着是真正为计算模型的显著资源有-它可以让你有效地解决一些问题,没有办法通常可以在确定性计算机上有效地模拟不确定性。因此,如果您想解决与A计算有关的问题,则绝对需要一些有关可以有效计算A的函数的结构的信息。

这是oracle的主要内容之一:当向您提供有关问题的有限信息时,它们使您可以讨论计算模型可以解决问题或不能解决问题的方式。

使用Oracle算法解决非Oracle问题

原则上,Deutsch–Josza算法或Bernstein–Vazirani算法不是为自己而执行的算法。(嗯,不是真的 -请参阅下一节。)它们代表您可以解决问题的方式。他们解决什么问题?它们使您能够发现您感兴趣的函数的某些功能-是恒定的还是平衡的,或者矢量上某些标量值线性函数中关联的矢量。

您执行什么功能?—您可以对答案感兴趣的任何功能执行它们。

这些作为基于oracle的算法的描述就不重要了。甲骨文的问题基本上使您知道,使用理想的量子计算机,即使您对功能知之甚少,也可以解决问题,前提是您可以实际有效地评估功能。当然,要实际评估该功能,您将需要有关如何执行此操作的描述,因此与oracle设置相比,您拥有更多的信息。但这并不能阻止您使用相同的算法。

当您拥有比oracle设置更多的信息时,会发生突然的事情,您可能会通过其他方法来解决问题。特别地,有可能经典地有效地解决问题。(这是相同的观察与P  ≠  NP :它证明了有问题,这是在NP,其中任何有效的确定性算法将至少需要实际的结构信息,以便能够解决- ,以便当您提供描述一个有效的可计算功能而不是“ oracle”,问题可能出在P。)这意味着在解决您遇到的特定问题时,量子算法可能不会比经典算法具有相同的优势-实际上,这可能是经典方法更好(尤其是对于我们目前拥有的设备)。

最后,仅因为您具有解决某些问题的量子算法,并不意味着它一定是解决问题的最佳方法。Deutsch-Josza算法确实是这样:即使在oracle设置中,使用随机性也几乎一样好,并且鉴于我们还没有大型可靠的量子计算机,它会更好!但话又说回来...

“实施”一个神谕

实现Deutsch-Josza算法的目的与实现“ Hello,World! ” 的目的相同-并不是要解决紧迫的未解决问题,而是要练习使用您期望对其他事情有用的工具。

练习编码,你应该感到完全放松,舒适与想法实现的预言,并与计算机的想法评估了Oracle。原则上,这就是您要做的事情。即使您使用的是经典仿真器,在经典仿真器中经典计算机实际上正在评估叠加的所有分支,并因此明确地找到问题的答案,以便假装它是量子计算机,其运行方式略为round回。没错-您正在练习如何使用一种对其他事情可能有用的工具,并且有一天不会在经典计算机上运行。

那么,您应该如何实施Oracle?

(i)如果您真的致力于练习,那就不必假装自己在做任何神奇的事情。提出任何实现oracle函数的方法,即使对于偶然的观察者来说显而易见的是结果是恒定的还是平衡的也是如此。您只是在尝试实现算法-不用担心有人会指责您是骗子,您是在假装治愈癌症,但实际上是在玩Lego。你永远假装治愈癌症,而你通过深思熟虑的选择与乐高玩。拥抱并做到这一点。

f(x)=g(x,r)rg(x,r)xr,而且在经典解决方案上尚不明显的地方,这并非易事。

  • g(x,r)=xrx,r{0,1}ng(x,r)f(x)f(x)r0

  • 可以想象,可以对上述结构进行详细说明/混淆,以获得一种保证可以评估常数函数或平衡函数的结构,并且这两种情况中哪一个并不明显甚至很难实现,但我可以做到这一点。现在想不到如何。

请记住,这实际上很难做到,但是,如果您看到一种解决方法,那将是非常值得的:Bravyi,Gossett和Koening为Bernstein-Vazirani问题做了类似的事情,它允许他们展示了量子复杂度与经典复杂度之间的微小但无条件的分离,这是过去几年中量子复杂度发生的更有趣的事情之一。

TL; DR

  • 不要为您正在“评估”一个预言而感到汗颜。

  • 如果您不知所措,则只担心对功能的实际描述可能无需量子计算机即可轻松解决同一问题。

  • 如果您的动机只是为了练习量子编程,那么甚至不必担心。不必担心更严重的问题,例如全球变暖。同时,您可以在乐高积木中玩乐高玩具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.