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

时间:2018-07-05 11:58:06

标签: quantum-computing q#

就像标题所述,如何在Q#中实现Grover扩散算子?我知道它的定义为/** * Check if the passed argument is an integer value. * * @param number double * @return true if the passed argument is an integer value. */ boolean isInteger(double number) { return number % 1 == 0;// if the modulus(remainder of the division) of the argument(number) with 1 is 0 then return true otherwise false. } ,其中2 ⟨s|s⟩ - I是任意数量的qubit的统一状态。这可以进一步用夹在一对H门之间的Z0(称为U0)门来定义。我无法在量子图元和佳能文档中找到任何以可能的名称(例如Grover,diff等)开头的函数。

我不想使用函数|s⟩,因为它是非常高级的实现,并且不清楚我的理解。我想实现一个函数,该函数采用一个oracle Uf(我猜想是未知的)和它所需要的qubit数(N),并通过遵循Grover's Algorithm | Wikipedia中给出的电路并通过以下方法测量所需状态来执行Grover算法:在r =大约(2 ^(N / 2))次迭代结束时测量所有N个量子位。

1 个答案:

答案 0 :(得分:4)

扩散操作有点棘手。我发现将其分解成碎片最简单:

  1. 正如您所指出的,以X为基础查看扩散操作要简单得多。如果将H应用于每个量子位的前后,则在中间,统一状态看起来像000 ... 0状态。
  2. 在000 ... 0状态下,扩散操作(以X为基础)为-1,在所有其他基础状态下,恒等式(+1)。第一步是选择000 ... 0状态;我可以使用多控制X门来做到这一点-除非我需要首先将所有qubit从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
}

这是未编译的代码,因此可能会有一些错别字...