就像标题所述,如何在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个量子位。
答案 0 :(得分:4)
扩散操作有点棘手。我发现将其分解成碎片最简单:
全部变成:
// 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
}
这是未编译的代码,因此可能会有一些错别字...