qiskitのplot_state_paulivec（複数ビット時）

# はじめに
https://qiita.com/shnchr/items/8bcf1a351a89b2e07b65

の記事で、下記のプロットについて書こうと思ったのですが、、、
書き始めたら意外に記事の量が膨らんでしまったので、こちらに切り出しました。
このグラフについて説明していきます。

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/22c0f335-ce14-e4af-4c45-0e034a99cffd.png>
<details><summary>サンプルコード</summary><div>

```python
# https://qiskit.org/documentation/stubs/qiskit.visualization.plot_state_paulivec.html より引用
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_state_paulivec
%matplotlib inline

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)

state = Statevector.from_instruction(qc)
plot_state_paulivec(state, color='midnightblue',
     title="New PauliVec plot")
```

</div></details>

また、他の量子コンピュータ関係の他の記事は、下記で紹介しています。

https://qiita.com/shnchr/items/41fa7fd1284d74007a7c

```math
% basic braket 
\newcommand{\bra}[1]{\left\langle #1 \right|}
\newcommand{\ket}[1]{\left| #1 \right\rangle}
\newcommand{\bracket}[2]{\left\langle #1 \middle| #2 \right\rangle}
\newcommand{\ketbra}[2]{\left| #1 \right\rangle \left\langle #2 \right|}
\newcommand{\ketbraket}[3]{\left| #1 \right\rangle \left\langle #2 \middle| #3 \right\rangle}
% small-size
\newcommand{\bras}[1]{\left\langle {\scriptsize #1}  \right|}
\newcommand{\kets}[1]{\left| {\scriptsize #1}  \right\rangle}
\newcommand{\brackets}[2]{\left\langle {\scriptsize #1} \middle| {\scriptsize #2} \right\rangle}
\newcommand{\ketbras}[2]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \right|}
\newcommand{\ketbrakets}[3]{\left| {\scriptsize #1} \right\rangle \left\langle {\scriptsize #2} \middle| {\scriptsize #3} \right\rangle}
% Matrix
\newcommand{\tate}[2]{\begin{bmatrix} #1 \\ #2 \end{bmatrix}}
\newcommand{\yoko}[2]{\begin{bmatrix} #1 & #2 \end{bmatrix}}
\newcommand{\mtrx}[4]{\begin{bmatrix} #1 & #2 \\ #3 & #4 \end{bmatrix}}
% Matrix largesize
\newcommand{\tateL}[4]{\begin{bmatrix} #1 \\ #2 \\ #3 \\ #4 \end{bmatrix}}
\newcommand{\yokoL}[4]{\begin{bmatrix} #1 & #2 & #3 & #4 \end{bmatrix}}
```

# 計算アウトライン
状態ベクトル$\ket{\psi}$に対し、演算子$\rho=\ketbra{\psi}{\psi}$の計算結果をパウリ行列で分解した結果を表示している旨は、前回の記事で説明しておりますので、今回はこの計算を行い、上記グラフと一致するかを確認します。

<details><summary>サンプルコード</summary><div>

```python
# https://qiskit.org/documentation/stubs/qiskit.visualization.plot_state_paulivec.html より引用
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_state_paulivec
%matplotlib inline

qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)

state = Statevector.from_instruction(qc)
plot_state_paulivec(state, color='midnightblue',
     title="New PauliVec plot")
```

</div></details>

まずは、サンプルコードを見ると、この量子回路は2量子のもつれあいである$Bell$状態を作ります。
つまり、

```math
\ket{\psi} = \ket{Bell} = \frac{1}{\sqrt{2}}(\ket{00} + \ket{11})
```

です。

* $\ket{00} = \ket{0} \otimes \ket{0}$とテンソル積となるので、$\ket{00},\ket{11}$等のテンソル積が必要になります
* また、パウリ行列も、$XX,YY,ZZ,II$等の行列のテンソル積となるので、こちらも事前に計算が必要です。

よって、

1. まずは、計算に必要なテンソル積を事前に計算し
1. 状態ベクトル$\ket{\psi}$に対して、演算子$\rho=\ketbra{\psi}{\psi}$を計算する
1. qiskitのplot_state_paulivecと見比べてみる

の順で進めたいと思います。

# テンソル積を計算する
事前の準備です。計算に必要なテンソル積を計算しておきます。
### |00>

```math
\ket{00} = \ket{0} \otimes \ket{0} 
= \tate{1}{0} \otimes \tate{1}{0} 
= \tate{1 \times \tate{1}{0}}{0 \times \tate{1}{0}} 
= \tateL{1}{0}{0}{0}
```
### |11>

```math
\ket{11} = \ket{1} \otimes \ket{1} 
= \tate{0}{1} \otimes \tate{0}{1} 
= \tate{0 \times \tate{0}{1}}{1 \times \tate{0}{1}} 
= \tateL{0}{0}{0}{1}
```

### II

```math
II = \mtrx{1}{0}{0}{1} \otimes \mtrx{1}{0}{0}{1}
= \mtrx{1 \mtrx{1}{0}{0}{1}}{0}{0}{1 \mtrx{1}{0}{0}{1}} 
= 
\begin{bmatrix} 
   1 & 0 & 0 & 0 \\ 
   0 & 1 & 0 & 0 \\ 
   0 & 0 & 1 & 0 \\
   0 & 0 & 0 & 1
\end{bmatrix}
```

### XX
```math
XX = \mtrx{0}{1}{1}{0} \otimes \mtrx{0}{1}{1}{0}
= \mtrx{0}{1\mtrx{0}{1}{1}{0}}{1\mtrx{0}{1}{1}{0}}{0}
= 
\begin{bmatrix} 
   0 & 0 & 0 & 1 \\ 
   0 & 0 & 1 & 0 \\ 
   0 & 1 & 0 & 0 \\
   1 & 0 & 0 & 0
\end{bmatrix}
```

### YY
```math
YY = \mtrx{0}{-i}{i}{0} \otimes \mtrx{0}{-i}{i}{0} 
= \mtrx{0}{-i\mtrx{0}{-i}{i}{0} }{i\mtrx{0}{-i}{i}{0} }{0}
= 
\begin{bmatrix} 
   0 & 0 & 0 & -1 \\ 
   0 & 0 & 1 & 0 \\ 
   0 & 1 & 0 & 0 \\
   -1 & 0 & 0 & 0
\end{bmatrix}
```

### ZZ

```math
ZZ = \mtrx{1}{0}{0}{-1} \otimes \mtrx{1}{0}{0}{-1}
= \mtrx{1\mtrx{1}{0}{0}{-1}}{0}{0}{-1\mtrx{1}{0}{0}{-1}}
= 
\begin{bmatrix} 
   1 & 0 & 0 & 0 \\ 
   0 & -1 & 0 & 0 \\ 
   0 & 0 & -1 & 0 \\
   0 & 0 & 0 & 1
\end{bmatrix}
```

# ρ=|ψ><ψ|を計算する
やっと、準備が整いました。

```math
\ket{\psi} = \frac{1}{\sqrt{2}}(\ket{00} + \ket{11})
 =
\frac{1}{\sqrt{2}}
\left(
\tateL{1}{0}{0}{0} + 
\tateL{0}{0}{0}{1}
\right) = 
\frac{1}{\sqrt{2}}\tateL{1}{0}{0}{1}
```

の状態$\ket{\psi}$に対し、演算子$\rho=\ketbra{\psi}{\psi}$を計算します。

```math
\rho =\ketbra{\psi}{\psi} =　\frac{1}{\sqrt{2}}\frac{1}{\sqrt{2}}\tateL{1}{0}{0}{1}\yokoL{1}{0}{0}{1}
=
\frac{1}{2}
\begin{bmatrix} 
   1 & 0 & 0 & 1 \\ 
   0 & 0 & 0 & 0 \\ 
   0 & 0 & 0 & 0 \\
   1 & 0 & 0 & 1
\end{bmatrix}
```

この行列と、qiskitのグラフを見比べます

# qiskitのplot_state_paulivecと見比べてみる
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183826/22c0f335-ce14-e4af-4c45-0e034a99cffd.png>

によると、

```math
\displaylines{
\frac{1}{4}II + \frac{1}{4}XX - \frac{1}{4}YY + \frac{1}{4}ZZ
\\
= \frac{1}{4}
\left(
\begin{bmatrix} 
   1 & 0 & 0 & 0 \\ 
   0 & 1 & 0 & 0 \\ 
   0 & 0 & 1 & 0 \\
   0 & 0 & 0 & 1
\end{bmatrix}
+
\begin{bmatrix} 
   0 & 0 & 0 & 1 \\ 
   0 & 0 & 1 & 0 \\ 
   0 & 1 & 0 & 0 \\
   1 & 0 & 0 & 0
\end{bmatrix}
\color{red}{-1}
\begin{bmatrix} 
   0 & 0 & 0 & -1 \\ 
   0 & 0 & 1 & 0 \\ 
   0 & 1 & 0 & 0 \\
   -1 & 0 & 0 & 0
\end{bmatrix}
+
\begin{bmatrix} 
   1 & 0 & 0 & 0 \\ 
   0 & -1 & 0 & 0 \\ 
   0 & 0 & -1 & 0 \\
   0 & 0 & 0 & 1
\end{bmatrix}
\right)
\\
=\frac{1}{4}
\begin{bmatrix} 
   2 & 0 & 0 & 2 \\ 
   0 & 0 & 0 & 0 \\ 
   0 & 0 & 0 & 0 \\
   2 & 0 & 0 & 2
\end{bmatrix}
=\frac{1}{2}
\begin{bmatrix} 
   1 & 0 & 0 & 1 \\ 
   0 & 0 & 0 & 0 \\ 
   0 & 0 & 0 & 0 \\
   1 & 0 & 0 & 1
\end{bmatrix}
}
```

よって、先程の演算子$\rho=\ketbra{\psi}{\psi}$の計算結果と一致するので、

```math
\therefore \rho =\ketbra{\psi}{\psi}= 0.25II + 0.25XX - 0.25YY + 0.25ZZ
```

とplot_state_paulivecのグラフが、上記の通り、Bell状態をパウリゲートのテンソル積で表現されていることがわかりました。

# まとめ
別出しでまとめてみましたが、やはり、数式多めとなってしまいました。
どなたかのお役に立てばと。。