疑問
CNOTゲートは、制御ビットの状態を判断してターゲットビットにNOTをかける操作です。制御ビットとターゲットビットをそれぞれ単独のQubitに分離可能な場合は、簡単に理解できるのですが、Bell Basis\(\frac{1}{\sqrt{2}}\begin{bmatrix} 1 \\ 0 \\ 0 \\ 1 \end{bmatrix}\)のような分離不可能な状態にCNOTをかける場合どのように考えればいいのでしょう?CNOTゲートの説明を見てるとEntangled(量子もつれ)状態のQubitにもCNOTをかけれると書いてありますが、考え方がよくわかりません。
Experiment with Q# QDK Simulator
とりあえず、Q# QDKのSimulatorを使ってどのように動くかを見てみます。まず、2 Qubit用意し、ビット0にアダマール変換をかけて、ビット0を制御ビット、ビット1をターゲットビットにしてCNOTをかけることでBell Basisを作ります。
TestOperations.qs
namespace TestOperations { open Microsoft.Quantum.Intrinsic; open Microsoft.Quantum.Diagnostics; operation EntangledCnot () : Unit { using (x = Qubit[2]){ H(x[0]); CNOT(x[0],x[1]); // 2Qbits are Bell basis and entangled DumpRegister((), [x[0]]); DumpRegister((), [x[1]]); DumpMachine(); // 2Qbits are Bell basis and entangled CNOT(x[0],x[1]); DumpMachine(); ResetAll(x); } } }
最初のCNOTをかけた後に2つのQubitの状態をDumpRegister()とDumpMachineで見てみます。
DumpRegisterはQubitの状態を1ビットずつ見る機能で、DumpMachineは全体のQubitの状態を見る機能です。
この時点で2つのQubitはBell Basisになっており、Bell BasisはEntangled状態なのでDumpRegisterは1Qubitずつに分けて状態を見ることはできないと返ってきます。これは期待通りの動作です。
DumpMachineではBell Basisになっていることを確認できます。
-----DumpRegister----------------> # wave function for qubits with ids (least to most significant): 0 ## Qubits were entangled with an external qubit. Cannot dump corresponding wave function. ## # wave function for qubits with ids (least to most significant): 1 ## Qubits were entangled with an external qubit. Cannot dump corresponding wave function. ## -----DumpMachine-----------------> # wave function for qubits with ids (least to most significant): 0;1 ∣0❭: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] ∣1❭: 0.000000 + 0.000000 i == [ 0.000000 ] ∣2❭: 0.000000 + 0.000000 i == [ 0.000000 ] ∣3❭: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ]
次にこの状態でさらにCNOTをかけてみます。
-----DumpRegister----------------> # wave function for qubits with ids (least to most significant): 0 ∣0❭: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] ∣1❭: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] # wave function for qubits with ids (least to most significant): 1 ∣0❭: 1.000000 + 0.000000 i == ******************** [ 1.000000 ] --- [ 0.00000 rad ] ∣1❭: 0.000000 + 0.000000 i == [ 0.000000 ] -----DumpMachine----------------->
# wave function for qubits with ids (least to most significant): 0;1 ∣0❭: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] ∣1❭: 0.707107 + 0.000000 i == *********** [ 0.500000 ] --- [ 0.00000 rad ] ∣2❭: 0.000000 + 0.000000 i == [ 0.000000 ] ∣3❭: 0.000000 + 0.000000 i == [ 0.000000 ]
そうすると、最初のCNOTをかける前の状態に戻りました。
基本的な考え方
量子もつれ状態のQubitにCNOTをかける場合は、テンソル積に分解することを考える前にcomputationla basisの足し算に分解します。今回の場合Bell basisは下記のように表現できます。\[|\psi\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)\]
この状態にそれぞれCNOTをかけてやります。\(|00\rangle\)では何も起こらず\(|11\rangle\)にはNOTが働くので下記の結果になります。
この状態にそれぞれCNOTをかけてやります。\(|00\rangle\)では何も起こらず\(|11\rangle\)にはNOTが働くので下記の結果になります。
\[CNOT(\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)) = \frac{1}{\sqrt{2}}(|00\rangle + |10\rangle) \]