在Q#量子开发工具包中,出现“已释放的量子比特不处于零状态”的错误。

3
当运行以下简单的量子程序以将Hadamard门应用于单个量子比特时:
operation ApplyHadamard():()
{
    body
    {
        using (qubits  = Qubit[1])
        {
            H(qubits[0]);
        }
    }
}

我遇到了以下错误:

Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState: '已释放的量子比特不在零状态。'

我正在使用微软的教程,但其中没有提到需要其他任何东西来使这样的程序工作。
我很感激Q#仍处于发布模式,但如果有人找到解决方案,那将是太棒了。
2个回答

3
文档中稍后的几个部分,Working with Qubits,有这些信息。
目标机器期望在解除分配之前 qubit 立即处于 |0⟩ 状态,以便可以重新使用并提供给其他 using 块进行分配。
考虑在量子计算机上运行程序:qubit 的数量非常有限,您希望在程序的其他部分中重用释放的 qubit。如果此时它们不是零状态,它们可能仍与尚未释放的 qubit 相互纠缠,因此您对它们执行的操作可能会影响程序其他部分的状态。
当 qubit 超出其 using 块的作用域时自动将其重置为零状态也是危险的:如果它们与其他 qubit 相互纠缠,则测量它们以重置它们可能会影响未释放 qubit 的状态,从而改变程序的结果 - 开发人员可能没有注意到这一点。
要求 qubit 在释放之前应处于零状态,旨在提醒开发人员再次检查是否已正确提取了所有必要的信息,并且它们不再与未释放的 qubit 相互纠缠。
请注意,在释放 qubit 之前使用 ResetResetAll 不是硬性要求。例如,在 Deutsch-Jozsa 算法中,算法的最后一步是测量除最后一个 qubit 外的所有 qubit。这意味着对于其中每个 qubit,您已经知道它们的状态是 |0⟩ 或 |1⟩,并且可以对处于 |1⟩ 状态的 qubit 应用 X 门将其转换为 |0⟩,而无需调用 Reset 再次测量它们。最后一个 qubit 已知处于 |-⟩ 状态,您可以通过应用 H 和 X 门将其转换为 |0⟩。

2
我在这里找到了解决方案 结果证明,我需要通过调用Reset(qubits[0])来释放量子比特 根据文档Reset()执行以下操作:

给定一个单量子比特,对其进行测量并确保其处于|0⟩状态,以便可以安全地释放

因此,在量子操作完成之前,所有使用的量子比特都需要处于|0>状态。

2
这里有一个使用Reset的示例:https://github.com/Microsoft/Quantum/blob/b0ec52d5ad6c19da8de480689c69963e660643c3/Samples/Teleportation/TeleportationSample.qs#L64,以及如何使用ResetAll:https://github.com/Microsoft/Quantum/blob/b0ec52d5ad6c19da8de480689c69963e660643c3/Samples/Teleportation/TeleportationSample.qs#L108 - Daan
1
令人困扰的是,这里有一个using块,通常意味着该对象将自动清理。然而,在Q#中,它并没有完成其工作。 - Hakanai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接