用Q#介绍量子计算– Part 17, Grover’s algorithm

上次我们基于格罗弗查看了量子搜索背后的基本理论'S算法。我们经历了最基本的案例,一个由四个项目组成的数据集,并将算法应用于该算法,在其设法找到我们在一步中寻找相关条目的过程中的学习–与经典计算理论所需的平均预期2.25步骤相比。

在这方面,我们将看看格罗弗背后更一般的理论'S算法,并实现了常规Q#变体,可用于在任意大数据集中找到任何数字。

奥卡克斯再次

就像我们早期讨论的情况一样基本的德意志's problemDeutsch-Jozsa.算法,一般格罗弗的理论模型 'S算法基于Oracle函数的概念,用于确定解决问题的方法。事实上,在量子信息理论中存在一类这类Oracle的问题。

在我们的情况下–在干草堆中找到众所周知的针,或者在未蚀刻的数据集中找到众所周知的问题–Oracle是验证函数$ f(x)$,它决定了我们是否找到了预期的结果。假设我们想找到$ y $。然后,验证函数以下列方式返回1(true)或0(false):

$$
f(x)=
\ begin {案例}
1 &\文本{} x = y \\时
0 &\文本{何时} x \ neq y \\
\结束{案例}
$$

此外,Oracle需要使用额外的辅助QUBET称为“oracle qubit”。 Oracle Qubit的存在允许可逆性的计算,这由量子力学规律授权。因为存在ancilla qubit,oracle'S转换可以概括为:

$$
\ ket {x} \ ket {y} = \ ket {x} \ ket {y \ oplus f(x)}
$$

在哪里

$$ \ ket {x} = \ ket {0 ^ {\ otimes n}} $$

换句话说,Oracle中的输入可以是一个任意$ n $ qubit状态$ \ ket {x} $,并且如果$ f(x)$返回true,则单个Oracle qubit $ \ Ket {y} $。 。

格罗弗's algorithm theory

格罗弗的建设'S算法在其初始阶段,算法或确实匹配,或者确实匹配Deutsch-jozsa算法。这样,算法的准备步骤将包括创建所有输入Qubits的统一叠加。此外,我们将依赖于我们使用的完全相同的反馈技巧Deutsch-Jozsa.算法,允许我们将Oracle Qubit上的符号的变更转换为$ \ Ket {x} $的相移。对于阶段反击来工作,Oracle Qubit需要处于初始状态$ \ KET {1} $而不是通常$ \ KET {0} $,并且它也需要在叠加中。

我们可以描述以下代数转换链中的整个预备程序,其中$ \ ket {x} $是夸张数量的qubits,$ \ ket {1} $是ancilla qubit:

$$
\ ket {\ psi_1} =(w \ otimes h)\ ket {x} \ ket {1}
$$

正如我们已经学到的那样,这会产生以下状态:

$$ \ ket {\ psi_1} = \ frac {1}} \ sum_ {2 ^ n}} \ sum_ {x \ in \ {0,1 \} ^ n} \ ket {x} \ ket { - }
$$

它通常使用$ 2 ^ n = n $,而且因为它,我们可以重写$ \ ket {\ psi_1} $:

$$ \ ket {\ psi_1} = \ frac {1} {\ sum_ {n}} \ sum_ {x = 0} ^ {n-1} \ ket {x} \ ket { - }
$$

这为我们提供了我们与我们合作的基础件–输入到Oracle中的输入,呼叫接下来。如果使用符号$ u_f $ for Oracle,请记住它实现了上面的$ f(x)$函数定义,我们到达州$ \ ket {\ psi_2} $:

$$ \ ket {\ psi_2} = u_f \ ket {\ psi_1}
$$

这导致我们到了以下状态,包括我们已经从Deutsch-jozsa算法中了解的相位回路:

$$ \ ket {\ psi_2} = \ frac {1} {\ sum_ {n}} \ sum_ {x = 0} ^ {n-1}( - 1)^ {f(x)} \ ket {x} \ ket { - }
$$

由于阶段反思,这是量子力学所采用的数学形式主义的线性度的结果,全局标志变为减去。因此,甲骨文说“mark”搜索问题的解决方案,因为它改变了量子状态的全局阶段。这方面的副作用是,Oracle Qubit实际上保持不变,因为它的翻转结束了转换为全局相移,并保持在状态$ \ Ket { - } $。因此,我们实际上能够从这一点忽略它,因为它从剩下的计算中不受欢迎。

虽然使用该阶段的答案的标记非常有帮助,但随着我们在最后一部分中学到的,概率幅度仍然不变,这意味着我们尚未更接近读出正确的解决方案。因此,下一步骤是执行关于平均值的反转,这将允许我们放大标记解决方案的概率幅度。

要做,让'S考虑我们如何正式确定平均程序的反转。我们上次讨论了它,具有四个概率幅度的简单示例–其中三个等于$ \ FRAC {1} {4} $和应用相移,具有相反的标志$ - \ FRAC {1} {4} $。让'现在概括了这个数学。如果我们考虑在一些较大的数据集中的平均值和$ v $中的均值,我们将想要倒置均值,以获得倒置结果$ v'$可以表示为:

$$ V.’ = m + (m – v) = 2m – v
$$

我们必须强调在我们的搜索问题的量子版本中,我们不符合一系列宽松的数字,而是单一的多维矢量。因此,我们可以将上述公式中的,以下列代数表示,其中$ M $是找到载体均值的矩阵'S组件,$​​ i $是身份矩阵和$ v $和$ v'$是多维矢量。

$$ V.’ = V(2M – I)
$$

我们现在处于定义算法的下一步,所谓的格罗弗扩散操作员。它可以实现为条件相移$ p $,包围$ w $($ h ^ {\ otimes n} $)转换。条件相移将留下$ \ KET {x} $的标志,如果它等于$ 0 ^ n $,并在所有其他情况下翻录。

$$
p = \ ket {x} \ lightarrow
\ begin {案例}
\ ket {x}&\文本{} x = 0 ^ n \\
- \ ket {x}& \text{otherwise}
\结束{案例}
$$

因此,我们可以编写$ p $的定义为:

$$
p = 2 \ ket {0 ^ n} \ bra {0 ^ n}– I
$$

$ \ ket {a} \ bra {b} $ sygtax在这里使用的是代数外产品。通过在$ P $之前和之后应用$ W $转换,我们获得扩散操作员的最终定义$ D $:

$$ wpw = 2 \ ket {\ varphi} \ bra {\ varphi}– I = D
$$

其中$ \ varphi $表示所有输入状态的统一叠加。对于我们的理论模型的格罗弗 'S算法$ \ Ket {\ varphi} $由州$ \ ket {\ psi_2}表示–oracle $ u_f $的应用后的状态。我们已经在那个点处于统一的叠加中,其中一个具有相变的项目。这允许我们制定州$ \ Ket {\ psi_3} $:

$$ \ ket {\ psi_3} = d \ ket {\ psi_2}
$$

如已经陈述的,扩散操作员反转围绕平均值的概率,从而放大它们,并增加了读出正确结果的经典概率。

一起,$ d $和$ u_f $,弥补所谓的格罗弗迭代,$ g $。

$$ g =(2 \ ket {\ varphi} \ bra {\ varphi}– I)U_f = DU_f
$$

在上一篇文章的简单4元素数据集示例中,单个格罗弗迭代已经足以获得概率等于1的答案–我们可以继续进行测量过程。但是,在数据集的情况下,我们需要重复大约$ \ sqrt {n}的格罗弗迭代。随后的迭代,以及Oracle $ u_f $和dimuction $ d $的应用程序进一步放大概率–直到一定程度,之后概率开始降低,我们不能进一步放大。更精确,该过程是周期性的,并且在一定量的扩增后它将开始改善结果。虽然研究这一点超出了这篇文章的范围,但虽然学习,但恰恰是最合适的格罗弗迭代的几何方式。

总而言之,在$ k $施加足够的次数后,我们可以在$ \ ket {x} $上执行测量,这应该向我们提供具有非常高的概率的正确结果。让's重新覆盖整个程序:

  1. 准备州$ \ Ket {00.. 0} $
  2. 应用W变换以创建统一的叠加
  3. 使用州$ H \ KET {1} $的额外辅助QUBET应用标记操作(Oracle)$ U_F $
  4. 应用关于平均值的反演(扩散)$ D $
  5. 重复步骤3和4约$ \ sqrt {n} $次
  6. 测量Qubits以获得具有非常高的概率的结果

q#实现

在本节中,配备了从本岗位的理论部分的新获得的理论知识,我们将经历更先进的格罗弗'搜索实施而不是我们所做的上一篇文章。但是,我们将在此处使用该代码的某些部分。

我们将首先引入Q#操作的一般概要,该概述将在任意数量的Qubits上执行GROVER搜索,以获得任意标记的结果。下面的代码段显示了如此高级结构,它准备了初始状态的统一叠加,并包含已使用$ little endian $寄存器的必要测量,以及使用$ microsoft.quantum的$ medureinteger $操作将直接转换为整数。算术$名称空间。我们还将迭代量定义为可以手动定义的东西,因为如我们所说,准确计算这不是本帖子的范围。

剩下的是实现格罗弗迭代的实施– both the “marking”将作为甲骨文和幅度放大的部分。目前,为简单起见,我们可以在单个循环定义中实现所有内联。

在最后一个帖子中,我们使用$ CZ $转换来翻转标志(“mark”)$ \ KET {11} $ State的阶段,然后我们通过应用相关的$ x $转换手动将阶段移动到对我们感兴趣的数字上。这很容易使用一组if语句来完成,因为我们只处理2位整数。这里,由于我们支持任意数量的比特(因此,Qubits),我们需要概括该解决方案。为此,我们可以实现以下步骤:

  1. 拍摄我们想要标记的整数(“the solution”)并产生它的二进制表示–布尔数组,具有与Qubit寄存器的长度相同的长度。让's call this “解决方案二进制阵列”
  2. Use the 解决方案二进制阵列 to apply $X$ transformation to our quantum register at every index in which the 解决方案二进制阵列 has a bit value 0. This creates for us the state $\ket{11..1}$
  3. 申请$ CZ $键翻转它的阶段
  4. 应用与步骤2中相同的计算。这将撤消该操作并将我们返回到应用费用之前的状态,并使用$ CZ $的阶段翻转到解决方案

之后,我们可以在前面的帖子中施加幅度放大,我们可以重复整个过程所需的次数–即$ \ sqrt {n} $次。

使用上述配方线性写入的整个格罗弗迭代在下面的片段中显示:

此代码段现在可以插入前面的代码示例中,以生成操作的最终版本:

我们可以测试解决方案是否有效,通过将入口点实现到我们的Q#程序,该程序调用操作并在相关参数中传递来配置格罗弗搜索。例如,以下代码段在四个Qubits上运行搜索–其中数据集的范围为0到15,10作为标记的数字。

虽然我们赢了'T在这里计算出来,在第3次迭代之后,读出10等于96.1319%的概率,我们很可能读出10并查看:

如果我们将数据设置为10 QUBits,则数据范围会增长到1024值。

在那种情况下$ \ sqrt {n} = 32 $,但最佳的迭代量实际上是25,当读取我们标记值的概率为99.9461%时。

最后,我们可以通过利用Q#的一些功能来改进我们的代码。首先,可以提取标记代码和幅度放大来对独立操作来提取,以减少杂乱。

首先让我们'S用幅度放大码确实如此。在这里,我们还可以利用共轭Q#的功能。如果我们有转型$ v $,它被转换为$ u ^ \ dagger $和$ u $,或者相当特定的转换$ u $及其反向,我们可以使用$申请…在$ Q#的语法中,为方便起见。因此,而不是写作:

我们可以写:

因此,我们的放大操作将如下所示:

此外,结果表明,Q#已通过$ Microsoft.Quantum.arcometic $的$ IstricalaboutInger $操作提供相关内置功能以执行整数的标记。这意味着我们不再需要手动执行它,而是可以依赖语言特征。

将所有这一切考虑在内,我们可以将整个代码总结到以下操作,可以从Q#程序中调用与初始变体相同的方式。

在执行此代码时产生的结果应与上一个版本相同,具有较明显的优势,即代码现在更加简洁。

概括

在这篇文章中,我们推广了格罗弗'S算法并在Q#代码中提供了它。我们测试了一些简单数据集的算法,并且通常应该对结果进行满意,因为它们在经典同行中提供了相当大的加速。

我们可以通过Quantum搜索与David Mermin非常有洞察力的报价一起删除's ,它提供了一点洞察,因为今天使用的这种搜索方法的可能使用情况'S量子硬件。即使问题通过格罗弗定义的问题通常被定义为“database search”,Mermin提醒我们:

然而,使用作为Qbits的珍贵资源,仅仅储存经典信息将是疯狂的,鉴于我们目前的甚至我们目前的制造Qbits的能力才是奢侈的。找到一个独特的解决方案 - 或少数解决方案之一(…) - 对于一个艰难的数学难题似乎是一个更有前途的应用。

这当然没有'T使这种技术无用,但突出了这一事实,即使用量子硬件的当前输入/输出限制,格罗弗'S搜索最适合于在存储器中人工创建数据集的问题类别(例如,数字范围)。

我们将继续在本系列的下一部分中查看量子算法!