感谢您的提问!根据您想要执行的操作的详细信息,Q# 中有几个不同的选项可以帮助您。首先,DumpMachine 和DumpRegister 可调用对象指示模拟器将整个机器或特定寄存器的量子状态转储到主机程序。在不支持 DumpMachine 和 DumpRegister 的目标计算机上,可以安全地忽略这些调用,因为它们对 Q# 程序本身的执行没有影响。
默认情况下,这些诊断转储的状态要么在命令行编写 Q# 独立程序时打印到控制台,要么在 Q# Notebooks 中显示为表格。您可以在http://aka.ms/try-qsharp 在线试用“转储状态和操作”示例,以更详细地了解其工作原理。
虽然打印输出到控制台或笔记本是默认设置,但您也可以使用 C# 主机捕获QuantumSimulator 目标机器的状态。虽然目前没有很好地记录(对此感到抱歉),但您可以在IQ# 和Q# standard libraries 中看到QuantumSimulator.StateDumper 类用于捕获DumpMachine 和DumpRegister 产生的量子态的一些示例。如果您对这些方面感兴趣的用例,这可能是对qsharp-runtime repo 的一个很好的功能请求。
另一方面,如果您希望从in Q# 程序的输出分布中进行采样,而无需重复模拟破坏性测量,那就更微妙了。在硬件上无法在不测量的情况下获得测量概率,因此没有 Q# 内在函数允许这样做,但 Q# 标准库中的某些操作可以使用存储在模拟器中的信息来显着加快运行速度。特别是,EstimateFrequencyA operation 可用于有效估计从给定测量和状态准备过程中获得Zero 结果的频率:
let freq = EstimateFrequencyA(
ApplyToFirstQubitCA(H, _), // Prepare |+⟩ on the first qubit.
Measure([PauliZ], _), // Measure a single qubit in the ?-basis.
1, // Use a single qubit.
1000000 // Measure 1M times.
);
// freq should now be close to 0.5.
这是有效的,因为在不允许直接查看量子态的目标上,您始终可以通过在许多破坏性测量上运行循环来获得相同的答案,正如您在原始问题中指出的那样。 EstimateFrequencyA 在支持“作弊”的模拟器上所做的与在不支持“作弊”的目标上运行时所做的唯一区别是性能。