对于第一手原则的演讲,我喜欢Ryan O'Donnell的回答。但是对于稍高级别的代数处理,这就是我的处理方法。
对于任何单位U而言,受控操作的主要特征在于,它根据某些单个qubit的值(连贯地)对某些qubit执行运算。我们可以用代数方式显式地编写此代码(使用第一个qubit的控件)的方式是:
,其中是与相同维的单位矩阵。在这里,和是投影到状态和投影仪UU
CU=|0⟩⟨0|⊗1+|1⟩⟨1|⊗U
1U|0⟩⟨0||1⟩⟨1||0⟩|1⟩ 控制量子位的概念—但是我们在这里不将它们用作度量的元素,而是根据第一个量子位的状态空间的一个或另一个子空间来描述对其他量子位的影响。
我们可以使用它出门的矩阵,该矩阵对量子位3 进行运算,并以量子位1的状态为条件,将其视为受控 2和3上执行操作
CX1,3X(12⊗X)
CX1,3=|0⟩⟨0|⊗14+|1⟩⟨1|⊗(12⊗X)=[140404(12⊗X)]=⎡⎣⎢⎢⎢12020202021202020202X02020202X⎤⎦⎥⎥⎥,
,其中后两个是块矩阵表示形式,可以节省空间(和完整性)。
更好的是:我们可以认识到-在某种数学水平上,我们允许自己意识到张量因子的阶数不一定必须处于某个固定的阶数-操作的控制和目标可以在任何两个张量上系数,我们可以用来填充所有其他量子位上的运算符描述。这将使我们直接跳到表示形式
12
CX1,3==|0⟩⟨0|control⊗12uninvolved⊗12target⎡⎣⎢⎢⎢12020202021202020202020202020202⎤⎦⎥⎥⎥+|1⟩⟨1|control⊗12uninvolved⊗Xtarget+⎡⎣⎢⎢⎢02020202020202020202X02020202X⎤⎦⎥⎥⎥
并且还允许我们立即查看如果将控件和目标的角色互换了该怎么做:
CX3,1===12target⊗12uninvolved⊗|0⟩⟨0|control⎡⎣⎢⎢⎢⎢⎢|0⟩⟨0||0⟩⟨0||0⟩⟨0||0⟩⟨0|⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢10000000000001000010000000000001+Xtarget⊗12uninvolved⊗|1⟩⟨1|control+⎡⎣⎢⎢⎢⎢⎢|1⟩⟨1||1⟩⟨1||1⟩⟨1||1⟩⟨1|⎤⎦⎥⎥⎥⎥⎥00001000010000000000001000010000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥.
但最重要的是:如果您可以代数形式记下这些运算符,则可以迈出完全放弃巨型矩阵的第一步,而不必使用
和
CX1,3=|0⟩⟨0|⊗12⊗12+|1⟩⟨1|⊗12⊗XCX3,1=12⊗12⊗|0⟩⟨0|+X⊗12⊗|1⟩⟨1|。当然,使用这些功能将有一定的局限性-简单地改变表示形式就不可能有效地解决困难的量子算法,更不用说通过手动计算可以解决了-但是您可以更有效地推理简单的电路使用这些表达式要比使用巨大的空间吃矩阵更好。