始终计算全部费用当然就足够了 2n×2n ary矩阵,然后将其应用于 2n进入状态向量。如果那是您选择要做的,那就是所有要做的事情,因为所有纠缠信息都包含在该向量中。查看特定量子位是否纠缠的一种快速简便的方法是对所有其他量子位进行(纯)状态向量的部分跟踪。如果所得矩阵的秩为1,则该qubit处于可分离状态,否则将被纠缠。
我认为您的问题的重点实际上是“如何避免这种巨大的计算成本?”。通常,它不能-如果您要利用量子计算机的全部功能,则始终需要2n进入状态向量。但是,有各种技巧可以降低计算成本,例如通过跟踪纠缠来延迟对如此大的状态向量的需求。
效率提升
与上述天真的实现相比,您可以节省的最大费用是避免 2n×2nary矩阵。例如,如果仅使用1或2量子位门,则仅使用矩阵的稀疏性就意味着您只需要O(2n) 存储而不是 O(22n)。
然后,您可以采用其他策略。例如,假设您要应用两个量子位单一门U 在量子位上 i 和 j。您可以从状态向量中获取4个元素的集合(|x⟩1,2,…n∖i,j|y⟩i,j 用于固定 x∈{0,1}n−2 通过采取所有不同 y∈{0,1}2),然后应用 4×4 酉 U在那个4元素向量上 每重复一次x 将返回 U 在原始状态向量上制定。
我想还有其他策略可以提出。最初提出问题的一个原因是纠缠跟踪。这样可以在计算开始时提高内存和速度,但最终会变得等效,因为(大概)量子计算机中的所有内容最终都会纠缠在一起。
纠缠追踪
假设您的计算仅包含对集合的unit演化和度量n 量子位,即没有退相干,概率图等。让我们进一步假设您从一个完全可分离的状态开始,例如 |0⟩⊗n。此时,每个量子位都是可分离的,足以保持n不同的寄存器,每个寄存器传递一个可分离的qubit的状态。如果您的第一个门只是单量子位运算U 在量子位上 i,那么您只需更新存储在qubit上的状态 i 如 |ψi⟩↦U|ψi⟩,而您无需触摸其他任何东西。
如果你想做一个两比特的门 V 量子位之间 i 和 j,例如,那么您必须将两个站点的状态结合起来。因此,您将每个维度2的两个寄存器替换为一个维度4的寄存器,其中包含状态V|ψi⟩|ψj⟩。问题在于您现在无法再次拆分此状态,因此您必须将这两个量子位永久保存在寄存器中。当然,如果您有1个量子比特的门U 申请qubit i,您现在必须申请 |ψi,j⟩↦U⊗I|ψi,j⟩。然后,下一次您想要一个2量子位的门时,例如,j 和 k,您必须将空格合并 (i,j) 和 k。这些空间将继续增长,但是如果门仅位于一个空间上,则只需在其中应用它(使用I 运算符以将其填充到其余的qubits上),您无需对其他空间执行任何操作。
如果您正在做这样的事情,您将不会(至少在算法的前几个步骤中)没有一个 2n元素寄存器。您将不得不拥有一堆不同的寄存器,并跟踪在单独的数组中哪个寄存器描述了哪些量子位。每次合并一些量子位的空间时,都会更新该额外的数组。
这是一些非常粗糙的伪代码,可能有助于传达我的意思:
#initialise variables
entangled_blocks={{1},{2},{3},...,{n}}
quantum_states={{1,0},{1,0},...,{1,0}}
#apply action of each gate
for each gate
for each gate_target
target_block=entangled_blocks entry containing gate_target
next gate_target
if all target_blocks equal then
apply gate on target_block (pad with identity on other qubits)
else
new_entangled_block=union(target_blocks)
new_state_vec=tensor_product(quantum_states for each target block)
apply gate on new_state_vec (pad with identity on other qubits)
replace all target_blocks in entangled_blocks with new_entangled_block
replace all quantum_states(all target blocks) with new_state_vec
end if
next gate
其他选择
(绝不详尽)
您可能有兴趣阅读有关矩阵乘积状态的信息,这是一种封装不太纠缠的状态信息的好方法,并且可以为您提供替代方法,具体取决于您要实现的目标。