作者:心在流血谁懂 | 来源:互联网 | 2022-12-08 14:29
第一个Q#代码示例提供一种方法“ Set”,其编写方式如下(链接):
operation Set (desired: Result, q1: Qubit) : ()
{
body
{
let current = M(q1);
if (desired != current)
{
X(q1);
}
}
}
该方法将量子位设置为所需值。为此,将测量qubit值,如果该值与预期值不同,则将“交换” qubit状态。
但是在量子物理学中,如果不破坏粒子就无法测量粒子。这是《量子计算和量子信息》一书的引文:
...测量会更改量子位的状态,使其从| 0>和| 1>的叠加变为与测量结果一致的特定状态。例如,如果| +>的测量结果为0,则qubit的测量后状态将为| 0>。
但是使用Q#可以测量一个量子比特并继续使用它。
为什么Q#语言允许我们实现实际上不可能的操作?
预先感谢您的回答。
1> Chris Granad..:
我认为回顾一下尼尔森和庄的报价可能会有所帮助:
例如,如果测量| +?给出0,则量子位的测量后状态将为| 0?。
也就是说,量子位不会被测量破坏,但是为了使量子力学保持一致,测量之后的状态必须与我们所测量的一致(这种一致性要求有时被非正式地称为“崩溃”)。在您的Q#示例中,如果我们Zero
从对M
操作的调用中获得a ,那么我们知道qubit在| 0中?正是Nielsen和Chuang所描述的。另一方面,如果One
从对的调用中获得a M
,则我们知道qubit处于| 1?= X | 0 ?,因此我们需要应用另一个X门回到| 0?。(注意:如果您的量子位以光子形式存储,那么讨论可能会大不相同-在不吸收光子的情况下很难测量光子。这可以使用量子非爆破测量来完成,但这完全是另一主题。 #假设可以按照您对Nielsen和Chuang的描述所描述的方式来测量量子位,而不是以光子吸收来测量。)
在这种情况下,Q#经过精心设计,仅允许在实验实践中可以实现的测量。但是,能够使用经典的模拟器以某些实际量子设备无法实现的方式探测某些量子位的状态通常非常有用。在Q#中,有两种主要的方法可以做到这一点。首先,可以使用断言AssertQubit
来编写单元测试,如果qubit不在预期状态,则单元测试将失败。其次,您可以使用Microsoft.Quantum.Diagnostics
命名空间中的函数要求模拟器转储其具有的诊断信息,例如,其使用的状态表示Q#程序使用的qubit。在实际硬件上,诊断信息可能看起来非常不同。