运行以下简单的量子程序将Hadamard门应用于单个量子位时:
operation ApplyHadamard():()
{
body
{
using (qubits = Qubit[1])
{
H(qubits[0]);
}
}
}
我收到以下错误:
Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState: “发布的量子位不处于零状态。”
我正在使用Microsoft's tutorial,其中没有提及使该程序正常工作所需的其他任何内容。
我很欣赏Q#仍处于发布模式,但是如果有人找到解决方案,那将是非常不错的。
答案 0 :(得分:2)
此文档的后面几节Working with Qubits中包含此信息。
目标机器期望量子位立即处于|0⟩状态 释放之前,以便它们可以重复使用并提供给其他人
using
块分配。
考虑在量子计算机上运行程序:量子位的数量非常有限,您想在程序的其他部分重用已发布的量子位。如果到那时它们还没有处于零状态,它们可能仍会与尚未释放的量子位纠缠在一起,因此您对它们执行的操作可能会影响程序其他部分的状态。
当量子位超出其using
范围之外时,将它们自动重置为零状态也是危险的:如果它们与其他对象纠缠在一起,则对其进行测量以将其重置可能会影响未释放的量子位的状态,从而更改了程序的结果-开发人员没有注意到这一点。
要求量子位在释放之前必须处于零状态的要求旨在提醒开发人员再次检查是否已从量子位中正确提取了所有必要信息,并且不再与未释放的量子位纠缠在一起。
请注意,在释放qubit之前使用Reset
或ResetAll
并不是硬性要求。例如,在Deutsch-Jozsa算法中,算法的最后一步是测量除最后一个比特外的所有qubit。这意味着对于每个量子位,您已经知道它们的状态为|0⟩或|1⟩,并且您可以对处于|1⟩状态的量子位应用X门以将其转换为|0⟩,而无需调用{{ 1}}来再次测量它们。已知最后一个量子位处于|-⟩状态,可以通过应用H和X门将其转换为|0⟩。
答案 1 :(得分:1)
我找到了此here的解决方案。
事实证明,我需要释放qubit 来调用Reset(qubits[0])
。
根据documentation Reset()
执行以下操作:
给出一个量子比特,对其进行测量并确保其处于
|0⟩
状态,以便可以安全地释放它。
因此,显然在量子运算完成之前,该运算中使用的所有量子位都必须处于|0>
状态。