本当はNVIDIA cuQuantum量子プログラミングやりたかったのですが、まだGPTもClaudeも両方とも対応をしていませんでした。気を取り直してIBMのQiskitについて見てみたいと思います。
実際にトライしてみましたが、実はQiskitは最新バージョンでは1.0.0で大幅な変更が出ました。各種ChatGPTやClaude3では、前のバージョンの0.46.0で動いていましたので、それで実行します。
一つ目のお題は3量子ビットでのGHZ状態を作ってみます。
まずはGPT-3.5
--------------------
IBMのQiskitを使って3量子ビットのGHZ状態を作成するコードを作って。
--------------------
以下は、Qiskitを使用して3量子ビットのGHZ状態を作成するPythonコードの例です。
from qiskit import QuantumCircuit, Aer, execute
量子回路を作成
qc = QuantumCircuit(3)
アダマールゲートを1番目の量子ビットに適用
qc.h(0)
CNOTゲートを1番目と2番目の量子ビットに適用
qc.cx(0, 1)
CNOTゲートを2番目と3番目の量子ビットに適用
qc.cx(1, 2)
回路を描画
print(qc.draw())
シミュレーターで実行して結果を取得
simulator = Aer.get_backend('statevector_simulator')
result = execute(qc, simulator).result()
statevector = result.get_statevector()
結果を出力
print("Statevector: ", statevector)
このコードは、3量子ビットのGHZ状態を作成するために必要な操作を行います。最初に1番目の量子ビットにアダマールゲートを適用して重ね合わせ状態を作り、その後、1番目と2番目の量子ビット、そして2番目と3番目の量子ビットに順番にCNOTゲートを適用して、エンタングル状態を作り出します。
--------------------
こちらを実際に、pip install qiskit==0.46.0でバージョン指定して実行してみました。
┌───┐
q_0: ┤ H ├──■───────
└───┘┌─┴─┐
q_1: ─────┤ X ├──■──
└───┘┌─┴─┐
q_2: ──────────┤ X ├
└───┘
Statevector: Statevector([0.70710678+0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0.70710678+0.j],
dims=(2, 2, 2))
状態ベクトルできちんとあってる答えが出ました。GPT-3.5でも問題なさそうです。
次にGPT-4
--------------------
GHZ状態は量子情報科学で重要な役割を果たします。3量子ビットのGHZ状態は、すべての量子ビットが完全に相関している量子状態です。この状態は以下のように表されます:
\[ |GHZ\rangle = \frac{1}{\sqrt{2}}(|000\rangle + |111\rangle) \]
この状態を作成するために、IBMのQiskitを使用するコードは以下の通りです:
1. まず、Qiskitライブラリをインポートします。
2. 3量子ビットと3古典ビットの量子回路を作成します。
3. 最初の量子ビットにアダマールゲート(Hゲート)を適用し、重ね合わせ状態を作ります。
4. 次に、最初の量子ビットと他の2つの量子ビット間にCNOTゲートを適用して、量子もつれ状態を作成します。
5. 最後に、量子回路の状態を測定します。
以下に、これらのステップを実装するPythonコードを示します。
from qiskit import QuantumCircuit, Aer, execute
from qiskit.visualization import plot_histogram
3量子ビットと3古典ビットの量子回路を作成
qc = QuantumCircuit(3, 3)
最初の量子ビットにHゲートを適用
qc.h(0)
最初の量子ビットと他の量子ビット間にCNOTゲートを適用
qc.cx(0, 1)
qc.cx(0, 2)
量子ビットの状態を測定
qc.measure([0,1,2], [0,1,2])
回路を表示
print(qc.draw())
シミュレータを使用して回路を実行
simulator = Aer.get_backend('qasm_simulator')
result = execute(qc, simulator, shots=1000).result()
counts = result.get_counts(qc)
測定結果のヒストグラムを表示
plot_histogram(counts)
このコードは、3量子ビットGHZ状態を作成し、その状態を測定する量子回路を作成し、実行します。最終的なヒストグラムでは、約半分の確率で`000`と`111`の結果が観測されるはずです。これは、これら2つの状態の重ね合わせがGHZ状態であることを示しています。
--------------------
こちらも実際にqiskitを実行してみました。GPT-3.5よりもかなり丁寧です。古典のレジスタもきちんと表現してくれてサンプリングができました。
┌───┐ ┌─┐
q_0: ┤ H ├──■────■─────┤M├───
└───┘┌─┴─┐ │ ┌─┐└╥┘
q_1: ─────┤ X ├──┼──┤M├─╫────
└───┘┌─┴─┐└╥┘ ║ ┌─┐
q_2: ──────────┤ X ├─╫──╫─┤M├
└───┘ ║ ║ └╥┘
c: 3/════════════════╩══╩══╩═
さらにヒストグラムまで。GPT-3.5も言えばサンプリングコードも出てくるかもですが、なんかGPT-4は標準で豪華でした。
000と111がでているので、あってます。
次にClaude3です。
Claude3の中間の性能のモデルsonnetを使いました。
--------------------
確かに、IBMのQiskitを使って3量子ビットのGHZ状態を作成するコードを示しましょう。
from qiskit import QuantumCircuit, execute, Aer
3量子ビットの量子回路を作成
qc = QuantumCircuit(3)
Hadamard門を最初の量子ビットに適用
qc.h(0)
CNOT門を使って最初の量子ビットと残りの量子ビットをEntangle
qc.cx(0, 1)
qc.cx(0, 2)
量子回路を描画 (オプション)
qc.draw()
量子回路を実行 (シミュレータ上)
backend = Aer.get_backend('statevector_simulator')
job = execute(qc, backend)
result = job.result()
outputstate = result.get_statevector()
print(f'Output GHZ state: {outputstate}')
このコードでは、以下の手順で3量子ビットのGHZ状態を生成しています。
1. 3量子ビットの量子回路を作成します。
2. 最初の量子ビット (qc.qubits[0]) にHadamard門を適用します。
3. CNOT門 (制御ノットゲート) を使って、最初の量子ビットと残りの2つの量子ビット (qc.qubits[1], qc.qubits[2]) をEntangleさせます。
4. 量子回路を描画するコマンド (qc.draw()) はコメントアウトしてあります。実行する場合はコメントを外してください。
5. 量子回路を実行するために、Aer.get_backend('statevector_simulator') を使ってstatevector simulatorバックエンドを取得します。
6. execute関数を使って量子回路をシミュレータ上で実行し、結果を取得します。
7. 最終的な出力状態ベクトル (GHZ状態) を result.get_statevector() で取得し、表示します。
出力は次のようになります:
Output GHZ state: [0.70710678+0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0. +0.j 0.70710678+0.j]
この出力は、3量子ビットがGHZ状態 (|000>+|111>)/sqrt(2) の重ね合わせ状態にあることを示しています。
--------------------
実行結果も状態ベクトルであっていました。コメント部分が途中Gateが門になってるのがちょっと変ですが、ステップもいい感じですね。
Output GHZ state: Statevector([0.70710678+0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0. +0.j, 0. +0.j,
0. +0.j, 0.70710678+0.j],
dims=(2, 2, 2))
--------------------
全体的には課題が簡単だったので、GPT-3.5からClaude3 sonnetまで問題ありませんでした。サンプルをとるかどうかは指定してなかったので、GPT-4が必ずしも優れているとは言えませんが、まぁいい感じです。
qiskitを使って4量子ビットにおいて1量子ビットのみが1のDicke状態を作れますか?サンプリングを実行してヒストグラムで示してください。
これに関してはどれも成功しませんでした。どのモデルもDicke状態を正しく認識しているようでしたが、コードを正しく作成するには至りませんでした。もちょい学習が必要そうです。
量子コンピュータのコードに関してはかなり初歩的なものを実行できるようです。以上です。