密度演算子・密度行列
お久しぶりです。
色々忙しくて前回から随分間が空いてしまいました。
当初アダマールテストとかのアルゴリズムの記事を書こうとしましたが、それらを勉強したり説明するうえで、部分系や測定や確率分布の話が避けて通れませんでした。
先に密度演算子について解説して、部分系の取り扱い方法を整理しようと思います。
対象とする読者
- 量子プログラミングに興味を持ち始めたばかりのエンジニア
- 量子計算に興味を持ち始めたばかりの高校生・大学生
など
前提とする知識
- ブラケットを使った線形代数がわかること
- 量子状態をブラケットないしBloch球で表現できること
- ユニタリー発展がわかること
- 射影測定がわかること
バージョン情報
- Python 3.9.13
- Qiskit 0.20.2
目次
定義
密度演算子・密度行列は以下で定義されます。
ここで、は量子系のとりうる状態で、はそれに対する確率(実数)です。
性質
トレースは1
トレースとは行列の対角成分だけの和を取ることで、以下となります。
つまり、トレースは確率の和を示しています。
なお、3行目から4行目の計算において、
では正規直交基底のため、となることを利用しています。
対角成分はゼロ以上
対角成分は確率を示すのでそれはそうなのですが、ちゃんと式の上で確かめられます。 ある量子状態をとした場合以下となります。
確率を示す物理量とも言えるので、その期待値がちゃんと確率になっているというのがわかります。
定理
密度演算子のユニタリー発展
状態がユニタリー発展してとなるので
ということで、元の状態とユニタリー発展が既知であれば計算から求められます。
測定後の密度演算子
測定値が得られる測定演算子(射影演算子とは限らない)を使って量子状態を測定した時に、測定値が得られる確率はこちらで説明したように、以下の式で求まります。
で示されるいくつかの量子状態がある場合も同様に、そのに対する条件付き確率は以下で求まります。
ここでの式変形では次の行列の性質を利用しています。
さまざまなについてのを合計することでが得られます。 (確率論の言葉では「周辺化」と言います。)
以上を用いて測定後の密度演算子を求めるが、そのために測定後の量子状態を確認するとこちらで説明したように
となることを用いて、測定後の密度演算子は以下になる
ここで、については確率の乗法法則
より
確率的に分布する量子状態
ある状態が確率で存在するとき、全体の密度演算子は
なぜ密度演算子が必要なのか
量子状態(波動関数・状態ベクトル)はまさに状態そのものを示していますがその係数は確率振幅であるので測定に直接結びつきません。 一方で、密度演算子は確率そのものでそのもので表されているため、測定と直接結びつけることができます。
また、行列成分の現れ方でノイズの影響下にあるのか、エンタングルメント状態なのかなどを判断できます。 測定結果を理論と照らし合わせるために非常に重要です。
一方で、元々使っていた量子状態(波動関数・状態ベクトル)はどういう時に使うかというと位相を解析したい時ですかね、、。
詳しい方いらしゃったらコメントいただけますと嬉しいです。
密度演算子の具体例
よくある例ですけど、せっかくなのでQiskit使って測定まで含めて確認してみます。
純粋状態
測定対象となる状態は
です。 この1つの状態が単一で存在します。
とすると、密度演算子は
対角要素が各状態の確率に等しく、との確率はそれぞれです。
また、
となるのですが、このように
となる状態を純粋状態(Pure State)と言います。
これをZ測定します。 この時の量子回路は以下となります。
この測定結果は下図です。 1024回測定しました。
なお、この時のソースです。
qr = QuantumRegister(1) cr = ClassicalRegister(1) circuit = QuantumCircuit(qr, cr) circuit.h(0) circuit.barrier() circuit.measure(qr, cr) backend = Aer.get_backend('qasm_simulator') job = execute(circuit, backend=backend, shots=1024) job_monitor(job, interval = 2) result = job.result() count = result.get_counts()
混合状態
測定対象となる状態は
か
がそれぞれ確率50%です。 従って密度演算子は
また、
となるのですが、このように
となる状態を混合状態(Mixed State)と言います。
これをZ測定します。
こちらも対角要素が各状態の確率に等しく、との確率はそれぞれです。
ただし、量子回路は以下のどちらかを50%のランダムで実行することになります。
量子ビットにXゲートがかかるかかからないかを乱数で50%の確率で決めます。
この測定結果は下図です。
なお、この時のソースです。(※実行するには時間がかかります)
gates = [1 if val >= 0.5 else 0 for val in np.random.rand(1024)] results = list() for idx, gate in enumerate(gates): qr = QuantumRegister(1) cr = ClassicalRegister(1) circuit = QuantumCircuit(qr, cr) if gate: circuit.x(0) circuit.barrier() circuit.measure(qr, cr) backend = Aer.get_backend('qasm_simulator') job = execute(circuit, backend=backend, shots=1) job_monitor(job, interval = 2) result = job.result() count = result.get_counts() results.append(count) counts_classic = {'0': 0, '1': 0} for result in results: for bit, count in result.items(): counts_classic[bit] += count plot_histogram(counts_classic)
重ね合わせ状態と混合状態の見分け方
重ね合わせ状態も古典的混合も似たような結果になりました。
数式だとはっきり違いがわかりますが、測定だと違いがわかりません。
測定対象の量子系が重ね合わせ状態か混合状態かどちらなのか予めわからない場合、またより一般的に対象の系がどのような理論やモデルに基づくのかがわからない場合にどうやって測定から見分けたらいいでしょうか?
これが密度演算子で理解できます。
先ほどの例ではZ測定するつもりで、密度演算子もZ基底で記述しました。
これをX測定してみます。
重ね合わせ状態
測定対象となる状態は
です。 この1つの状態が単一で存在します。
とすると、密度演算子は
状態である確率100%です。
今度の量子回路はこちらになります。
この測定結果は下図です。 1024回測定しました。
予定通り100%で観測されました。(アダマールゲートで基底変換しているので、この図のがに相当します。)
この時のソースは以下です。
qr = QuantumRegister(1) cr = ClassicalRegister(1) circuit = QuantumCircuit(qr, cr) circuit.h(0) circuit.barrier() circuit.h(0) circuit.measure(qr, cr) backend = Aer.get_backend('qasm_simulator') job = execute(circuit, backend=backend, shots=1024) job_monitor(job, interval = 2) result = job.result() count = result.get_counts() plot_histogram(count)
混合状態
一方で混合状態をX基底で記述すると以下になります。
か
がそれぞれ確率50%です。 従って密度演算子は
ということで、Z基底で記述した時と同じく、と状態が50%ずつの確率となります。
この時の量子回路は以下のどちらかとなります。
この測定結果は以下となります。
ということで、密度演算子から考えた通り、と状態が約50%ずつで観測されました。
このように未知の量子系であっても、適切な測定方法を用いることで得られる確率分布と理論を照らし合わせて、モデル・量子系を推定することができます。
この時のソースは以下です。
gates = [1 if val >= 0.5 else 0 for val in np.random.rand(1024)] results = list() for idx, gate in enumerate(gates): qr = QuantumRegister(1) cr = ClassicalRegister(1) circuit = QuantumCircuit(qr, cr) if gate: circuit.x(0) circuit.barrier() circuit.h(0) circuit.measure(qr, cr) if idx < 10: fig, ax = plt.subplots(1, 1) circuit.draw(output='mpl', ax=ax) plt.show() plt.close() backend = Aer.get_backend('qasm_simulator') job = execute(circuit, backend=backend, shots=1) job_monitor(job, interval = 2) result = job.result() count = result.get_counts() results.append(count) counts_classic = {'0': 0, '1': 0} for result in results: for bit, count in result.items(): counts_classic[bit] += count plot_histogram(counts_classic)
量子状態トモグラフィー
上記では簡単な例で実験結果と理論を比較して状態を推定するということを紹介しました。 実際にはより多量子ビット系になりますが要領は同じで、さまざまな測定から密度演算子の要素を推定し、理論と照らし合わせて量子状態を推定します。 このような手法を「量子状態トモグラフィー」と言います。 「トモグラフィー」は物理学に限らず一般的な言葉で、日常で触れるところではMRIの画像がそうです。 磁気共鳴の空間分布を解析することによって、脳や臓器の構造と状態を指定しそして可視化しています。
参考までに量子状態トモグラフィーについて以下の記事を紹介します。
いずれこのブログでも解説してみたいですが、いつになることやら、、。
部分系・部分トレース
量子系Aと量子系Bの複合系がある時の全体系の密度演算子をとします。
例えば、二つの量子ビットからなる一つの量子系でも良いです。
この時、二つの量子ビットをどちらも測定すればの4状態の確率は密度演算子の対角成分に示された通りになるでしょう。
では、量子ビットAだけを測定した場合、量子ビットAの状態 が測定される確率、またAの密度演算子はどのようになるでしょうか?という問題です。
結論としては次の式です。
Bについてだけトレースを取ります。(トレースアウトする、とよく言います。)
実際にはより具体的にの成分を計算する際に以下のように計算します。
もしくはのように簡単に表せる場合は以下で計算できます。
Bell状態を使った具体例
Bell状態の一つ
の密度演算子は以下です。
これを実際にについてトレースアウトすると以下です。
ということで、量子ビットAはとがそれぞれ確率で観測されます。 また
から、この状態は混合状態だということがわかりました。
このBell状態を使った例は計算結果と実際に測定される状態のイメージがつきやすいわかりやすい例でしたが、この部分トレースという方法は一般の自明でない状態についての確率を予め計算から見積もりたい時に強力なツールとなります。
まとめ
今回は密度演算子の基礎について説明しました。
- 密度演算子は各状態の確率を示す演算子
- 密度演算子のトレース(全状態の確率の和)は1
- 密度演算子の対角成分は非負
- 密度演算子の自乗のトレースを計算することでその状態が純粋状態か混合状態かを見分けることが可能
- 部分的に量子ビットを測定する場合の密度演算子は測定しない量子ビットの分を部分トレースすることで計算可能
次回はこれらを用いてアダマールテストについて解説する予定です。
また、今年、2022年4月よりフリーランスのデータサイエンティストとして活動することになりました。
量子アプリケーション開発というものはまだ市場がほとんどありませんので、主な事業は通常のシステム開発や人工知能アプリケーション開発、またデータ分析の業務委託です。
このブログでの機械学習や量子計算・量子コンピュータについての解説や情報発信は引き続き行いますので、今後とも読んでいただけますと嬉しいです。
私の事業用のホームページがこちらになります。
参考文献
- 量子情報科学ウィンタースクール2010 2日目:量子情報理論の基礎Iの14ページ以降
- エンタングル状態
- 密度演算子 - 純粋状態・混合状態 - 量子コンピュータ入門 - 物理とか
- 量子力学的測定の定式化と部分系・部分トレース - 物理とかの4.部分トレース
- 量子計算量理論入門の2.4混合状態(36ページ)
- 量子力学II講義ノートの1.5 密度演算子(16ページ)