我也一直在解决这个问题。作为初学者和经典程序员(即,我不会讲量子力学),如果没有完整的示例,很难理解这些概念。我一直在使用Microsoft Q#Database Search示例。它只是在数据库中搜索特定的索引/关键字,这不是很有用。我已经扩展了该样本,以在数据库中搜索值列表并返回相应的键。
与您的示例一样,索引有一个两个量子位的“密钥寄存器”,而值有一个单独的两个量子位的寄存器。Microsoft的样本中还有第五个“标记的量子位”,用于指示何时找到所需的值。键和值通过纠缠关联。用电路最好地证明这一点。单击此处查看实际的Quirk电路。
请注意,此电路仅包含预言。它没有实现所有的Grover算法。
- 前两个量子位是密钥寄存器,后两个量子位是值寄存器,下一个量子位是标记的量子位。
- 第一部分,按照Grover算法的要求,使用Haramard门将密钥寄存器置于统一的叠加中。
- 第二部分是通过纠缠将键与值关联的位置。通过应用(反)控制的X门,每个键都与值寄存器中的相应值纠缠在一起。因此,当键寄存器为0时,值寄存器将设置为3。当键为1时,值将设置为2,依此类推。
- 电路的第三部分是搜索预言。值寄存器与标记的量子位纠缠在一起。在此示例中,所需值为2。当值寄存器包含2时,标记的qubit将设置为1。
- Grover的算法查看密钥寄存器和标记的qubit。搜索oracle查看值寄存器并设置标记的qubit。当值为2时,这将导致键1被放大。
有趣的是,键和值不是存储在qubit中,而是存储在电路/程序中。您可以说它本身并不是一个数据库。它更像是switch / case语句,但是可以在值的叠加上运行。
有关更多详细信息,注意事项和Q#代码,请参阅我的GitHub存储库。
编辑:自从回答以来,我了解得更多……您必须在每次迭代中都撤消/撤消电路。在Q#代码中,ReflectStart()操作中的Adjoint StatePreparationOracle()调用可处理此问题,因此我不必显式执行此操作。我不知道Qiskit是否具有类似功能。如果我正确地完成了翻译,那么上面的示例就是完整的电路图。