忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Qiskit】CNOTゲートの仕組みを徹底検証!制御ビットで対象が変わる動きを確認しよう

前回までに、1量子ビットでの重ね合わせと測定、そしてQiskit標準シミュレータ(BasicSimulator)を使った実行方法を学びました。

今回はステップアップして、**2量子ビットを使った量子プログラミングの基本パーツ「CNOTゲート(制御NOTゲート)」**の動きを検証してみたいと思います。CNOTゲートが「条件によって標的を反転させる」という挙動を、実際のコードとシミュレーション結果から確かめてみましょう。

1. CNOTゲートとは?

CNOTゲートは、量子コンピュータにおける「もし〜なら〜する(if文)」のような役割を持つ超重要パーツです。2つの量子ビットを使い、次のようなルールで動作します。

  • 制御ビット(Control):条件を決める側の量子ビットです。
  • 標的ビット(Target):制御ビットの状態に応じて値が反転するかどうか変わる側の量子ビットです。
  • 制御が「0」の場合:標的ビットは何もしません(そのまま)。
  • 制御が「1」の場合:標的ビットの値を反転(0なら1に、1なら0に)させます。

2. 比較検証のサンプルコード

制御ビットが「0」の場合と「1」の場合で、CNOTゲートを通った後に標的ビットがどう変わるのかを比較するコードを作成します。

from qiskit import QuantumCircuit
from qiskit.providers.basic_provider import BasicSimulator

simulator = BasicSimulator()

print("=== パターンA: 制御ビットが「0」の場合 ===")
qc_a = QuantumCircuit(2, 2)
# 制御ビット(0番目)は何もしない(初期状態の「0」のまま)
qc_a.cx(0, 1)  # CNOTゲート適用(制御=0, 標的=1)
qc_a.measure(0, 0)
qc_a.measure(1, 1)

result_a = simulator.run(qc_a, shots=1000).result()
print(f"回路図:\n{qc_a.draw(output='text')}")
print(f"実行結果: {result_a.get_counts()}\n")

print("=== パターンB: 制御ビットが「1」の場合 ===")
qc_b = QuantumCircuit(2, 2)
qc_b.x(0)      # Xゲートで制御ビット(0番目)を「1」にする
qc_b.cx(0, 1)  # CNOTゲート適用(制御=0, 標的=1)
qc_b.measure(0, 0)
qc_b.measure(1, 1)

result_b = simulator.run(qc_b, shots=1000).result()
print(f"回路図:\n{qc_b.draw(output='text')}")
print(f"実行結果: {result_b.get_counts()}")

3. 実際の実行結果と回路図

ターミナルでスクリプトを実行すると、それぞれのパターンで以下のような回路図と実行結果が得られます。

=== パターンA: 制御ビットが「0」の場合 ===
回路図:
         ┌─┐   
q_0: ──■──┤M├───
     ┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├─╫─┤M├
     └───┘ ║ └╥┘
c: 2/══════╩══╩═
           0  1 
実行結果: {'00': 1000}

=== パターンB: 制御ビットが「1」の場合 ===
回路図:
     ┌───┐    ┌─┐   
q_0: ┤ X ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
         └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 
実行結果: {'11': 1000}

4. 結果の解説:CNOTゲートの動き

得られた結果を整理してみましょう。

  • パターンA(制御が「0」):制御ビットが 0 のため、標的ビットは反転せずそのまま 0 を維持しました。そのため、結果はすべて 00(1,000回)になっています。
  • パターンB(制御が「1」):Xゲートで制御ビットを 1 にしたため、CNOTゲートが働いて標的ビットが反転(0 から 1 へ)しました。その結果、両方とも 1 になり、結果はすべて 11(1,000回)になっています。
CNOTゲートの「条件分岐」動作を完全確認!
制御ビットの値(0か1か)によって、もう一方の標的ビットの運命が変わる様子がシミュレーションでハッキリと証明できました。

まとめ

今回は、2量子ビットの基本操作であるCNOTゲートの挙動をコードとシミュレーションで確認しました。制御ビットの状態に応じて標的が変わる仕組みがよく分かったと思います。このCNOTゲートの組み合わせこそが、量子もつれ(エンタングルメント)を生み出す鍵になります!


PR