見出し画像

qiskit動かしてみた

量子プログラミングができる
qiskitを動かしてみました

普通に
pip install qiskit
して

from qiskit.quantum_info import SparsePauliOp, Pauli
from qiskit.transpiler import CouplingMap
from rustworkx.visualization import graphviz_draw
import numpy as np

# L is the number of sites, also the length of the 1D spin chain
L = 10  

# Generate the coupling map
elist = [(i - 1, i) for i in range(1, L)]
# Generate an edge-coloring so we can make hw-efficient circuits
even_edges = elist[::2]
odd_edges = elist[1::2]
coupling_map = CouplingMap(elist)

# Generate random coefficients for our XXZ Hamiltonian
np.random.seed(0)
Js = np.random.rand(L - 1) + 0.5 * np.ones(L - 1)
hamiltonian = SparsePauliOp(Pauli("I" * L))
for i, edge in enumerate(even_edges + odd_edges):
    hamiltonian += SparsePauliOp.from_sparse_list(
        [
            ("XX", (edge), Js[i] / 2),
            ("YY", (edge), Js[i] / 2),
            ("ZZ", (edge), Js[i]),
        ],
        num_qubits=L,
    )

# Generate a ZZ observable between the two middle qubits
observable = SparsePauliOp.from_sparse_list(
    [("ZZ", (L // 2 - 1, L // 2), 1.0)], num_qubits=L
)

print("Hamiltonian:", hamiltonian)
print("Observable:", observable)
graphviz_draw(coupling_map.graph, method="circo")

確か公式から拾ってきたサンプルコード。
実行結果

Hamiltonian: SparsePauliOp(['IIIIIIIIII', 'IIIIIIIIXX', 'IIIIIIIIYY', 'IIIIIIIIZZ', 'IIIIIIXXII', 'IIIIIIYYII', 'IIIIIIZZII', 'IIIIXXIIII', 'IIIIYYIIII', 'IIIIZZIIII', 'IIXXIIIIII', 'IIYYIIIIII', 'IIZZIIIIII', 'XXIIIIIIII', 'YYIIIIIIII', 'ZZIIIIIIII', 'IIIIIIIXXI', 'IIIIIIIYYI', 'IIIIIIIZZI', 'IIIIIXXIII', 'IIIIIYYIII', 'IIIIIZZIII', 'IIIXXIIIII', 'IIIYYIIIII', 'IIIZZIIIII', 'IXXIIIIIII', 'IYYIIIIIII', 'IZZIIIIIII'],
              coeffs=[1.        +0.j, 0.52440675+0.j, 0.52440675+0.j, 1.0488135 +0.j,
 0.60759468+0.j, 0.60759468+0.j, 1.21518937+0.j, 0.55138169+0.j,
 0.55138169+0.j, 1.10276338+0.j, 0.52244159+0.j, 0.52244159+0.j,
 1.04488318+0.j, 0.4618274 +0.j, 0.4618274 +0.j, 0.9236548 +0.j,
 0.57294706+0.j, 0.57294706+0.j, 1.14589411+0.j, 0.46879361+0.j,
 0.46879361+0.j, 0.93758721+0.j, 0.6958865 +0.j, 0.6958865 +0.j,
 1.391773  +0.j, 0.73183138+0.j, 0.73183138+0.j, 1.46366276+0.j])
Observable: SparsePauliOp(['IIIIZZIIII'],
              coeffs=[1.+0.j])

ハミルトニアンと可観測量がSparsePauliOp形式で表示されている・・

らしい

この数字が一体何を意味するのか

o1 pro modeに聞いてみた

あなたのコードは正常に動作し、指定したハミルトニアンと可観測量がSparsePauliOp形式で表示されています。この表示は、組み上がった量子オペレーター(ハミルトニアンおよびオブザーバブル)をQiskitが内部的に扱いやすいデータ構造で出力しているということです。

以下、出力の意味を詳しく解説します。
Hamiltonianの出力について
Hamiltonian: の後に表示されているものは SparsePauliOp というQiskitのクラスで、量子ビット列に対応するパウリ文字列と、それぞれの項に対応する複素係数のリストが表示されています。
例えば、
arduino
コードをコピーする
'IIIIIIIIXX', 'IIIIIIIIYY', 'IIIIIIIIZZ', ...
のようなパウリ演算子が多数並んでいます。これは10量子ビット("I"がアイデンティティ)に対して、特定の2つ(あるいは位置)にXやY、Zが適用される項が並んでいることを示しています。
'I'はその量子ビットに対して恒等演算子、'X','Y','Z'は対応するパウリ演算子を意味します。
Hamiltonianは元々あなたが指定したXXZモデル的な相互作用(XX, YY, ZZ)を加算して作ったので、列挙されている文字列はその相互作用項の一覧、係数はランダムに生成したJ値が反映されています。
Observableの出力について
Observable: の後には、
css
「成功した?」について
あなたのコードは問題なく実行され、指定通りのハミルトニアンとオブザーバブルを作成しています。そのため、「成功した」と言えます。この出力は、ハミルトニアンや可観測量が適切に構築され、SparsePauliOpとして格納されていることを確認するためのログのようなものです。
グラフの描画について
graphviz_draw(coupling_map.graph, method="circo") でカップリングマップ(1次元スピン鎖に対応する隣接関係)がグラフとして表示されます。これは量子ビットが一直線上に並び、隣接するビット同士にエッジが存在することを図示します。


まとめると、表示された出力は、あなたが意図したハミルトニアンとオブザーバブルが正しくQiskit内部で構築・格納されており、その構造をわかりやすくテキスト出力したものです。これが表示されたのでコードは正常に動作している、と解釈できます。

ChatGPT o1 pro mode

なるほど 量子に詳しくないプログラマーにそれをわかるように説明してみて

量子には詳しくないエンジニア向けに、今回のコードの動作結果をかみ砕いて説明します。

あなたが書いたコードは、「量子ビット」と呼ばれる複数の要素(今回は10個)に対して「ハミルトニアン」と「観測演算子」という特殊なオブジェクトを組み立てる処理を行っています。これらは、量子計算や量子シミュレーションを行う上で必要な、「計算ルール」や「計算結果の読み取り方法」を定義するための道具です。ハミルトニアン (Hamiltonian)
これは「量子系のエネルギー構造」を表す数式みたいなものです。何が起きているかというと、「X」、「Y」、「Z」という演算(パウリ演算子といいます)を、特定の量子ビットに当てて、その結果を足し合わせて一つの複雑な数式(オペレーター)を作っています。
出力に現れる IIIIIIIIXX などの文字列は、「10個の量子ビットのうち、一番右側の2つにX演算子を当て、それ以外は特に何もしない(Iと書く)」という指示を表しています。coeffs=[...]は、その演算子がハミルトニアンに加わる時の「重み」を示しています。
観測演算子 (Observable)
これは「量子計算が終わった後、どうやって結果を測定するか?」というルールを表します。IIIIZZIIII のような文字列は、「ちょうど真ん中あたりの2つの量子ビットにZ演算子を当てて測定し、それ以外は無視」という設定を意味します。
SparsePauliOp
Qiskitというフレームワーク上では、量子演算子(ハミルトニアンや観測演算子)はコンピュータで扱いやすい内部形式にしておく必要があります。SparsePauliOpは、Qiskitが扱う「パウリ演算子の集合」を効率的に表現するためのクラスです。
要は、ハミルトニアンや観測演算子という複雑な数式を、コンピュータが理解しやすいデータ構造として、パウリ文字列とその係数の組み合わせで保存しています。


あなたのコードは、こうしたハミルトニアンと観測演算子を正しく組み立て、その結果をコンソールに表示しています。この表示が出たということは、コードは正しく動作して、意図通りのハミルトニアンや観測演算子がQiskit内で生成された、ということです。
またgraphviz_drawによるグラフは、10個の量子ビットが1列に並んで、それぞれ隣り合う量子ビット同士がどうつながっているかを示しています。

まとめると、表示された出力は、「量子計算向けの特殊な数式(ハミルトニアンや観測演算子)をQiskitが理解できる形で作れましたよ」という確認メッセージのようなものです。

ChatGPT o1 pro mode

いいなと思ったら応援しよう!