编码德意志算法

时间:2017-09-20 00:00:33

标签: python algorithm numpy quantum-computing

我目前正在尝试对Deutsch算法进行编码,并在如何衡量| x>方面苦苦挣扎。量子比特。阅读example here有助于但不能解决我的根本问题。

使用下图作为我提出的问题的基础,在他们提出第二个Hadamard转换时,我仍然将我的信息编码为对应于| 00>,| 01&gt的概率向量;,| 10>和| 11>。

Deutsch Algorithm Diagram

我读过的所有内容都表明,我所做的只是取前2个值(因为它们对应于第一个量子位)并应用Hadamard变换,然后查看它是零还是一个但似乎不是上班。有没有人实现过这个并且对如何实现这个有任何建议?我目前正在使用Numpy编写Python代码,以下是我的内容:

x = np.array([[1], [0]])
y = np.array([[0], [1]])
h = calc_hadamard(1)

phi2 = np.kron(h.dot(x), h.dot(y))

constantF = np.array([[1, 0, 0, 0],
                      [0, 1, 0, 0],
                      [0, 0, 1, 0],
                      [0, 0, 0, 1]])

balancedF = np.array([[1, 0, 0, 0],
                      [0, 1, 0, 0],
                      [0, 0, 0, 1],
                      [0, 0, 1, 0]])

print(constantF.dot(phi2))
print(balancedF.dot(phi2))

这些打印功能输出的内容是

  • (0.5,-0.5,0.5,-0.5)和
  • (0.5,-0.5,-0.5,0.5)

正如希望显而易见的那样,这是预期的,但在前两个值上执行后续的Hadamard变换给出了相同的答案。我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

  

我读过的所有内容都表明,我所做的就是取前2个值(因为它们对应于第一个量子位)并应用Hadamard变换,

不,那不是你做的。您必须将Hadamard操作应用于顶部对和底部对。同样地,你必须扩展1-qubit Hadamard矩阵以通过将其与另一个量子位的标识操作一起张紧来应用于2-qubit系统:

phi3 = constantF.dot(phi2)  # or balancedF
h_on_1_for_2 = np.kron(np.eye(2), h)
phi4 = np.dot(h_on_1_for_2, phi3)

答案 1 :(得分:2)

  

这些打印功能输出的位置是

(0.5, -0.5, 0.5, -0.5), and
(0.5, -0.5, -0.5, 0.5)

这确实是正确的。如果我们使用狄拉克(Dirac)表示法并乘以2量子位的状态来写这些向量,则得出:

  • 1/2 ( |00> - |01> + |10> - |11> ) = 1/2 ( |0> + |1> ) ( |0> - |1> )(恒定大小写)
  • 1/2 ( |00> - |01> - |10> + |11> ) = 1/2 ( |0> - |1> ) ( |0> - |1> )用于平衡情况

正如Deutsch算法(Wikipedia : Deutsch's algorithm)所预期的那样,我们可以舍弃(删除)第二个寄存器并将Hadamard应用于第一个寄存器。它给

  • H ( |0> + |1> ) = |0>(恒定大小写)
  • H ( |0> - |1> ) = |1>用于平衡情况

您犯的错误是,我们需要在其上应用Hadamard然后测量的第一个寄存器与您所说的前两个值不对应。我们需要回到Dirac表示法,首先将全局状态作为2个寄存器的张量积(Kronecker积)进行分解。