AI&Julia #11|量子計算 » 1量子ビットで重ね合わせ
はじめに
1量子ビットで重ね合わせ状態を生成することを考えます。まずは、量子ビットについて理解するところから始めて、手計算で重ね合わせ状態を導きます。そして、重ね合わせ状態が測定によって崩壊することをYaoによるシミュレーションで確認します。
量子ビットとは何か?
ここでは 1量子ビットについて見ていきます。1量子ビットは無限の量子状態を取り得ますが、これを可視化する方法として図 1のブロッホ球を用います。

図 1 ブロッホ球(1量子ビット)
状態ベクトルと確率振幅
状態ベクトル
ここで、量子状態
したがって、状態ベクトル
確率振幅
また、確率の合計が
この条件を満たす
基底と量子状態
ブロッホ球において、基底と量子状態は次のように対応しています。
| 基底 | 量子状態 |
|---|---|
|
|
基本的な量子状態 |
|
|
重ね合わせ状態 |
|
|
重ね合わせ状態 |
基本的な量子状態
重ね合わせ状態
一方でこれら4つの違いは、相対位相
重ね合わせの計算方法
1量子ビットで重ね合わせ状態を生成するには、1量子ビットを
この計算を通じて、
測定による状態の崩壊
重ね合わせ状態
実装例
重ね合わせの実装方法にはいくつかのパターンがありますが、次の 3パターンを実装します。
- 手計算を再現したバージョン(⇨ 式
)(3.2) - 量子回路バージョン
- 簡潔なバージョン
using Yao, LinearAlgebra, Random, Printf
# 1量子ビットで重ね合わせ(手計算を再現したバージョン)
function superposition_matrix()::ArrayReg
ketv = [1; 0] # 初期状態 |0⟩
H = (1 / √2) * [1 1; 1 -1] # ハダマード行列 H
ψ = ComplexF64.(H * ketv) # 状態変換 H|0⟩
ArrayReg(ψ) # 状態レジスタに変換
end
# 1量子ビットで重ね合わせ(量子回路バージョン)
function superposition_qcircuit()::ArrayReg
reg = zero_state(1) # 初期状態 |0⟩
qc = chain(1, put(1 => H)) # Hゲートを1量子ビットめに作用させる回路を作成
apply!(reg, qc) # 回路を状態に作用させる
end
# 1量子ビットで重ね合わせ(簡潔なバージョン)
superposition_simple()::ArrayReg = zero_state(1) |> H # H|0⟩
# 確率振幅(α, β)を表示
function raw_amplitude(reg)
println("確率振幅:")
@printf " α: %s\n" reg.state[1]
@printf " β: %s\n\n" reg.state[2]
end
# Z基底で測定した場合の理論的な確率を表示(確率振幅からを計算)
function raw_theoretical(reg)
println("理論的な確率:")
@printf " |0⟩: %.16f\n" abs2(reg.state[1])
@printf " |1⟩: %.16f\n\n" abs2(reg.state[2])
end
# 測定(観測)結果を表示
function raw_measured_value(vec, nshots)
freq = (count(x -> x == 0, vec), # 0が観測された回数
count(x -> x == 1, vec)) # 1が観測された回数
prob = (freq[1] / nshots, # 0の確率
freq[2] / nshots) # 1の確率
@printf "観測結果 (%d回):\n" nshots
@printf " 0: %d回(確率 = %.7f)\n" freq[1] prob[1]
@printf " 1: %d回(確率 = %.7f)\n\n" freq[2] prob[2]
end
# ハンズオン(重ね合わせの実行と測定結果の表示)
function handson(superposition::Function)
nshots = 10000000 # 測定回数(1千万回)
Random.seed!(3407) # 乱数の系列を固定して結果の再現性を確保
reg = superposition() # 1量子ビットで重ね合わせ状態を生成
raw_amplitude(reg) # 確率振幅(α, β)を表示
raw_theoretical(reg) # Z基底で測定した場合の理論的な確率を表示
vec = measure(reg, nshots=nshots) # 測定
raw_measured_value(vec, nshots) # 測定(観測)結果を表示
end
実行例
上で実装した重ね合わせを 3パターンとも実行しますが、結論から言うと実行結果はすべて一致します。したがって、実行結果の検討はどれか 1つだけで充分です。
手計算を再現したバージョン
handson(superposition_matrix)
確率振幅:
α: 0.7071067811865475 + 0.0im
β: 0.7071067811865475 + 0.0im
理論的な確率:
|0⟩: 0.4999999999999999
|1⟩: 0.4999999999999999
観測結果 (10000000回):
0: 5001005回(確率 = 0.5001005)
1: 4998995回(確率 = 0.4998995)
量子回路バージョン
handson(superposition_qcircuit)
確率振幅:
α: 0.7071067811865475 + 0.0im
β: 0.7071067811865475 + 0.0im
理論的な確率:
|0⟩: 0.4999999999999999
|1⟩: 0.4999999999999999
観測結果 (10000000回):
0: 5001005回(確率 = 0.5001005)
1: 4998995回(確率 = 0.4998995)
簡潔なバージョン
handson(superposition_simple)
確率振幅:
α: 0.7071067811865475 + 0.0im
β: 0.7071067811865475 + 0.0im
理論的な確率:
|0⟩: 0.4999999999999999
|1⟩: 0.4999999999999999
観測結果 (10000000回):
0: 5001005回(確率 = 0.5001005)
1: 4998995回(確率 = 0.4998995)
1千万回の測定を行った結果、
このように、
おわりに
ブロッホ球を通じて量子ビットについて考えることで、量子計算とスムーズに接続することができました。今回は量子重ね合わせについて計算しましたが、このあとには量子もつれ,量子テレポーションといった計算が続くので、これらに取り組むための良い助走になったと思います。
Discussion