一种示例量子算法,可用于演示语言


9

我正在寻找一种量子算法,可以用来演示不同量子语言的语法。我的问题与类似,但是对我来说,“好”的意思是:

  • 它的作用可以在1-2段中描述,并且应该易于理解。
  • 应该使用“量子编程世界”中的更多元素(我的意思是,算法应尽可能多地使用一些经典常量,度量,条件,q寄存器,运算符等)。
  • 该算法应该很小(最多15-25个伪代码行)。

有用的算法通常太长/太难了,但是Deutsch的算法并没有使用那么多元素。有人可以推荐我一个适合演示的算法吗?


您是否还要求它应该是具有经典输入和经典输出的“算法”,并且与等效经典算法的工作方式有明显的不同?
DaftWullie

@DaftWullie不需要这些。运算符的参数或经典常量初始化可以为我表示“输入”,如果需要,我将提供输出格式。它不需要做/很特别。重点是语言的语法,该描述仅用于验证不同语言的代码是否相同。该算法的含义无关紧要。
klenium

欢迎来到Quantum Computing SE!仅检查一下,您的一个好的答案的标准是最短的伪代码中最多的元素吗?
Mithrandir24601

1
@ Mithrandir24601谢谢!是的,就像那样。
klenium '18

Answers:


3

我建议查看特征值/特征向量估计协议。有很多灵活性可以使问题轻松或随心所欲。

首先选择两个参数, nk。您想设计一个n-qubit单一 U 具有以下形式的特征值 e2πiq/2k 对于整数 q。确保至少一个特征值是唯一的,并称其为ω。还要确保一个简单的产品状态,例如|0n,与特征值的特征向量具有非零重叠 ω

这样做的目的是在此基础上实施相位估计算法 k,并负责输出矢量 |ψ 那是对应于特征值的特征向量 ω。通常,这将包括一个n+k 量子位(除非您需要ancillas来实现受控U)。

其工作原理如下:

  • 设置两个寄存器,其中之一 k 量子比特,另一个 n量子比特。(使用量子寄存器

  • 每个量子位都在状态中初始化 |0。(量子寄存器的初始化

  • 将Hadamard应用于第一个寄存器中的每个量子位(单量子位门

  • 来自qubit r 在第一个寄存器中,应用受控的-U2r,针对第二个寄存器(多量子位控制的门

  • 在第一个寄存器上应用傅立叶逆变换,并在标准基础上测量第一个寄存器的每个量子位。这些可以组合起来,实现半经典的傅立叶变换。(经典数据的测量和前

  • 为了获得正确的测量结果,第二个寄存器处于所需状态 |ψ

为简单起见,您可以选择 n=2k=1,所以您需要一个 4×4 具有特征值的矩阵 ±1。我会用类似

(U1U2)C(U1U2),
哪里 C表示受控NOT。只有一个特征向量为-1的特征向量|ψ=(U1U2)|1(|0|1)/2,您可能会迷惑于 U1U2 探索实施 U根据通用门集使用分解(我可能将其设置为一个初步问题)。然后,控制-U只需将受控NOT替换为受控NOT(Toffoli)门即可轻松实现。最后,傅立叶逆变换只是Hadamard门。

对于更复杂的东西,放 k=3,然后替换 C 与交换门的平方根

(1000012i200i21200001)
ω=e±iπ/4|ψ=(U1U2)(|01±|10)/2

3

听起来好像您想要一个量子“ 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

阿达马造成的叠加01,和CNOT使得它成为的叠加00,并11在两个量子比特。这是唯一需要的叠加;)8)

如果您想看到它的实际实现,可以在QISKit教程中找到(完整披露:它是由我编写的)。


我得到该链接的404。您是否将文件移到其他地方?
klenium '18

该教程似乎刚刚更新。我更改了链接,因此现在应该可以使用。
James Wootton '18

1

我会建议(完美的)1位随机数生成器。这几乎是简单的:

您以通常的初始状态下的单个量子位开始 |0。然后您应用哈达玛门H 产生相等的叠加 |0|1个。最后,您测量此量子位以得到0或1,每个概率为50%。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.