【问题标题】:How to realize the Grover's Diffusion Operator in Q#?Q#中如何实现格罗弗的扩散算子?
【发布时间】:2018-12-13 21:42:30
【问题描述】:

如题所示,如何在 Q# 中实现 Grover 的扩散算子?我知道它被定义为2 ⟨s|s⟩ - I,其中|s⟩ 是任意数量的量子比特的统一状态。这可以进一步定义为夹在一对 H 门之间的 Z0(称为 U0)门。我无法在量子原语和佳能文档中找到以 Grover、diff 等可能的名称开头的任何函数。

我不想使用函数AmpAmpByOracle,因为它是非常高级的实现,并不清楚我的理解。我想实现一个函数,它需要一个 oracle Uf(我不知道)和它需要的量子比特数(N),并通过简单地遵循Grover's Algorithm | Wikipedia 中给出的电路来执行 Grover 算法,并通过测量所有r = approx(2^(N/2)) 次迭代结束时的 N 个量子比特。

【问题讨论】:

标签: quantum-computing q#


【解决方案1】:

扩散操作有点棘手。我发现把它分解成碎片最容易:

  1. 正如您所指出的,在 X 基中查看扩散操作要简单得多。如果将 H 应用于前后的每个量子位,则中间的均匀状态看起来像 000...0 状态。
  2. 扩散运算(在 X 基础上)在 000...0 状态下为 -1,在所有其他基础状态上为恒等式 (+1)。第一步是挑出 000...0 状态;我可以使用多控制 X 门来做到这一点——除了我需要先将所有量子位从 0 翻转到 1(反之亦然),因为受控操作寻找 1,而不是 0。当然,在受控的 X 之后,我需要撤消翻转。
  3. 要生成 -1,我可以从处于 |-> 状态的辅助开始,这样 X 会将其变为 -|->。
  4. 完成所有操作后,我需要重置 ancilla,以便将其返回 |0> 状态。

这一切都变成了:

// register is the Qubit[] that we want to apply the diffusion operation to
using (ancillae = Qubit[1])
{
  let ancilla = ancillae[0];

  X(ancilla); // Puts the ancilla into the |1> state
  H(ancilla); // And now into the |-> state

  ApplyToEach(H, register);  // Put the register qubits into the X basis
  ApplyToEach(X, register);  // Flip 0->1 and 1->0
  (Controlled X)(register, ancilla);  // Do the controlled flip of the ancilla
  ApplyToEach(X, register);  // Undo the flip
  ApplyToEach(H, register);  // Undo the basis change

  H(ancilla); // Put the ancilla back into |1>
  X(ancilla); // And back to |0> so we can return it
}

这是未编译的代码,所以可能有一些错别字...

【讨论】:

  • 只是为了稍微详细说明@Alan 的解决方案,在量子编程和 Q# 中很常见,特别是有通过 ? 转换寄存器,应用操作,然后撤消 ? 的模式。例如,在这里,您可以将大部分正文写成WithCA(ApplyToEachCA(BindCA([H; X]), _), (Controlled X)(_, ancilla), register),作为这种模式的形式化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 2021-02-08
相关资源
最近更新 更多