🗃

AI&Julia #11|量子計算 » 1量子ビットで重ね合わせ

に公開

はじめに

1量子ビットで重ね合わせ状態を生成することを考えます。まずは、量子ビットについて理解するところから始めて、手計算で重ね合わせ状態を導きます。そして、重ね合わせ状態が測定によって崩壊することをYaoによるシミュレーションで確認します。

量子ビットとは何か?

ここでは 1量子ビットについて見ていきます。1量子ビットは無限の量子状態を取り得ますが、これを可視化する方法として図 1のブロッホ球を用います。


図 1 ブロッホ球(1量子ビット)

状態ベクトルと確率振幅

状態ベクトル |ψ⟩ は、確率振幅(\,α,\,β∈ℂ\,)を用いて次のように表されます。

\tag{1.1} |ψ⟩=\begin{pmatrix}α\\β\end{pmatrix} =α\begin{pmatrix}1\\0\end{pmatrix} +β\begin{pmatrix}0\\1\end{pmatrix}

ここで、量子状態 |0⟩|1⟩を次のように定義します。これらは見かけ上は実ベクトルの形をしていますが、複素ベクトル空間 ℂ^{2}の要素として定義されます。

\begin{align} \tag{1.2}|0⟩&:=\begin{pmatrix}1\\0\end{pmatrix}\\[13pt] \tag{1.3}|1⟩&:=\begin{pmatrix}0\\1\end{pmatrix} \end{align}

したがって、状態ベクトル |ψ⟩ は基底ベクトル |0⟩,\,|1⟩ の複素線形結合として次のように表されます。

\tag{1.4}|ψ⟩=α|0⟩+β|1⟩

確率振幅(\,α,\,β∈ℂ\,)の絶対値の 2乗は、それぞれの基底状態が観測される確率を表します。

\tag{1.5} \begin{aligned} P(|0⟩)&=|α|^{2}\\[6pt] P(|1⟩)&=|β|^{2} \end{aligned}

また、確率の合計が 1 となるためには、確率振幅(\,α,\,β∈ℂ\,)は次の正規化条件を満たさなければなりません。

\tag{1.6}|α|^{2}+|β|^{2}=1

この条件を満たす α,\,β の組は無限に存在するため、1量子ビットは無限の量子状態を取り得ることになります。

基底と量子状態

ブロッホ球において、基底と量子状態は次のように対応しています。

基底 量子状態
Z基底(計算基底) 基本的な量子状態 |0⟩,\,|1⟩
X基底(ハダマード基底) 重ね合わせ状態  |+⟩,\,|-⟩
Y基底 重ね合わせ状態  |+i⟩,\,|-i⟩

基本的な量子状態 |0⟩,\,|1⟩ については、それぞれ式(1.2)と式(1.3)で定義済みなので、ここでは重ね合わせ状態 |+⟩,\,|-⟩,\,|+i⟩,\,|-i⟩ を定義します。

\begin{align} \tag{2.1}|+⟩&:=\dfrac{1}{\sqrt{2}}\,\big(|0⟩+|1⟩\big)\\[14pt] \tag{2.2}|-⟩&:=\dfrac{1}{\sqrt{2}}\,\big(|0⟩-|1⟩\big)\\[14pt] \tag{2.3}|+i⟩&:=\dfrac{1}{\sqrt{2}}\,\big(|0⟩+i|1⟩\big)\\[14pt] \tag{2.4}|-i⟩&:=\dfrac{1}{\sqrt{2}}\,\big(|0⟩-i|1⟩\big) \end{align}

重ね合わせ状態 |+⟩,\,|-⟩,\,|+i⟩,\,|-i⟩ の 4つは、いずれもブロッホ球上の赤道(極角 θ=π/2 )に位置しており、確率振幅(\,α,\,β∈ℂ\,)の絶対値が等しくなります。

\tag{2.5}|α|=|β|=\dfrac{1}{\sqrt{2}}

一方でこれら4つの違いは、相対位相φの違いで表すことができます。相対位相φはグローバル位相を無視した相対的な差です。

\begin{aligned} |+⟩\enspace &⇒\enspace φ=0&(同位相)\\[10pt] |-⟩\enspace &⇒\enspace φ=π&(逆位相)\\[10pt] |+i⟩\enspace &⇒\enspace φ=\dfrac{π}{2}\\[10pt] |-i⟩\enspace &⇒\enspace φ=-\dfrac{π}{2} \end{aligned}

重ね合わせの計算方法

1量子ビットで重ね合わせ状態を生成するには、1量子ビットを |0⟩ に初期化してからHゲート \text{(Hadamard gate)} を作用させます。Hゲートを用いると、Z基底(計算基底)とX基底(ハダマード基底)の間で状態を相互に変換できます。

Hゲートに対応する行列は次の通りです。

\tag{3.1}H=\dfrac{1}{\sqrt{2}}\begin{pmatrix}1&1\\1&-1\end{pmatrix}

|0⟩Hゲートを作用させるには行列ベクトル積を計算します。

\tag{3.2} \begin{aligned} H|0⟩ &=\dfrac{1}{\sqrt{2}}\begin{pmatrix}1&1\\1&-1\end{pmatrix}\begin{pmatrix}1\\0\end{pmatrix}\\[14pt] &=\dfrac{1}{\sqrt{2}}\begin{pmatrix}1+0\\1+0\end{pmatrix}\\[14pt] &=\dfrac{1}{\sqrt{2}}\begin{pmatrix}1\\1\end{pmatrix}\\[14pt] &=\dfrac{1}{\sqrt{2}}\left\{\begin{pmatrix}1\\0\end{pmatrix}+\begin{pmatrix}0\\1\end{pmatrix}\right\}\\[14pt] &=\dfrac{1}{\sqrt{2}}\big(|0⟩+|1⟩\big)\\[14pt] &=|+⟩ \end{aligned}

この計算を通じて、|0⟩Hゲートを作用させると重ね合わせ状態 |+⟩ を生成できることが分かりました。

測定による状態の崩壊

重ね合わせ状態 |+⟩Z基底 \{|0⟩,\,|1⟩\}で測定すると、確率的に |0⟩ または |1⟩ に崩壊します。その結果、観測装置からは |0⟩ または |1⟩ に対応する古典ビット( 0または 1 )が出力されます。これらを踏まえると、式(2.1)の定義より、|+⟩ の測定結果は次のようになります。

0\,が観測される確率:\enspace |α|^{2}=\left|\dfrac{1}{\sqrt{2}}\right|^{2}=\dfrac{1}{2}=0.5\\[10pt] 1\,が観測される確率:\enspace |β|^{2}=\left|\dfrac{1}{\sqrt{2}}\right|^{2}=\dfrac{1}{2}=0.5

実装例

重ね合わせの実装方法にはいくつかのパターンがありますが、次の 3パターンを実装します。

  • 手計算を再現したバージョン(⇨ 式(3.2)
  • 量子回路バージョン
  • 簡潔なバージョン
Julia
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つだけで充分です。

手計算を再現したバージョン

Julia
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)

量子回路バージョン

Julia
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)

簡潔なバージョン

Julia
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千万回の測定を行った結果、01 がそれぞれほぼ 50\%の確率で観測されています。これは理論から予測される通りです。

このように、Hゲートを使って重ね合わせ状態を生成し、これが測定によって確率的に崩壊することを確認できました。

おわりに

ブロッホ球を通じて量子ビットについて考えることで、量子計算とスムーズに接続することができました。今回は量子重ね合わせについて計算しましたが、このあとには量子もつれ,量子テレポーションといった計算が続くので、これらに取り組むための良い助走になったと思います。

Discussion