常に完全なユニタリ行列を計算し、それをエントリの状態ベクトルに適用するだけで十分です。それはあなたがすることを選択したものだならば、それはだ、すべてあなたがすべての絡み合い情報がそのベクトルに含まれているとしなければなりません。特定のキュビットが絡まっているかどうかをすばやく簡単に確認する方法は、他のすべてのキュビットに対して(純粋な)状態ベクトルの部分的なトレースを取ることです。結果の行列がランク1の場合、そのキュビットは分離可能な状態にあり、それ以外の場合はもつれます。2 n2n×2n2n
私はあなたの質問のポイントが本当に「この莫大な計算コストをどのようにして避けることができるか」であると思います。一般に、それはできません。量子コンピュータの能力をフルに活用している場合は、常にエントリの状態ベクトルが必要になります。ただし、エンタングルメントを追跡することによってそのような大きな状態ベクトルの必要性を遅らせるなど、計算コストを削減するさまざまなトリックがあります。2n
効率の改善
上記の単純な実装と比較してできる最大の節約は、ユニタリ行列を回避することです。たとえば、1または2キュービットゲートのみを使用している場合、行列のスパース性を使用するだけで、ではなくストレージのみが必要になります。 O (2 n)O (2 2 n)2n×2nO(2n)O(22n)
次に、あなたが採用できる他の戦術があります。たとえば、量子ビットおよび 2量子ビットのユニタリゲートを適用するとします。状態ベクトルから4つの要素のセットを取得できます( for fixedは、すべての異なる)を取り、その4要素ベクトルにユニタリを適用するだけです。すべてのについてこれを繰り返すと、元の状態ベクトルに制定されたが返されます。Uij|x⟩1,2,…n∖i,j|y⟩i,jx∈{0,1}n−2y∈{0,1}24×4UxU
思いつく他の戦略があると思います。元の質問から示唆されたのは、エンタングルメント追跡でした。これにより、計算の開始時にメモリと速度が向上しますが、最終的には(おそらく)量子コンピューター内のすべてが絡み合うため、同等になります。
エンタングルメントトラッキング
あなたの計算がキュービットのセットのユニタリ進化と測定のみで構成されていると仮定しましょう。つまり、デコヒーレンス、確率マップなどはありません。ような完全に分離可能な状態から始めると仮定しましょう。。この時点で、すべての量子ビットは分離可能であり、それぞれが分離可能な量子ビットの状態を伝える異なるレジスタを保持することで十分です。あなたの最初のゲートは1つだけ量子ビット操作の場合は量子ビットのは、あなただけの量子ビットに保存されている状態を更新として、あなたはタッチ何にもありません。そうしないと。n|0⟩⊗nnUii|ψi⟩↦U|ψi⟩
たとえば、量子ビットと間で2量子ビットゲートを実行する場合、両方のサイトの状態を組み合わせる必要があります。したがって、状態を含む、それぞれ次元2の2つのレジスターを次元4の1つのレジスターに置き換えます。問題は、この状態を再び分割できないことです。そのため、これらの2つのキュービットをレジスタに永久に保持する必要があります。もちろん、量子ビットに適用する1量子ビットゲートがある場合は、を適用する必要があります。次に、たとえばと間に2キュービットゲートが必要になったときi j V | ψ 私 ⟩ | ψ jの ⟩ U I | ψ I 、J ⟩ ↦ U ⊗ I | ψ I 、J ⟩ J K (I 、J )k個のIVijV|ψi⟩|ψj⟩Ui|ψi,j⟩↦U⊗I|ψi,j⟩jk、とのスペースを組み合わせる必要があります。これらのスペースは成長し続けますが、ゲートが1つのスペースのみにローカライズされている場合は、そこに適用するだけで(演算子を使用して、残りのキュービットにパディングします)、その必要はありません。他のスペースには何でもします。(i,j)kI
このようなことをしている場合、(少なくともアルゴリズムの最初のいくつかのステップでは)単一の要素レジスタはありません。さまざまなレジスターの束を用意し、どのキュビットが別の配列のどのレジスターによって記述されているかを追跡する必要があります。いくつかのキュービットのスペースを組み合わせるたびに、その追加の配列を更新します。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
別のオプション
(決して網羅的ではありません)
もつれすぎていない状態に関する情報をカプセル化する優れた方法であるMatrix Product Statesに興味があるかもしれません。これは、達成しようとしている内容に応じて、代替ルートを提供する可能性があります。