目的
Juliaの量子計算シミュレーションのパッケージで"Yao.jl"というものを見つけたので少し遊んでみよう。
今回はGHZ状態を作成しながら基本的な操作補法を学ぶ。
道具をそろえる
using Yao
using BitBasis
using Plots
gr()
量子回路の作成
circuit = chain( # {ではない}
4, #4-qubit
# 以降の操作の順番は量子回路の入力から出力への順番に対応している。
put(1=>X), #1番目のqubitにPauli-X
repeat(H,2:4), #2~4番目のqubitにHadamard
control(2, 1=>X), #2から1に向けてcontrol-X
control(4, 3=>X),
control(3, 1=>X),
control(4, 3=>X),
repeat(H, 1:4),
)
初期状態の作成
量子状態を表すものとしてArrayRegが用意されている。状態 $\left| 0000\right>$を作成するには主に2つ方法があり
zero_state(4)
ArrayReg(bit"0000")
初期状態に回路を作用させる
apply!(zero_state(4), circuit)
観測する
観測するには今までの
- 初期状態の作成
- 回路を作用
- 観測
を続けて行わないといけないがこれにはパイプ|>
を使うことができる
観測を1000回行うと
results = zero_state(4) |> circuit |> r->measure(r, nshots=1000)
これを最後にヒストグラムで見たいのだが、resultsはBitStr型になっていてこれを整数に戻す必要がある。これにはBitBasisの関数としてbintが用意されているのでこれを作用させればよく。
num_result=bint.(results) #整数値に変換
histogram(num_result)
とすると
となる。予想していたように
$$\left| GHZ\right>=\frac{1}{\sqrt{2}}\left| 0000\right>+\frac{1}{\sqrt{2}}\left| 1111\right>$$
となる。
次回
次回では初学者には想像しにくいOrder findingの出力状態を見てみる。