量子コンピューターとは

量子の性質を利用して計算するコンピューター。

量子力学:電子や光などの振る舞いを説明する物理法則。
計算の鍵:重ね合わせと干渉。

簡単な歴史

  1. 1981

    発想

    ファインマン
    量子の世界を、量子の仕組みで計算。

  2. 1994

    アルゴリズム

    ショア
    大きな整数の素因数分解の方法を提案。

  3. 2016

    クラウドで体験

    IBM
    インターネット経由で実機を公開。

何に使う? — 応用研究の例

分子・材料

分子のエネルギーを計算

電池の材料、化学反応の研究。

本イベント:SQD

組合せ最適化

多数の候補から良い組合せを探す

配送ルート、工場のスケジュール。

本イベント:量子最適化

計算の高速化は、問題・アルゴリズム・装置の条件による。応用例は研究対象。

まずは、重ね合わせと干渉を二重スリットで確認。

ヤングの二重スリット実験

光の干渉を示すヤングの実験。電子でも、検出点の蓄積 → 干渉縞。

粒子としての予想

電子を1個ずつ左右スクリーン
左右どちらかを直進 → 2本の帯

観測される現象

電子を1個ずつ左右スクリーン
検出点の蓄積 → 縞模様

検出点:1000個

点群は模型。左図は直進する粒子の予想。古典的な波には干渉あり。

重ね合わせ → 干渉 → 縞模様

LL

左を通る電子

∣L⟩\lvert L\rangle
RR

右を通る電子

∣R⟩\lvert R\rangle

∣ ⟩\lvert\ \rangle:ケット。量子状態を表す記号。

左右の状態に重みをつけて足す
∣ψ⟩=α∣L⟩+β∣R⟩\lvert\psi\rangle=\alpha\lvert L\rangle+\beta\lvert R\rangle
ψ\psi(プサイ)
量子状態
α\alpha, β\beta
確率振幅=状態の重み
左右の重ね合わせ→振幅どうしの干渉→縞模様

確率振幅の和から、強め合い・打ち消し合い。

重ね合わせの割合は調整可能

左50.0%
右50.0%
左側右側

検出点8,000個。点群の高さ=点の多さの目安(模式図)。

半々:左右対称

振幅 → 確率
PL=∣α∣2P_L=|\alpha|^2
PR=∣β∣2P_R=|\beta|^2
正規化=確率の合計1
∣α∣2+∣β∣2=1|\alpha|^2+|\beta|^2=1

PLP_L, PRP_R:経路を測った場合の確率。干渉を見るときは経路を測定しない。

右70%の振幅:√0.7。0.7ではない。

ベクトル=重みの列

成分の順序:上=左、下=右。

∣L⟩=(10)\lvert L\rangle=\begin{pmatrix}1\\0\end{pmatrix}
∣R⟩=(01)\lvert R\rangle=\begin{pmatrix}0\\1\end{pmatrix}
線形結合=定数倍+和
α∣L⟩+β∣R⟩=α(10)+β(01)=(αβ)\begin{aligned}\alpha\lvert L\rangle+\beta\lvert R\rangle&=\alpha\begin{pmatrix}1\\0\end{pmatrix}+\beta\begin{pmatrix}0\\1\end{pmatrix}\\&=\begin{pmatrix}\alpha\\\beta\end{pmatrix}\end{aligned}

成分ごとの計算

量子状態として使う場合:確率の合計1に正規化。ベクトルの成分は空間の座標ではない。

ブロッホ球:確率と相対位相

量子ビット:0・1を基準とする量子計算の単位。ここから左・右 → 0・1。

0の状態1の状態
北極=0、南極=1、赤道=確率半々。ドラッグ:視点の変更。
050.0%
150.0%

状態ベクトル(小数第3位)

球面:1本の状態ベクトルで表せる純粋状態。電子の空間位置とは別。

相対位相と複素数

相対位相:2成分の位相差。途中の位相には複素数を使用。

i2=−1,∣a+bi∣2=a2+b2i^2=-1,\quad |a+bi|^2=a^2+b^2

aa,bb:実数。ii:虚数単位。

α=P0,β=eiϕ1−P0\alpha=\sqrt{P_0},\quad\beta=e^{i\phi}\sqrt{1-P_0}

P0P_0:0の確率。φ\varphi:相対位相(式ではラジアン)。eiφe^{i\varphi}=cosφ\varphi+ii sinφ\varphi。全体の位相は物理的状態を変えない。

関数 → 演算子 → 行列

数を入力する関数

入力 xx→ff→出力 yy
y=f(x)y=f(x)

例:f(x)=2xf(x)=2x。入力3 → 出力6。

ベクトルを入力する演算子

入力 v\boldsymbol v→AA→出力 w\boldsymbol w
w=Av\boldsymbol w=A\boldsymbol v

演算子:入力に作用するルール。

行列:数を行・列に並べた表。ここでは線形演算子を、2×2行列で表現。

線形:入力の和・定数倍を、そのまま出力の和・定数倍に対応させる。

例:XXゲート=上下の成分を交換
X=(0110)X=\begin{pmatrix}0&1\\1&0\end{pmatrix}
X(10)=(01)X\begin{pmatrix}1\\0\end{pmatrix}=\begin{pmatrix}0\\1\end{pmatrix}

入力ベクトル → 行列の作用 → 出力ベクトル

行列×ベクトル:各行の積と和

(abcd)(xy)=(ax+bycx+dy)\begin{pmatrix}a&b\\c&d\end{pmatrix}\begin{pmatrix}x\\y\end{pmatrix}=\begin{pmatrix}ax+by\\cx+dy\end{pmatrix}

aa,bb,cc,dd:行列の成分。xx,yy:入力ベクトルの成分。

XXの計算

NumPy:行列積
Python / NumPy
import numpy as np

X = np.array([[0, 1], [1, 0]])
ket0 = np.array([1, 0])
print(X @ ket0)  # [0 1]

@:行列積。*:成分ごとの積。

w=Av\boldsymbol w=A\boldsymbol v:行列がベクトルに作用する計算

HHゲート:重ね合わせと干渉

H=12(111−1)H=\frac1{\sqrt2}\begin{pmatrix}1&1\\1&-1\end{pmatrix}

HH:アダマールゲート。

H∣0⟩=∣0⟩+∣1⟩2H\lvert0\rangle=\frac{\lvert0\rangle+\lvert1\rangle}{\sqrt2}

+の状態。振幅1/21/\sqrt2、確率1/2。

HHをもう一度:振幅の和と差
H∣+⟩=12(1+11−1)=(10)H\lvert+\rangle=\frac12\begin{pmatrix}1+1\\1-1\end{pmatrix}=\begin{pmatrix}1\\0\end{pmatrix}
0100.0%
10.0%

ZZ:1側の振幅の符号を反転。ゲートの計算は振幅に作用。

量子アルゴリズムの設計=量子干渉の設計(ゲート型計算の見方)。

ゲートの条件

ユニタリ行列:状態の正規化を保つ可逆な操作。XX・HH・ZZはいずれもユニタリ。

固有値:行列の作用が、元のベクトルの何倍か

Av=λv,v≠0A\boldsymbol v=\lambda\boldsymbol v,\qquad\boldsymbol v\ne\boldsymbol0
AA行列

今回は2×2。ベクトルを変換。

v\boldsymbol vベクトル

2×1。数を縦に2つ並べた列。

λ\lambdaスカラー

1つの数。ここでは+1・−1。

左辺も右辺も、2×1のベクトル。固有値は、その共通の倍率。

同じ行列、3つの入力を比較

A=X=(0110)A=X=\begin{pmatrix}0&1\\1&0\end{pmatrix}

XXは上・下の成分を交換。計算を見やすくするため、まず正規化前のベクトルを使う。

① 行列×ベクトル → ベクトル
(0110)(11)=(11)\begin{pmatrix}0&1\\1&0\end{pmatrix}\begin{pmatrix}1\\1\end{pmatrix}=\begin{pmatrix}1\\1\end{pmatrix}
(2×2)(2×1)⟶(2×1)(2\times2)(2\times1)\longrightarrow(2\times1)

2×2の「2行・2列」と、2×1の「2行・1列」。

全成分が同じ倍率 → 固有ベクトル。その倍率 → 固有値。
任意のベクトルに行列をかけるだけでは、固有値が分かるとは限らない。

固有値を未知数として求める:+1・−1は、どこから出る?

固有値λ\lambdaと、ベクトルの成分xx・yyを未知数にする。

v=(xy)\boldsymbol v=\begin{pmatrix}x\\y\end{pmatrix}
Xv=(yx)λv=(λxλy)\begin{aligned}X\boldsymbol v&=\begin{pmatrix}y\\x\end{pmatrix}\\\lambda\boldsymbol v&=\begin{pmatrix}\lambda x\\\lambda y\end{pmatrix}\end{aligned}

2つの列が等しい条件:上同士、下同士が等しい。

{y=λxx=λy\begin{cases}y=\lambda x\\x=\lambda y\end{cases}

上の式を、下の式へ代入。

x=λ(λx)=λ2xx=\lambda(\lambda x)=\lambda^2x

この行列では、x=0x=0なら上の式からy=0y=0。零ベクトルは除外するので、x≠0x\ne0。両辺をxxで割れる。

λ2=1⟹λ=+1,−1\lambda^2=1\quad\Longrightarrow\quad\lambda=+1,-1

固有値+1

y=x,v=(11)y=x,\quad\boldsymbol v=\begin{pmatrix}1\\1\end{pmatrix}

固有値−1

y=−x,v=(1−1)y=-x,\quad\boldsymbol v=\begin{pmatrix}1\\-1\end{pmatrix}

最後に、上の④で両方を検算。ベクトルはそれぞれ、0以外の何倍でも同じ固有値。

量子状態へ:正規化しても、固有値は同じ
∣+⟩=12(11)\lvert+\rangle=\frac1{\sqrt2}\begin{pmatrix}1\\1\end{pmatrix}
∣−⟩=12(1−1)\lvert-\rangle=\frac1{\sqrt2}\begin{pmatrix}1\\-1\end{pmatrix}

振幅の絶対値の2乗の和を1へ。倍率1/21/\sqrt2を左辺・右辺の両方にかけても、X∣+⟩=+1∣+⟩X\lvert+\rangle=+1\lvert+\rangle、X∣−⟩=−1∣−⟩X\lvert-\rangle=-1\lvert-\rangleは成立。固有値は確率ではない。

なぜ零ベクトルを除く? なぜ−1も固有値?
A0=λ0=0A\boldsymbol0=\lambda\boldsymbol0=\boldsymbol0

零ベクトルでは、どんな倍率でも成立するため固有値を特定できない。−1倍は全成分の符号を反転する。向きは逆、長さは同じ。量子状態全体の−1倍は同じ物理的状態だが、行列の固有値−1はその作用を表す値として残る。

観測量の固有値=測定で得られる値

A^∣ψn⟩=an∣ψn⟩\hat A\lvert\psi_n\rangle=a_n\lvert\psi_n\rangle
A^\hat A
位置・運動量など、観測量の演算子
ψn\psi_n
固有状態(量子状態の固有ベクトル)
ana_n
固有値=測定値。nnは固有状態の番号。
数学A^\hat A ψn\psi_n=ana_n ψn\psi_n演算子の作用を計算
→
実験固有状態ψn\psi_nを測定 → ana_n対応する測定値を確率1で検出

位置の2状態模型:左−1 cm/右+1 cm

Q^=(−1001) cm\hat Q=\begin{pmatrix}-1&0\\0&1\end{pmatrix}\,\mathrm{cm}

Q^\hat Q:この模型の位置演算子。

左右−1 cm+1 cm検出位置
左:−1 cm50.0%
右:+1 cm50.0%
行列の作用(数学)

測定値:未測定

記録:0回

毎回、同じ状態を準備。検出は理想的な測定の模型。

一般の重ね合わせ:固有値のどれかを、対応する確率で検出。行列の積と、1回の測定結果は別。

運動量も同じ構造
p^ψp=pψp\hat p\psi_p=p\psi_p

p^\hat p:運動量演算子。ψp\psi_p:運動量ppの固有状態。pp:運動量の測定値(確率ではない)。

演算子 → 固有状態への作用 → 固有値pp → 運動量の測定値pp。

連続的な位置・運動量は波動関数で表現。本編の2×2行列は有限の2状態模型。

エネルギーも、同じ固有値の式

HE∣ψE⟩=E∣ψE⟩H_{\mathrm E}\lvert\psi_E\rangle=E\lvert\psi_E\rangle
HEH_{\mathrm E}
ハミルトニアン=エネルギーの演算子
EE
固有値=エネルギーの測定値
基底状態
最小の固有値に対応する状態

行列の作用 → 固有値 → エネルギー

HHゲート:状態の変換。HEH_{\mathrm E}:エネルギーの観測量。

NumPy:固有値と検算
Python / NumPy
import numpy as np

X = np.array([[0., 1.], [1., 0.]])
values, vectors = np.linalg.eigh(X)
print(values)  # [-1.  1.]
v = vectors[:, 0]
print(np.allclose(X @ v, values[0] * v))  # True

HEH_{\mathrm E}=XXとした説明用の模型。最小固有値−1、基底状態は−の状態。実在分子の計算ではない。

eigh:エルミート行列の固有値・固有ベクトル。今回のXXは実対称行列。

Qiskit:干渉の計算

HH → 位相変更 → HH。位相0:0を検出。位相π:1を検出。

Python / Qiskit
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector

for phase in [0, np.pi]:
    qc = QuantumCircuit(1)
    qc.h(0)
    qc.p(phase, 0)
    qc.h(0)
    probabilities = Statevector.from_instruction(qc).probabilities()
    print(np.round(probabilities, 6))
# [1. 0.]
# [0. 1.]

出力順:0、1。π=180°。p(π)=ZZ。Statevector:理想的な確率の計算。

有限回の測定
Python / Qiskit
from qiskit.primitives import StatevectorSampler

measured = qc.copy()  # 最後の回路:位相π
measured.measure_all()
sampler = StatevectorSampler(seed=7)
result = sampler.run([measured], shots=1024).result()
print(result[0].data.meas.get_counts())
# {'1': 1024}

StatevectorSampler:有限回の測定を模擬。実機への接続なし。

実行確認:Python 3.12.14 / Qiskit 2.5.1。

基礎実習Notebookを開く・保存(実習NotebookはこのZIPに含みません)

重ね合わせ → 干渉 → ベクトル → 行列の作用 → 固有値 → 測定値