量子計算

古典ビット量子ビット
物理的実体電圧の高低量子状態 (電子のスピン, 光の偏光, ...)
数学的理想化(古典) ビット 0,10,1量子ビット α∣0⟩+β∣1⟩\alpha \ket{0} + \beta \ket{1}
基本操作 (ゲート)AND, OR, NOT, ...X, Y, Z, H, T, S, ...

量子ビットと確率

量子ビット

α∣0⟩+β∣1⟩(α,β∈C,∣α∣2+∣β∣2=1)\alpha \ket{0} + \beta \ket{1} \quad (\alpha, \beta \in \mathbb{C}, |\alpha|^2 + |\beta|^2 = 1)

を観測すると、確率 ∣α∣2,∣β∣2|\alpha|^2, |\beta|^2 で状態 ∣0⟩,∣1⟩\ket{0}, \ket{1} が得られる。

量子ビットのベクトル表現

量子ビット α∣0⟩+β∣1⟩\alpha \ket{0} + \beta \ket{1} は、

[αβ]∈C2\begin{bmatrix} \alpha \\ \beta \end{bmatrix} \in \mathbb{C}^2

というベクトルで表現できる。

量子ゲートの行列表現

例えば XX ゲートは、∣0⟩↦∣1⟩,∣1⟩↦∣0⟩\ket{0} \mapsto \ket{1}, \ket{1} \mapsto \ket{0} という操作を表す。 (つまり、XX ゲートはビット反転を表す)

このとき XX ゲートは行列を用いて

X=[0110]X = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix}

と表せる。

例えば XX ゲートを [αβ]\begin{bmatrix} \alpha \\ \beta \end{bmatrix} に作用させると

X([αβ])=[0110][αβ]=[βα]X\left(\begin{bmatrix} \alpha \\ \beta \end{bmatrix}\right) = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \begin{bmatrix} \alpha \\ \beta \end{bmatrix} = \begin{bmatrix} \beta \\ \alpha \end{bmatrix}

となり、∣0⟩↦∣1⟩,∣1⟩↦∣0⟩\ket{0} \mapsto \ket{1}, \ket{1} \mapsto \ket{0} が確認できる。

他の量子ゲート

Y=[0−ii0]Z=[100−1]H=12[111−1]S=[100i]R=[100exp⁡(iπ4)]\begin{aligned} Y &= \begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix} \\ Z &= \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \\ H &= \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} \\ S &= \begin{bmatrix} 1 & 0 \\ 0 & i \end{bmatrix} \\ R &= \begin{bmatrix} 1 & 0 \\ 0 & \exp(\frac{i\pi}{4}) \end{bmatrix} \end{aligned}

アダマールゲート HH

H=12[111−1]H = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix}

∣0⟩,∣1⟩\ket{0}, \ket{1} に HH ゲートを作用させると

H([10])=12[111−1][10]=[1212]H([01])=12[111−1][01]=[12−12]\begin{aligned} H\left( \begin{bmatrix} 1 \\ 0 \end{bmatrix} \right) &= \dfrac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \end{bmatrix} \\ &= \begin{bmatrix} \dfrac{1}{\sqrt{2}} \\ \dfrac{1}{\sqrt{2}} \end{bmatrix} \\ H\left( \begin{bmatrix} 0 \\ 1 \end{bmatrix} \right) &= \dfrac{1}{\sqrt{2}} \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix} \begin{bmatrix} 0 \\ 1 \end{bmatrix} \\ &= \begin{bmatrix} \dfrac{1}{\sqrt{2}} \\ -\dfrac{1}{\sqrt{2}} \end{bmatrix} \end{aligned}

となり、HH ゲートは

∣0⟩↦12∣0⟩+12∣1⟩∣1⟩↦12∣0⟩−12∣1⟩\begin{aligned} \ket{0} &\mapsto \dfrac{1}{\sqrt{2}} \ket{0} + \dfrac{1}{\sqrt{2}} \ket{1} \\ \ket{1} &\mapsto \dfrac{1}{\sqrt{2}} \ket{0} - \dfrac{1}{\sqrt{2}} \ket{1} \end{aligned}

という操作を表すことが分かる。

また、H2=IH^2 = I (II は単位行列) であることから、HH ゲートを2回作用させると元の状態に戻ることが分かる。

テンソル積

2つの量子ビット ψ=α∣0⟩+β∣1⟩,ϕ=γ∣0⟩+δ∣1⟩\psi = \alpha \ket{0} + \beta \ket{1}, \phi = \gamma \ket{0} + \delta \ket{1} があるとき、これらのテンソル積は

ψ⊗ϕ\psi \otimes \phi

で表される。

これを計算すると

ψ⊗ϕ=(α∣0⟩+β∣1⟩)⊗(γ∣0⟩+δ∣1⟩)=α∣0⟩⊗γ∣0⟩+α∣0⟩⊗δ∣1⟩+β∣1⟩⊗γ∣0⟩+β∣1⟩⊗δ∣1⟩=αγ∣0⟩⊗∣0⟩+αδ∣0⟩⊗∣1⟩+βγ∣1⟩⊗∣0⟩+βδ∣1⟩⊗∣1⟩\begin{aligned} \psi \otimes \phi &= (\alpha \ket{0} + \beta \ket{1}) \otimes (\gamma \ket{0} + \delta \ket {1}) \\ &= \alpha \ket{0} \otimes \gamma \ket{0} + \alpha \ket{0} \otimes \delta \ket{1} + \beta \ket{1} \otimes \gamma \ket{0} + \beta \ket{1} \otimes \delta \ket{1} \\ &= \alpha \gamma \ket{0} \otimes \ket{0} + \alpha \delta \ket{0} \otimes \ket{1} + \beta \gamma \ket{1} \otimes \ket{0} + \beta \delta \ket{1} \otimes \ket{1} \end{aligned}

となる。

また、あるテンソル積 ∣a⟩⊗∣b⟩\ket{a} \otimes \ket{b} は ∣ab⟩\ket{ab} と表すことができる。 (abab は aa と bb の連結) これを用いると

ψ⊗ϕ=αγ∣00⟩+αδ∣01⟩+βγ∣10⟩+βδ∣11⟩\psi \otimes \phi = \alpha \gamma \ket{00} + \alpha \delta \ket{01} + \beta \gamma \ket{10} + \beta \delta \ket{11}

と表せる。

量子ビット ψ⊗ϕ\psi \otimes \phi を観測すると、確率 ∣αγ∣2,∣αδ∣2,∣βγ∣2,∣βδ∣2|\alpha \gamma|^2, |\alpha \delta|^2, |\beta \gamma|^2, |\beta \delta|^2 で状態 ∣00⟩,∣01⟩,∣10⟩,∣11⟩\ket{00}, \ket{01}, \ket{10}, \ket{11} が得られる。

2量子ビットと関数

xx に対する関数 y=f(x)y = f(x) を量子ビットで表現すると

Uf(∣a⟩⊗∣b⟩)=∣a⟩⊗∣b⊕f(a)⟩U_f (\ket{a} \otimes \ket{b}) = \ket{a} \otimes \ket{b \oplus f(a)}

と表せる。

補足

なぜ Vf(∣a⟩)=∣f(a)⟩V_f(\ket{a}) = \ket{f(a)} と表現できないのか

詳細は省く (というか私が分かってない) が、このような VfV_f はハードウェアで実装できない。 (ユニタリでない)

Deutsch アルゴリズム

関数 y=f(x)y = f(x) は f(0)=f(1)f(0) = f(1) または f(0)≠f(1)f(0) \neq f(1) のどちらを満たすかを判定したいとする。

古典計算では、f(0)=f(1)f(0) = f(1) か f(0)≠f(1)f(0) \neq f(1) かを判定するためには、f(0),f(1)f(0), f(1) を計算して比較する必要がある。 量子計算では、Deutsch アルゴリズムを用いることで、この判定を1回の計算で行うことができる。

具体的には

(H⊗1)Uf(H⊗H)∣01⟩の左の量子ビット={0(f(0)=f(1))1(f(0)≠f(1))(H \otimes 1) U_f (H \otimes H) \ket{01} \text{の左の量子ビット} = \begin{cases} 0 & (f(0) = f(1)) \\ 1 & (f(0) \neq f(1)) \end{cases}