我正在寻找一种量子算法,可以用来演示不同量子语言的语法。我的问题与此类似,但是对我来说,“好”的意思是:
- 它的作用可以在1-2段中描述,并且应该易于理解。
- 应该使用“量子编程世界”中的更多元素(我的意思是,算法应尽可能多地使用一些经典常量,度量,条件,q寄存器,运算符等)。
- 该算法应该很小(最多15-25个伪代码行)。
有用的算法通常太长/太难了,但是Deutsch的算法并没有使用那么多元素。有人可以推荐我一个适合演示的算法吗?
我正在寻找一种量子算法,可以用来演示不同量子语言的语法。我的问题与此类似,但是对我来说,“好”的意思是:
有用的算法通常太长/太难了,但是Deutsch的算法并没有使用那么多元素。有人可以推荐我一个适合演示的算法吗?
Answers:
我建议查看特征值/特征向量估计协议。有很多灵活性可以使问题轻松或随心所欲。
首先选择两个参数, 和 。您想设计一个-qubit单一 具有以下形式的特征值 对于整数 。确保至少一个特征值是唯一的,并称其为。还要确保一个简单的产品状态,例如,与特征值的特征向量具有非零重叠 。
这样做的目的是在此基础上实施相位估计算法 ,并负责输出矢量 那是对应于特征值的特征向量 。通常,这将包括一个 量子位(除非您需要ancillas来实现受控)。
其工作原理如下:
设置两个寄存器,其中之一 量子比特,另一个 量子比特。(使用量子寄存器)
每个量子位都在状态中初始化 。(量子寄存器的初始化)
将Hadamard应用于第一个寄存器中的每个量子位(单量子位门)
来自qubit 在第一个寄存器中,应用受控的-,针对第二个寄存器(多量子位控制的门)
在第一个寄存器上应用傅立叶逆变换,并在标准基础上测量第一个寄存器的每个量子位。这些可以组合起来,实现半经典的傅立叶变换。(经典数据的测量和前馈)
为了获得正确的测量结果,第二个寄存器处于所需状态 。
为简单起见,您可以选择 , ,所以您需要一个 具有特征值的矩阵 。我会用类似
对于更复杂的东西,放 ,然后替换 与交换门的平方根
听起来好像您想要一个量子“ Hello World”。最简单的量子版本就是编写文本的二进制编码版本Hello World
量子比特的寄存器中。但这需要约100量子位,并且比您的代码长度上限更长。
因此,让我们写一个简短的文字。让我们写一下;)
,我们需要一个长度为16的位字符串。特别是,使用ASCII编码
;) = 00111011 00101001
使用QISKit,您将使用以下代码进行操作。
from qiskit import QuantumProgram
import Qconfig
qp = QuantumProgram()
qp.set_api(Qconfig.APItoken, Qconfig.config["url"]) # set the APIToken and API url
# set up registers and program
qr = qp.create_quantum_register('qr', 16)
cr = qp.create_classical_register('cr', 16)
qc = qp.create_circuit('smiley_writer', [qr], [cr])
# rightmost eight (qu)bits have ')' = 00101001
qc.x(qr[0])
qc.x(qr[3])
qc.x(qr[5])
# second eight (qu)bits have 00111011
# these differ only on the rightmost two bits
qc.x(qr[9])
qc.x(qr[8])
qc.x(qr[11])
qc.x(qr[12])
qc.x(qr[13])
# measure
for j in range(16):
qc.measure(qr[j], cr[j])
# run and get results
results = qp.execute(["smiley_writer"], backend='ibmqx5', shots=1024)
stats = results.get_counts("smiley_writer")
当然,这不是很量子。因此,您可以将两个不同的图释进行叠加。最简单的示例是将;)与8)叠加,因为这些位串仅在8位和9位上有所不同。
;) = 00111011 00101001
8) = 00111000 00101001
所以你可以简单地替换行
qc.x(qr[9])
qc.x(qr[8])
从上面
qc.h(qr[9]) # create superposition on 9
qc.cx(qr[9],qr[8]) # spread it to 8 with a cnot
阿达马造成的叠加0
和1
,和CNOT使得它成为的叠加00
,并11
在两个量子比特。这是唯一需要的叠加;)
和8)
。
如果您想看到它的实际实现,可以在QISKit教程中找到(完整披露:它是由我编写的)。