在 Q# Quantum 开发工具包中出现错误 "Released qubits are not in zero state"

Getting error "Released qubits are not in zero state" in Q# Quantum Dev kit

当运行以下简单的量子程序将阿达玛门应用于单个量子位时:

operation ApplyHadamard():()
{
    body
    {
        using (qubits  = Qubit[1])
        {
            H(qubits[0]);
        }
    }
}

我收到以下错误:

Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState: 'Released qubits are not in zero state.'

我正在使用 Microsoft's tutorial,其中没有提及使此类程序正常工作所需的任何其他内容。

非常感谢 Q# 仍处于发布模式,但如果有人为此找到解决方案,那就太好了。

我找到了这个 here 的解决方案。

原来我需要释放调用Reset(qubits[0])的量子位

根据 documentation Reset() 执行以下操作:

Given a single qubit, measures it and ensure it is in the |0⟩ state such that it can be safely released

显然,在量子操作完成之前,操作中使用的所有量子位都需要处于 |0> 状态。

文档在几节后的 Working with Qubits 中提供了此信息。

Target machines expect that qubits are in the |0⟩ state immediately before deallocation, so that they can be reused and offered to other using blocks for allocation.

考虑运行量子计算机上的一个程序:量子位的数量非常有限,你想在程序的其他部分重用释放的量子位。如果到那时它们还没有处于零状态,它们可能仍然与尚未释放的量子比特纠缠在一起,因此您对它们执行的操作可能会影响程序其他部分的状态。

当量子位超出其 using 块的范围时,将它们自动重置为零状态也很危险:如果它们与其他人纠缠在一起,测量它们以重置它们可能会影响未释放的状态量子比特,从而改变程序的结果——而开发者却没有注意到这一点。

要求量子比特在释放之前应处于零状态旨在提醒开发人员仔细检查是否已从量子比特中正确提取所有必要信息,并且它们没有与未释放的量子比特纠缠在一起没有了。

请注意,在发布量子位之前使用 ResetResetAll 并不是硬性要求。例如,在 Deutsch-Jozsa 算法中,算法的最后一步是测量除最后一个之外的所有量子位。这意味着对于这些量子位中的每一个,您已经知道它们的状态是 |0⟩ 或 |1⟩,并且您可以对处于 |1⟩ 状态的量子位应用 X 门以将它们转换为 |0⟩ 而无需调用 Reset 再次测量它们。已知最后一个量子位处于 |-⟩ 状态,您可以通过应用 H 和 X 门将其转换为 |0⟩。