忍者ブログ
統計、機械学習、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

【Qiskit】追加インストールなし!標準シミュレータで量子回路を実行してみよう

前回までに、Hゲートを使った「重ね合わせ」の作り方と、結果を取り出すための「測定(Measure)」の仕組み、そして回路図の見方を学びました。

今回は、追加のパッケージ(qiskit-aerなど)をわざわざインストールしなくても使えるQiskit標準のシミュレータ(BasicSimulator)を利用して、実際に回路を動かし、確率的な計算結果を取得してみたいと思います。

1. 実行用サンプルコード

以下のコードを sample_run.py として保存して実行します。Qiskitのコア機能だけで完結するため、環境構築が非常にシンプルです。

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

# 1量子ビットと、測定結果を記録する古典ビットを1つ準備
qc = QuantumCircuit(1, 1)

# Hゲートで重ね合わせ状態を作成
qc.h(0)

# 0番目の量子ビットを測定し、0番目の古典ビットに保存
qc.measure(0, 0)

# Qiskit標準の内蔵シミュレータを準備
simulator = BasicSimulator()

# 回路を1000回実行(シミュレーション)
result = simulator.run(qc, shots=1000).result()

# 実行結果から「0」と「1」が出た回数を取得
counts = result.get_counts()

print(f"実行結果: {counts}")

2. 実際の実行結果

ターミナルでこのスクリプトを実行すると、以下のような結果が出力されます。

% python sample_run.py
実行結果: {'1': 508, '0': 492}

3. 結果の解説:なぜこの数値になるのか?

得られた結果を詳しく見てみましょう。

  • 0 が 492回、1 が 508回という内訳になっています。合計するとちょうど 1,000回(shots=1000)の試行が行われていることがわかります。
  • Hゲート(アダマールゲート)を通った量子ビットは、「0である確率」と「1である確率」がちょうど半々(50%ずつ)の重ね合わせ状態になります。
  • それを1,000回測定したため、理論値である 50:50(各500回前後)に非常に近い、確率的な揺らぎを持った数値が再現されました。
量子コンピュータの確率的振る舞いをコードで実証!
ただの理論だけでなく、シミュレーションを通じて「半々の確率で0と1がランダムに出現する」という量子力学の現象を手元のPCで確認できました。

まとめ

今回は、Qiskit標準の BasicSimulator を使って、重ね合わせ回路の実行から統計データの取得までを体験しました。回路を作って測定し、結果を数字として受け取るという、量子プログラミングの基本サイクルがこれでバッチリ完了です!



【Qiskit】量子回路の基本:回路構築から「測定」の前まで

量子コンピュータのプログラミングでは、量子ゲートを使って回路を構築するだけでは計算結果を得ることができません。量子ビットは計算が終わるまで確率的に揺らぎ続けているため、最終的な結果を取り出すためには、必ず「測定(Measure)」という工程が必要になります。

1. 測定を含む量子回路の構築

Qiskitにおいて結果を確認するための回路を作成します。QuantumCircuit(1, 1) と記述することで、1つの量子ビットと、測定結果を書き込むための「1つの古典ビット」を準備します。この古典ビットを用意して測定を行わない限り、量子計算の結果を数値として読み出すことはできません。

from qiskit import QuantumCircuit

# 1量子ビットの回路と、測定結果を記録する古典ビットを1つ準備
qc = QuantumCircuit(1, 1)

# Hゲートで重ね合わせ状態を作成
qc.h(0)

# 0番目の量子ビットを測定し、その結果を0番目の古典ビットに保存
qc.measure(0, 0)

# 回路を描画
print(qc.draw(output='text'))

2. 実行結果(回路図)

ターミナルで実行すると、以下のように測定ゲート(M)が配置された回路図が表示されます。

% python sample_measure.py
     ┌───┐┌─┐
q: ┤ H ├┤M├
     └───┘└╥┘
c: 1/══════╩═
           0

3. 回路図の読み方と「0」の意味

この回路図には、重要な情報が可視化されています。

  • c: 1/ : 測定結果を保存するための古典的な記録領域です。ここへ情報を書き出すことではじめて、人間が結果を読み取れます。
  • ╩(二重線) : 測定(M)によって、量子情報が古典ビットへと「確定」して送られる様子を表しています。
  • 一番下の「0」 : これは「結果が0だった」という意味ではありません。「0番目の量子ビットの測定結果を、0番目の古典ビットという『宛先(ID)』に保存する」という接続指示を指しています。

このように、Qiskitで qc.measure(0, 0) を実行することで、量子ビットの確率的な情報を「古典ビットという箱」に固定することができます。これによって、後続のシミュレータ実行時に「0」または「1」という確定した値として結果を得ることができるようになるのです。

量子コンピュータの「観測」プロセスを実装!
Hゲートで確率を作ったら、必ずMeasureで測定して結果を確定させる。これが量子プログラミングの基本です。

次のステップ

測定する場所が確保できたので、次回はいよいよシミュレータを使って、この回路を実際に動かし、統計的な結果(0と1の出現回数)を取得してみたいと思います。


無題

今回は、2つの量子ビットを連動させる「CXゲート(制御NOTゲート)」を導入します。Hゲートと組み合わせることで、量子ビット間に相関を持たせる「量子もつれ(Entanglement)」の基本回路を作成します。

1. サンプルコードの作成

2量子ビットの回路を作成し、0番目の量子ビットにHゲートを、その0番目を制御ビットとして1番目にCXゲートを適用します。これを sample2.py として保存しました。

from qiskit import QuantumCircuit

# 2量子ビットの量子回路を作成
qc = QuantumCircuit(2)

# 0番目にHゲートを適用
qc.h(0)

# 0番目を制御ビット、1番目をターゲットビットとしてCXゲートを適用
qc.cx(0, 1)

# 回路をテキスト形式で描画
print(qc.draw(output='text'))

2. 実行結果

ターミナルでスクリプトを実行すると、以下のように回路が表示されます。

% python sample2.py
     ┌───┐     
q_0: ┤ H    ├──■──
     └───┘┌─┴─┐
q_1: ─────┤  X   ├
               └───┘

3. 回路のポイント

実行結果を見ると、0番目の H ゲートから伸びた線が、1番目の X ゲートへと繋がっているのがわかります。これが「量子もつれ」を生み出すベル状態の基本形です。回路図の表示レイアウトは環境によって多少ズレが生じることがありますが、重要なのは「どのゲートがどの量子ビットに接続されているか」という論理構造です。

回路構築完了:量子もつれの基礎が完成!
複数の量子ビットを連携させることで、量子コンピュータ特有の計算処理への足掛かりができました。

次のステップ

回路の構造を確認できるようになったので、次は「測定(Measure)」を追加して、観測によってこの量子もつれ状態がどう確定するのかを実験してみます。



【Qiskit】はじめての量子回路構築:Hゲートを可視化する

量子コンピュータの基礎である「量子回路」を実際に組んでみます。今回は最も基本的な操作である「アダマールゲート(H)」を適用し、量子ビットを重ね合わせ状態にする回路を作成し、その構造を可視化してみます。

1. サンプルコードの作成

Qiskitの QuantumCircuit を使い、1量子ビットの回路を定義してHゲートを配置します。以下の内容を sample1.py として保存しました。

from qiskit import QuantumCircuit

# 1量子ビットの量子回路を作成
qc = QuantumCircuit(1)

# アダマールゲート(H)を適用して重ね合わせ状態にする
qc.h(0)

# 回路をテキスト形式で描画して表示
print(qc.draw(output='text'))

2. 実行結果

ターミナルでスクリプトを実行すると、以下のように量子回路が視覚的に表示されます。

% python sample1.py
     ┌───┐
 q: ┤ H ├
     └───┘

3. この結果が意味するもの

表示された図は、量子ビット q に対して H(アダマールゲート)が適用されていることを表しています。初期状態が |0⟩ であれば、このゲートを通過することで、量子力学特有の「0と1の重ね合わせ状態」へと変換されます。

量子回路の可視化成功!
テキストベースの描画により、回路の構造を一目で確認できるようになりました。

次のステップ

回路の構造を確認できるようになったので、次は「測定(Measure)」を追加して、確率的に 0 や 1 が出力される様子をシミュレーションで確認していきたいと思います。


        
  • 1
  • 2