量子暗号通信
BB84 回路
量子鍵配送を量子回路として実装
BB84 プロトコルを量子回路として動かしてみましょう。 今回の回路は、アリス、イブ、ボブそれぞれが操作する量子ビットを表現するために、ワイヤが 3 本あります。 一番上がアリスの量子ビット、真ん中がイブ、三番目がボブの量子ビットを表します。
  アリスは暗号鍵の 1 ビット分を表す量子ビットに \(|0\rangle\) または \(|1\rangle\)
  状態をセットし、ボブに送ろうとします。 イブはアリスとボブの中間 (真ん中のワイヤ)
  で量子ビットを横取りし盗聴 
ランダムにゲートを適用するために、今回は Qni の新たな機能を使います。
- 
    
の上の文字列は、測定で得られた 0 または 1 を指定した変数にセットすることを表します。たとえば `aliceX` とラベルの付いた が \(|1\rangle\) を測定した場合、変数 `aliceX` の値は 1 となります。  - 
    
や の上の文字列は変数名を意味し、変数の値が 1 だった時のみゲートを適用することを意味します。 たとえば `aliceX` とラベルの付いた は、同じく `aliceX` とラベルの付いた の測定結果が \(|1\rangle\) だった時のみ適用されます。  
以上を頭に入れて、BB84 回路の動作をひとつひとつ確認していきましょう。
アリス
  アリスはまず、盗聴を検出するための仕掛けを施した量子ビット \(|0\rangle\) または \(|1\rangle\)
  を作るためのランダム値を 2 つ作ります。 最初に、状態 \(|0\rangle\) または \(|1\rangle\)
  を決めるため、量子乱数ジェネレータMEASUREMENT 命令を参照で 0 または 1 を作り、変数
  aliceX にセットします。同様に、aliceH をもう一つの量子乱数ジェネレータでセットします。
  次に、このランダムな値 0 または 1 を持つ 2 つの変数 aliceX と
  aliceH を使って、暗号鍵の 1 ビット分を作ります。 \(|0\rangle\)
  に初期化した量子ビットに対して、aliceX == 1 の場合だけ aliceH の値が 1 だった場合に 
  アリスが送信する量子ビットの状態は、左から 2 つめのブロッホ球で確認できます。 「\(|0\rangle\) または
  \(|1\rangle\)」の 2 通りと、「
イブ
  イブは横取りした量子ビットを盗聴し、ボブへ偽装した量子ビットを送ります。
  しかしイブはクローン禁止定理CLONE 命令!?を参照によりアリスの量子ビットを複製できないため、測定して量子ビット状態を壊す以外に量子ビットの状態を推定することはできません。
  さらにアリスが \(|0\rangle\) と \(|1\rangle\) のどちらを送ったのか、さらに 
イブが送信する量子ビットの状態は、左から 3 つめのブロッホ球で確認できます。アリスが送る量子ビットの状態は 4 通りなので、およそ 3/4 の確率でアリスの送った状態と異なる量子ビットをボブに送ることになります。
ボブ
  ボブは BB84 プロトコルに従ってランダムに