量子回路を1つのユニタリー行列で表したい
量子計算について学習するとき、「今の量子回路のユニタリー行列求めたいなー」って思う時があります。
もちろん、手計算で求められます。
でもqubitが多すぎて行列が大きくなった時は、思いのほか面倒です。
(あるいは単に面倒でやる気が出ない時)
そんな時に、パソコンにユニタリー行列を求めさせる方法について解説します。
1. Qiskitをインストールする
ネットを探したら方法はいくらでも見つかりますので、省略します。
2.Qiskit textbookをインストールする
以下のコマンドを実行します。
pip install git+https://github.com/qiskit-community/qiskit-textbook.git#subdirectory=qiskit-textbook-src
3. 以下のプログラムを実行
from qiskit import *
from qiskit_textbook.tools import array_to_latex
# (1)ユニタリー行列を求めたい量子回路を作る。(ここでは例として、簡単な回路を作ります)
qc = QuantumCircuit(2)
qc.h(0)
qc.x(1)
# あとはコピペでOKです。
# (2)実行して、unitaryを取得します。
backend = Aer.get_backend('unitary_simulator')
unitary = execute(qc,backend).result().get_unitary()
# (3)綺麗に表示します
array_to_latex(unitary, pretext="\\text{Circuit = }\n")
latexを使うので、Jupiter Notebook上で実行するのが良いと思います。
実行結果
具体例を紹介
1qubitに作用させる際、$HZH = X$となります。
- Hゲートによって、基底をZ基底からX基底に変換
- X基底においてZゲートはNOTの作用
- Hゲートによって、基底をX基底からZ基底に変換
よって、$HZH=X$
確認してみましょう。
from qiskit import *
from qiskit_textbook.tools import array_to_latex
# (1)ユニタリー行列を求めたい量子回路を作る。
qc = QuantumCircuit(1)
qc.h(0)
qc.z(0)
qc.h(0)
# あとはコピペでOKです。
# (2)実行して、unitaryを取得します。
backend = Aer.get_backend('unitary_simulator')
unitary = execute(qc,backend).result().get_unitary()
# (3)綺麗に表示します
array_to_latex(unitary, pretext="\\text{Circuit = }\n")
実行結果
ちゃんと$X$ゲートになっていることがわかりますね。
(この記事は https://qiskit.org/textbook/ja/ch-gates/multiple-qubits-entangled-states.html を参照)