为什么量子估计器说我没有在 Q# 中使用任何量子位?
Why does the quantum estimator say i don't use any qubits in Q#?
简而言之,我正在尝试在 Q# 中实现非均匀离散傅里叶变换。
我已经成功地以经典方式做到了无错误(没有使用量子门或量子位),但资源估算器说没有使用量子资源。
这让我倾向于相信后端的 Q#,即使我有一个 Operation 类型的函数,也没有使用任何量子特定的操作。
所以我现在正在尝试逐步将我的数据加载到量子比特中(我在想)然后利用任何潜在有用的门。
问题是我的数据由 2 个数组组成,这些数组由表示复数的实部和虚部的双精度数组成。将来我可能需要将其重新设计为一组直接复数值。
但本质上,问题是如何在一个或多个量子位中加载一个复数,以便我可以对其进行一些处理并获得一些结果?
我不太热衷于分享我的代码,因为算法是以前没有尝试过的东西;但我愿意提供少量代码,尤其是进一步说明。
如果我对您的描述理解正确,则量子开发工具包随附的资源估算器准确地报告您的操作没有使用任何量子位或量子指令。这是因为 Q# 操作使用的 qubits 恰好与 using
或 borrowing
语句显式使用的 qubits,加上调用的任何其他操作使用的 qubits。
例如,如果您在 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
直接使用,一个由 TeleportMessage
调用,由 TeleportClassicalFlag
调用) :
相比之下,经典逻辑始终保持经典。这旨在使混合经典逻辑和量子逻辑变得容易,例如在实现迭代相位估计算法时。在上面的例子中,if
语句和==
运算符在ApplyCorrection
中用于描述隐形传态算法的经典部分。
简而言之,我正在尝试在 Q# 中实现非均匀离散傅里叶变换。
我已经成功地以经典方式做到了无错误(没有使用量子门或量子位),但资源估算器说没有使用量子资源。 这让我倾向于相信后端的 Q#,即使我有一个 Operation 类型的函数,也没有使用任何量子特定的操作。 所以我现在正在尝试逐步将我的数据加载到量子比特中(我在想)然后利用任何潜在有用的门。
问题是我的数据由 2 个数组组成,这些数组由表示复数的实部和虚部的双精度数组成。将来我可能需要将其重新设计为一组直接复数值。
但本质上,问题是如何在一个或多个量子位中加载一个复数,以便我可以对其进行一些处理并获得一些结果?
我不太热衷于分享我的代码,因为算法是以前没有尝试过的东西;但我愿意提供少量代码,尤其是进一步说明。
如果我对您的描述理解正确,则量子开发工具包随附的资源估算器准确地报告您的操作没有使用任何量子位或量子指令。这是因为 Q# 操作使用的 qubits 恰好与 using
或 borrowing
语句显式使用的 qubits,加上调用的任何其他操作使用的 qubits。
例如,如果您在 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
直接使用,一个由 TeleportMessage
调用,由 TeleportClassicalFlag
调用) :
相比之下,经典逻辑始终保持经典。这旨在使混合经典逻辑和量子逻辑变得容易,例如在实现迭代相位估计算法时。在上面的例子中,if
语句和==
运算符在ApplyCorrection
中用于描述隐形传态算法的经典部分。