はじめに
皆様こんにちは。
AMDlab Webエンジニアの塚田です。
今回は、量子コンピュータ向けの開発ツールである Qiskit のコードを、ブラウザ上で量子回路として確認できる IBM Quantum Composer を使って見ていきます。
この記事は、IBM Quantum Documentation の Quickstart を参考にしています。
QiskitとIBM Quantum Platform
Qiskitは、量子回路を作成・実行するためのPythonベースの開発ツールです。IBM Quantum Platformを利用すると、作成した量子回路をクラウド上の量子コンピュータやシミュレータで確認できます。
この記事では、IBM Quantum Quickstartで扱われている考え方をもとに、1量子ビット、2量子ビット、3量子ビットの回路を順番に見ていきます。最後に、2量子ビットのGrover探索も試します。Grover探索を選択したのは、比較的わかりやすかったためです。
今回試すこと
今回は、IBM Quantum Composerを使い、量子ビット数を少しずつ増やしながら、量子回路の基本的な動きを確認します。
- 1量子ビット: Hゲートで重ね合わせを作る
- 2量子ビット: HゲートとCXゲートでBell状態を作る
- 3量子ビット: CXゲートをもう1つ足して、3つの量子ビットを測定すると同じ結果になるもつれ状態を作る
- 2量子ビットGrover探索: 4つの候補から11を見つける
ここでは難しい数式よりも、Composerの画面と測定結果を見ながら、何が起きているのかを確認することを目的にします。
今回使う主な操作
今回の回路で使う主な操作は、Hゲート、Xゲート、CXゲート、CZゲート、測定です。
- Hゲート: 量子ビットを、0と1のどちらも出る可能性がある状態にする操作です。
- Xゲート: 量子ビットの0と1を反転する操作です。
- CXゲート: 1つ目の量子ビットが1のときだけ、2つ目の量子ビットを反転する操作です。
- CZゲート: 2つの量子ビットがどちらも1の状態に、位相反転の印を付ける操作です。
- 測定: 量子ビットの状態を、最終的に0または1として読み取る操作です。
通常のビットは0または1のどちらかですが、量子ビットでは測定する前に、複数の可能性を持つ状態を作れます。今回の例では、この性質をHゲートやCXゲートで確認し、最後にGrover探索でOracleとDiffuserの考え方にも触れます。
Composerの量子ビット数を調整する
IBM Quantum Composerを開くと、初期状態では複数の量子ビットが表示されていることがあります。今回の記事では、説明に使う量子ビット数だけに絞ると分かりやすくなります。
デフォルトは4量子ビットの表示になっていました。
利用する量子ビット数に合わせるため、Manage registersを選択します。
量子ビット数と古典ビット数を調整します。
1量子ビット: Hゲートで重ね合わせを作る
まずは1量子ビットから確認します。
最初、量子ビットは0の状態です。この量子ビットにHゲートをかけると、測定時に0と1がほぼ50%ずつ出る状態になります。
このように、測定する前に0と1の両方の可能性を持つ状態を「重ね合わせ」と呼びます。
Composerで見ると、Hゲートを置いたあとに測定ゲートを置きます。画面下の確率グラフでは、0と1がほぼ半々になっていることが確認できます。
生成されるコードは、次のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Qiskitで量子回路を作るための部品を読み込む from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit # 円周率 pi を読み込む # 今回の回路では使っていないが、Composerが自動で出力することがある from numpy import pi # 1つの量子ビット q を用意する qreg_q = QuantumRegister(1, 'q') # 測定結果を保存するための1つの古典ビット c を用意する creg_c = ClassicalRegister(1, 'c') # 量子ビットと古典ビットを使って回路を作る circuit = QuantumCircuit(qreg_q, creg_c) # q0にHゲートをかける # 測定すると 0 と 1 がほぼ半々で出る状態になる circuit.h(qreg_q[0]) # q0を測定して、結果をc0に保存する circuit.measure(qreg_q[0], creg_c[0]) |
2量子ビット: Bell状態を作る
次に、IBM Quantum Quickstartで扱われている2量子ビットの回路を確認します。
最初、2つの量子ビットは00の状態です。まず、1つ目の量子ビットにHゲートをかけます。これにより、1つ目の量子ビットは0と1のどちらも出る可能性がある状態になります。
次にCXゲートを使います。CXゲートは、1つ目の量子ビットが1のときだけ、2つ目の量子ビットを反転するゲートです。
この結果、理想的なシミュレータでは、測定結果は00または11になります。01や10が基本的に出ないのは、2つの量子ビットを測定すると同じ結果が出るような状態になっているためです。
このように、複数の量子ビットの結果が強く関係している状態を、量子もつれと呼びます。今回作っているBell状態は、量子もつれを説明するときによく使われる代表的な例です。
生成されるコードは、次のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Qiskitで量子回路を作るための部品を読み込む from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from numpy import pi # 2つの量子ビット q と、2つの古典ビット c を用意する qreg_q = QuantumRegister(2, 'q') creg_c = ClassicalRegister(2, 'c') # 量子ビットと古典ビットを使って回路を作る circuit = QuantumCircuit(qreg_q, creg_c) # q0を重ね合わせにする # 測定すると 0 と 1 がほぼ半々で出る状態になる circuit.h(qreg_q[0]) # q0が1のときだけ、q1を反転する # これにより 00 と 11 になるBell状態を作る circuit.cx(qreg_q[0], qreg_q[1]) # q0を測定して、結果をc0に保存する circuit.measure(qreg_q[0], creg_c[0]) # q1を測定して、結果をc1に保存する circuit.measure(qreg_q[1], creg_c[1]) |
3量子ビット: 3つの量子ビットをもつれさせる
3量子ビットでは、2量子ビットのBell状態にさらに1つの量子ビットを追加し、CXゲートをもう1つ追加します。
具体的には、q0とq1をCXゲートでつなぎ、さらにq1とq2もCXゲートでつなぎます。
理想的なシミュレータでは、この回路を測定すると000または111になります。これは、3つの量子ビットの結果が、0ならすべて0、1ならすべて1にそろう状態を表しています。
このように、3つの量子ビットの結果が強く関係している状態も、量子もつれの一種です。
生成されるコードは、次のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Qiskitで量子回路を作るための部品を読み込む from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from numpy import pi # 3つの量子ビット q を用意する qreg_q = QuantumRegister(3, 'q') # 測定結果を保存するための3つの古典ビット c を用意する creg_c = ClassicalRegister(3, 'c') # 量子ビットと古典ビットを使って回路を作る circuit = QuantumCircuit(qreg_q, creg_c) # q0を重ね合わせにする # 測定すると 0 と 1 がほぼ半々で出る状態になる circuit.h(qreg_q[0]) # q0が1のときだけq1を反転する # q0とq1を連動させる circuit.cx(qreg_q[0], qreg_q[1]) # q1が1のときだけq2を反転する # q0、q1、q2の3つがそろう状態を作る circuit.cx(qreg_q[1], qreg_q[2]) # 3つの量子ビットを測定する circuit.measure(qreg_q[0], creg_c[0]) circuit.measure(qreg_q[1], creg_c[1]) circuit.measure(qreg_q[2], creg_c[2]) |
Grover探索
最後に、2量子ビットのGrover探索を確認します。
2量子ビットでは、00、01、10、11 の4つの候補を表せます。Grover探索は、このような複数の候補の中から、条件に合う候補を出やすくするための探索アルゴリズムです。
今回は、4つの候補の中から11を探す例にします。理想的なシミュレータでは、OracleとDiffuserを1回ずつ使うことで、測定結果が11になります。
Grover探索では、振幅、位相、干渉という考え方が関係します。ただし、ここでは数式ではなく、役割だけを簡単に確認します。
振幅は、測定結果の出やすさに関係する値です。Oracleは、正解の候補に位相反転の印を付けます。Diffuserは、その印を利用して干渉を起こし、正解の候補の確率を高めます。
流れは次の4段階です。
- Hゲートで4つの候補を均等にする
- Oracleで正解の11に印を付ける
- Diffuserで11の確率を高める
- 測定して11が出ることを確認する
ここで重要なのは、Oracleだけでは測定確率は増えないことです。Oracleは正解に印を付ける役割で、その印を使って確率を高めるのがDiffuserです。
生成されるコードは、次のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# Qiskitで量子回路を作るための部品を読み込む from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit # 円周率 pi を読み込む # 今回の回路では使っていないが、Composerが自動で出力することがある from numpy import pi # 2つの量子ビット q を用意する qreg_q = QuantumRegister(2, 'q') # 測定結果を保存するための2つの古典ビット c を用意する creg_c = ClassicalRegister(2, 'c') # 量子ビットと古典ビットを使って回路を作る circuit = QuantumCircuit(qreg_q, creg_c) # 1. 重ね合わせを作る # 2量子ビットなので、00、01、10、11 の4候補を均等にする circuit.h(qreg_q[0]) circuit.h(qreg_q[1]) # 2. Oracle # 今回は 11 を正解として、11 に位相反転の印を付ける circuit.cz(qreg_q[0], qreg_q[1]) # 3. Diffuser # Oracleで印を付けた 11 の確率を高める circuit.h(qreg_q[0]) circuit.h(qreg_q[1]) circuit.x(qreg_q[0]) circuit.x(qreg_q[1]) # Diffuser内の位相反転 circuit.cz(qreg_q[0], qreg_q[1]) circuit.x(qreg_q[0]) circuit.x(qreg_q[1]) circuit.h(qreg_q[0]) circuit.h(qreg_q[1]) # 4. 測定 # 理想的なシミュレータでは 11 が出る circuit.measure(qreg_q[0], creg_c[0]) circuit.measure(qreg_q[1], creg_c[1]) |
2量子ビットで4候補を表せる
まず、q0とq1の両方にHゲートをかけます。これにより、2量子ビットで表せる 00、01、10、11 の4つの候補を同じ確率で用意します。
Oracle: 正解に印を付ける
次に、Oracleで正解の11に印を付けます。ここではCZゲートを使い、11に位相反転の印を付けています。この時点では、まだ11の測定確率が増えるわけではありません。
※ComposerでのCZゲートの作り方
Diffuser: 正解の確率を高める
Diffuserは、Oracleで付けた印を利用して、正解の候補が出やすくなるようにする処理です。今回の2量子ビットの例では、理想的なシミュレータ上で11が測定されます。
測定結果です。すべて11になります。
シミュレータと実機の違い
今回確認している結果は、主に理想的なシミュレータ上の結果です。
シミュレータでは、Bell状態なら00と11だけ、3量子ビットのもつれ状態なら000と111だけが出るように確認できます。
一方、実際の量子コンピュータで実行すると、ノイズや誤差の影響で、本来出ないはずの01、10、001などが少し混ざることがあります。
そのため、実機の結果を見るときは「理想的には何が出るはずか」と「実際にはどのくらい誤差が混ざっているか」を分けて見る必要があります。
まとめ
今回は、IBM Quantum ComposerとQiskitを使って、1量子ビットから3量子ビットまでの簡単な回路と、2量子ビットのGrover探索を確認しました。
- 1量子ビットでは、Hゲートで重ね合わせを作りました。
- 2量子ビットでは、HゲートとCXゲートでBell状態を作りました。
- 3量子ビットでは、CXゲートをもう1つ追加して、3つの量子ビットを測定すると同じ結果になるもつれ状態を確認しました。
- 2量子ビットGrover探索では、OracleとDiffuserを使って11を出やすくしました。
今回は、量子ビットの重ね合わせ、測定、量子もつれ、そしてGrover探索の入口を確認しました。今後もGrover探索の詳細な調査、他のアルゴリズムの利用、また、数学的観点から理解を深めていければと思います。
AMDlabでは、開発に力を貸していただけるエンジニアさんを大募集しております。少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!
中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career
カジュアル面談がエントリーフォームからできるようになりました。
採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!
エントリーフォーム: https://www.amd-lab.com/entry
AMDlabのSNSアカウントです!ぜひフォローお願いします✨
■ X(旧Twitter):https://x.com/amdlabinc
■ Instagram:https://www.instagram.com/amdlabinc/
■ Facebook:https://www.facebook.com/amdlab.lnc/


















COMMENTS