Q# 如何在不破坏量子位状态的情况下读取它?

How can Q# read the qubit state without destroying it?

第一个Q#代码示例提供了一个方法"Set",写法如下(link):

operation Set (desired: Result, q1: Qubit) : ()
{
    body
    {
        let current = M(q1);
        if (desired != current)
        {
            X(q1);
        }
    }
}

此方法将量子位设置为所需值。为此,测量量子比特值,如果该值与预期不同,则量子比特状态为 "swapped".

但是在量子物理学中,你无法在不破坏粒子的情况下测量它。这是本书的引述 "Quantum Computation and Quantum Information":

... measurement changes the state of a qubit, collapsing it from its superposition of |0> and |1> to the specific state consistent with the measurement result. For example, if measurement of |+> gives 0, then the post-measurement state of the qubit will be |0>.

但是使用 Q# 可以测量一个量子位并继续使用它。

为什么Q#语言可以让我们实现现实中不可能实现的操作?

提前感谢您的回答。

我认为回顾一下你引用 Nielsen 和 Chuang 的话可能会有所帮助:

For example, if measurement of |+⟩ gives 0, then the post-measurement state of the qubit will be |0⟩.

也就是说,量子比特并没有被测量破坏,但是为了使量子力学保持一致,它在测量之后的状态必须与我们测量的一致(这种一致性要求有时被非正式地称为 "collapse"). 在您的 Q# 示例中,如果我们从对 M 操作的调用中获得 Zero,那么我们就知道量子位处于 |0⟩ 状态,正如 Nielsen 和 Chuang 所描述的那样。 另一方面,如果我们从对 M 的调用中得到 One,我们知道量子位处于状态 |1⟩ = X |0 ⟩,因此我们需要应用另一个 X 门才能返回 |0⟩。 (注意:如果您的量子比特存储为光子,那么讨论可能看起来非常不同——很难测量光子而不将其吸收到 material 中。可以使用 quantum nondemolition 来完成 测量,但这完全是另一个话题。Q# 假设量子位可以按照您引用 Nielsen 和 Chuang 所描述的方式进行测量,而不是通过光子吸收进行测量。)

以此为背景,Q# 经过精心设计,仅允许在实验实践中实现的测量。 尽管如此,能够使用经典模拟器以一种在实际量子设备上不可能实现的方式来探测某些量子比特的状态通常是非常有帮助的。 您可以通过两种主要方式在 Q# 中执行此操作。 首先,您可以使用 AssertQubit 之类的断言来编写单元测试,如果量子位未处于预期状态,该单元测试将失败。 其次,您可以使用 Microsoft.Quantum.Diagnostics namespace 中的函数来要求模拟器转储它具有的诊断信息,例如它使用的状态代表您的 Q# 程序使用的量子位。 在实际硬件上,诊断信息可能看起来非常不同。