Docker, Jupyter-notebook, JuliaでQiskitを使った量子計算の学習

Macで確認しましたが、WindowsでもLinuxでもDockerが使える環境なら使えると思います。

:::note warn
PythonのQiskitをJuliaから呼んでるだけなので、特にJuliaにこだわりの無い方は普通にこっち↓でやった方が良いでしょう。juliaでやると結構ハマり点が多くて苦労します。
:::

https://qiita.com/gAuk/items/766dccae5c44a955883c


適当なディレクトリを作って、

```shell
mkdir qiskit_julia && cd qiskit_julia
```

適当なテキストエディタでDockerfileとdocker-compose.ymlを作る。

```Dockerfile:Dockerfile
FROM jupyter/datascience-notebook

USER ${NB_UID}

# Add Julia packages.
RUN julia -e 'import Pkg; Pkg.update()' && \
    julia -e 'import Pkg; Pkg.add("PyCall"); Pkg.add("PyPlot"); Pkg.add("Distributions"); Pkg.add("ForwardDiff")' && \
    python -m pip install --upgrade pip && \
    python -m pip install qiskit qiskit-terra[visualization] \
                          git+https://github.com/qiskit-community/qiskit-textbook.git#subdirectory=qiskit-textbook-src
```

```yaml:docker-compose.yml
version: "3.8"
services:
  julia-qiskit-notebook:
    build: .
    image: julia-qiskit-notebook
    volumes: 
        - ${PWD}/:/home/jovyan/work
    ports:
        - 8888:8888
    container_name: julia-qiskit-notebook
    environment:
        - JUPYTER_ENABLE_LAB=yes
```

下の様にコンテナを立ち上げると、

```shell
docker-compose up
```

こんなのが出てくるので、

```shell_session
julia-qiskit-notebook  | [C 2022-04-14 06:03:19.548 ServerApp]
julia-qiskit-notebook  |
julia-qiskit-notebook  |     To access the server, open this file in a browser:
julia-qiskit-notebook  |         file:///home/jovyan/.local/share/jupyter/runtime/jpserver-9-open.html
julia-qiskit-notebook  |     Or copy and paste one of these URLs:
julia-qiskit-notebook  |         http://[何か英数字列]:8888/lab?token=[何か英数字列]
julia-qiskit-notebook  |      or http://127.0.0.1:8888/lab?token=[何か英数字列]
```

`http://127.0.0.1:8888/?token=[何か英数字列]`の箇所を選択し、URLとしてブラウザで開きます。

Jupyter Notebookが立ち上がるので、後はこのサイトを見て学習すれば良いが、

https://qiskit.org/textbook/ja/preface.html

pythonとjuliaの違いで、ソースを少し書き換える必要がある。例えば、pythonのコード

```python
# Click 'try', then 'run' to see the output,
# you can change the code and run it again.
print("This code works!")
from qiskit import QuantumCircuit
qc = QuantumCircuit(2) # Create circuit with 2 qubits
qc.h(0)    # Do H-gate on q0
qc.cx(0,1) # Do CNOT on q1 controlled by q0
qc.measure_all()
qc.draw('mpl')
```

は、juliaでは

```julia
using PyCall
using PyPlot
qk = pyimport("qiskit")
# Click 'try', then 'run' to see the output,
# you can change the code and run it again.
print("This code works!")
# from qiskit import QuantumCircuit
qc = qk.QuantumCircuit(2) # Create circuit with 2 qubits
qc.h(0)    # Do H-gate on q0
qc.cx(0,1) # Do CNOT on q1 controlled by q0
qc.measure_all()
print(qc.draw("mpl"))
```

:::note warn
`qc.draw("mpl")`の文字列引数はpythonではシングルクォートだが、juliaではダブルクォートになる。
:::

:::note warn
最終行の`print(qc.draw("mpl"))`だが、`qc.draw("mpl")`と書いてもエラーにはならないが、同じ図が２つも表示されてしまう。
表示形式がmplでなくても良い場合は`qc.draw()`と書き`print`は要らない。逆に`print(qc.draw())`と書くと図が汚く表示されてしまう。
:::

他にも、pythonで、

```python
from math import sqrt
qc = QuantumCircuit(1) # qcを再定義します。
initial_state = [0+1.j/sqrt(2), 1/sqrt(2)+0.j]
qc.initialize(initial_state, 0)
qc.draw("mpl")
```

が、juliaで、

```julia
qc = qk.QuantumCircuit(1) # qcを再定義します。
initial_state = [0+1im/sqrt(2), 1/sqrt(2)+0im]
qc.initialize(initial_state, 0)
print(qc.draw("mpl"))
```

とか… まあpythonとjuliaの違いを理解していれば良いだけかも知れません。

ブロッホ球とかも出せます。
python

```python
from math import pi
from qiskit_textbook.widgets import plot_bloch_vector_spherical
coords = [pi/2,0,1] # [Theta, Phi, Radius]
plot_bloch_vector_spherical(coords) # 球面座標を持つブロッホベクトル
```

julia

```julia
widgets = pyimport("qiskit_textbook.widgets")
coords = [pi/2,0,1] # [Theta, Phi, Radius]
print(widgets.plot_bloch_vector_spherical(coords)) # 球面座標を持つブロッホベクトル
```