为什么量子估算器说我在Q#中不使用任何量子位?

时间:2019-04-19 14:00:24

标签: c# fft complex-numbers q# qubit

简而言之,我正在尝试在Q#中实现非均匀离散傅立叶变换。

我设法以一种经典的方式做到了无错误(没有使用量子门或量子位),但是资源估算器说没有使用量子资源。 这使我倾向于相信,即使我具有操作类型函数,后端中的Q#也不使用任何特定于量子的操作。 因此,我现在尝试逐步进行操作,并将我的数据加载到qubit中(我在考虑),然后利用任何潜在的有用门。

问题是我的数据由2个数组组成,这些数组由代表复数的实部和虚部的Double数字组成。我可能需要在将来将其重新设计为一系列简单的复杂值。

但是从本质上讲,问题在于如何在一个或多个qubit中加载一个复数,这样我就可以对其进行一些处理并获得一些结果?

我不太热衷于共享我的代码,因为该算法以前从未尝试过。但是我愿意提供少量的代码,尤其是进一步的说明。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的描述,则Quantum Development Kit随附的资源估算器会准确报告您的操作未使用任何量子位或量子指令。这是因为Q#操作使用的量子位恰好是usingborrowing语句显式使用的量子位,再加上调用的任何其他操作所使用的量子位。

例如,如果您正在用Q#编写隐形传送操作,则可能会执行以下操作:

operation PrepareEntangledPair(left : Qubit, right : Qubit) : Unit {
    body (...) {
        H(left);
        CNOT(left, right);
    }

    adjoint auto;
}

operation ApplyCorrection(here : Qubit, msg : Qubit, there : Qubit) : Unit {
    if (M(msg) == One)  { Z(there); }
    if (M(here) == One) { X(there); }
}

operation TeleportMessage(msg : Qubit, there : Qubit) : Unit {
    using (here = Qubit()) {
        // Create some entanglement that we can use to send our message.
        PrepareEntangledPair(here, there);

        // Move our message into the entangled pair by using a Bell
        // measurement.
        Adjoint PrepareEntangledPair(msg, here);

        // Measure out the entanglement.
        ApplyCorrection(here, msg, there);

        // Reset our "here" qubit before releasing it.
        Reset(here);
    }
}

operation TeleportClassicalFlag() : Unit {
    using ((msg, there) = (Qubit(), Qubit())) {
        X(msg);
        TeleportMessage(msg, there);
        ApplyToEach(Reset, [msg, there]);
    }
}

根据此报告运行资源估算器,使用了三个量子位(两个TeleportClassicalFlag直接使用,两个TeleportMessageTeleportClassicalFlag调用):

enter image description here

相比之下,

古典逻辑始终保持古典。这样设计的目的是使混合经典逻辑和量子逻辑变得容易,例如在实现迭代相位估计算法时。在上面的示例中,if中使用的==语句和ApplyCorrection运算符用于描述隐形传态算法的经典部分。