首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Q#中实现Grover扩散算子?

如何在Q#中实现Grover扩散算子?
EN

Stack Overflow用户
提问于 2018-07-05 11:58:06
回答 1查看 553关注 0票数 5

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

我不想使用函数AmpAmpByOracle,因为它是非常高级别的实现,并且不清楚我的理解。我想实现一个函数,它需要一个oracle (我不知道)和它所需的量子位数(N),并执行Grover的算法,只需遵循Grover算法中给出的电路,并通过在r=大约x(2^(N/2))迭代结束时测量所有的N个量子位来测量所需的状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-08 17:12:05

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

  1. 正如你所指出的,看X基中的扩散操作要简单得多。如果你把H应用到每一个量子位的前后,那么在中间的均匀状态看起来就像000.0状态。
  2. 扩散运算(在X基中)是-1在000.0状态下,恒等式(+1)在所有其他基状态上。第一步是选择1000.0状态;我可以用多个受控的X门实现这一点--但我需要首先将所有的量子位从0翻转到1(反之亦然),因为受控操作查找的是1s,而不是0。当然,在被控制的X之后,我需要撤销翻转。
  3. 要生成-1,我可以从ancilla开始,它处于can >状态,这样X就会将它转换为-\->。
  4. 完成所有操作后,我需要重置ancilla,以便在|0>状态下返回它。

这一切都变成:

代码语言:javascript
复制
// 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
}

这是未编译的代码,所以可能会有一些排印.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51190773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档