第2章: 量子ビット、重ね合わせ、量子もつれ

状態ベクトル、Born則、そして古典的な対応物を持たない資源

📖 Reading Time: 20-25 minutes 📊 Difficulty: Beginner 💻 Code Examples: 0 📝 Exercises: 0

ビデオ講義

このビデオは以下のテキストと同じ内容をカバーしています。お好みの学習形式をお選びください。

🌐 JP | 🇬🇧 EN | Last sync: 2026-08-16

量子コンピューティング道場 > 量子コンピュータ入門 > 第2章

第1章では、量子コンピューティングが力任せの並列性ではなく干渉に立脚していると論じました。それを具体的にするには、数学的対象そのものが必要です。本章では、量子ビットと、その記述を測定結果に結び付ける規則、そして古典的な対応物を持たない相関である量子もつれを導入します。ここでのすべての主張は、自分で実行できる短いNumPyプログラムによって裏づけられます。

2.1 2準位系としての量子ビット

古典的な ビット は0か1のどちらかの値をとります。量子ビット(quantum bit)はその量子版で、準備・操作・測定が可能な、区別できる2つの状態を持つあらゆる物理系を指します。電子のスピン、光子の偏光、超伝導回路の2つのエネルギー準位は、いずれも同じように使えます。重要なのは数学であって、ハードウェアではありません。

📚 計算基底

区別可能な2つの状態には ケット記法 \(|\cdot\rangle\) を使って名前を付けます。これは列ベクトルを簡潔に書くための記法にすぎません。

\[ |0\rangle = \begin{pmatrix} 1 \\ 0 \end{pmatrix}, \qquad |1\rangle = \begin{pmatrix} 0 \\ 1 \end{pmatrix} \]

この2つが合わさって 計算基底 をなします。測定が完全に区別できるのは、この2つの状態です。

重ね合わせ

古典ビットからの本質的な離脱は、量子ビットが2つの基底状態の任意の 重ね合わせ をとりうることです。

\[ |\psi\rangle = \alpha |0\rangle + \beta |1\rangle = \begin{pmatrix} \alpha \\ \beta \end{pmatrix} \]

ここで \(\alpha\) と \(\beta\) は 確率振幅 と呼ばれる複素数です。これらは確率そのものではありません。確率は非負の実数ですが、振幅は符号と位相を持ち、まさにそれゆえに打ち消し合うことができます。

振幅は 規格化条件 を満たさなければなりません。

\[ |\alpha|^2 + |\beta|^2 = 1 \]

これは恣意的な約束事ではありません。測定すれば量子ビットは 何らかの 結果を、合計確率1で与える、という主張そのものです。

非常によく現れる2つの重ね合わせには、固有の名前が付いています。

\[ |+\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle + |1\rangle\right), \qquad |-\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle - |1\rangle\right) \]

どちらも結果0と結果1を等しい確率 \(1/2\) で与えますが、物理的には異なる状態であり、適切な測定によって区別できます。違いは完全に 相対位相、すなわち \(|1\rangle\) の前のマイナス符号にあります。この例は覚えておいてください。重ね合わせが「隠れた古典的な値についての無知」と同じものではないことを示す、最小の実例です。

大域位相は情報を持たない

状態全体に位相因子を掛けても、すなわち \(|\psi\rangle \to e^{i\gamma}|\psi\rangle\) としても、どんな測定であれ、その測定確率は一切変わりません。この2つのベクトルは 同一の物理状態 を記述しています。物理的な意味を持つのは、成分間の 相対的な 位相だけです。だからこそ次節のパラメータ表示は、4つの実数ではなくわずか2つの実角度で、すべての量子ビット状態を記述できるのです。

2.2 Bloch球

規格化と大域位相の無関係性を合わせると、\((\alpha, \beta)\) に含まれる4つの実パラメータは2つに減ります。したがって、あらゆる量子ビット状態は次のように書けます。

\[ |\psi\rangle = \cos\frac{\theta}{2} |0\rangle + e^{i\phi} \sin\frac{\theta}{2} |1\rangle \]

ここで 極角 は \(0 \le \theta \le \pi\)、方位角 は \(0 \le \phi < 2\pi\) です。これらはちょうど単位球面上の点の球座標であり、この球を Bloch球 と呼びます。

球面上の点 \(\theta\) \(\phi\) 状態
北極 \(0\) 不定 \(\lvert 0 \rangle\)
南極 \(\pi\) 不定 \(\lvert 1 \rangle\)
赤道、\(+x\) \(\pi/2\) \(0\) \(\lvert + \rangle\)
赤道、\(-x\) \(\pi/2\) \(\pi\) \(\lvert - \rangle\)
赤道、\(+y\) \(\pi/2\) \(\pi/2\) \((\lvert 0 \rangle + i \lvert 1 \rangle)/\sqrt{2}\)

半角 \(\theta/2\) に注目してください。これがあるのは、\(|0\rangle\) と \(|1\rangle\) がベクトルとして直交しているにもかかわらず、球面上では対極、すなわち \(180\) 度離れた位置にあるからです。Bloch球は 状態空間 の描像であって、通常の物理空間の描像ではありません。

Bloch球は非常に便利な描像ですが、1つ警告が付きます。単一の 量子ビットに対してのみ有効だということです。2つ以上の量子ビットに対して同等の描像は存在せず、その理由こそが量子もつれであり、2.5節で扱います。

2.3 測定とBorn則

ここまではすべて量子ビットの記述に関するものでした。測定は、その記述から実験が実際に記録するものへと架かる橋です。

📚 Born則

状態 \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle\) を計算基底で測定すると、結果0または結果1が、次の確率で得られます。

\[ P(0) = |\alpha|^2, \qquad P(1) = |\beta|^2 \]

これが Born則 で、1926年に波動関数の確率解釈を提唱したMax Bornにちなんで名づけられました。これは量子力学の要請(公理)であって、形式論の残りから導かれる定理ではありません。

はっきり述べておくべき帰結が3つあります。

  1. 結果はランダムである。 \(\alpha\) と \(\beta\) を完全に知っていても、1回の試行でどちらの結果が出るかは予測できません。
  2. 状態は収縮する。 0という結果を返す測定の後、量子ビットは \(|0\rangle\) に残されます。もう一度測定すれば確実に0が返ります。もとの重ね合わせは失われています。
  3. 1つのコピーから \(\alpha\) と \(\beta\) を知ることはできない。 振幅を復元するには、同一に準備された多数のコピーを、いくつかの異なる基底で測定する必要があります。この手続きを 量子状態トモグラフィ と呼び、そのコストは量子ビット数とともに急速に増大します。

2番目の点は、量子アルゴリズムが注意深く設計された最終段階で終わる理由です。1回の実行につきビット列が1つしか得られないので、観測する前の時点で、干渉によって求める答えに確率を集中させておかなければなりません。

💻 コード例1: 量子ビットの状態とその測定統計

Bloch球上の状態を作り、規格化を確認し、測定をサンプリングしてみましょう。NumPyだけを使い、出力が再現可能になるように np.random.default_rng を固定シードで使用します。

import numpy as np

# 計算基底の状態 |0> と |1>
ket0 = np.array([1, 0], dtype=complex)
ket1 = np.array([0, 1], dtype=complex)

# |psi> = cos(theta/2)|0> + e^{i phi} sin(theta/2)|1> を構成する
theta = np.pi / 3      # Bloch球上の極角
phi = np.pi / 4        # 方位角
psi = np.cos(theta / 2) * ket0 + np.exp(1j * phi) * np.sin(theta / 2) * ket1

print("state vector =", np.round(psi, 4))
print("norm squared =", round(float(np.vdot(psi, psi).real), 10))

# Born則: 各結果の確率
p0 = float(abs(psi[0]) ** 2)
p1 = float(abs(psi[1]) ** 2)
print(f"P(0) = {p0:.4f},  P(1) = {p1:.4f},  sum = {p0 + p1:.4f}")

# 同一に準備した量子ビットの測定を10,000回シミュレートする
rng = np.random.default_rng(seed=42)
shots = 10000
outcomes = rng.choice([0, 1], size=shots, p=[p0, p1])
counts = np.bincount(outcomes, minlength=2)
print(f"measured 0: {counts[0]:5d}  (frequency {counts[0]/shots:.4f})")
print(f"measured 1: {counts[1]:5d}  (frequency {counts[1]/shots:.4f})")

検証済みの出力:

state vector = [0.866 +0.j     0.3536+0.3536j]
norm squared = 1.0
P(0) = 0.7500,  P(1) = 0.2500,  sum = 1.0000
measured 0:  7558  (frequency 0.7558)
measured 1:  2442  (frequency 0.2442)

\(\theta = \pi/3\) では \(P(0) = \cos^2(\pi/6) = 3/4\)、\(P(1) = 1/4\) と予測され、サンプリングされた頻度0.7558と0.2442は、10,000ショットの統計的ゆらぎの範囲にぴったり収まっています。また np.vdot が第1引数を複素共役することにも注意してください。これはまさに量子力学が使う内積の規約です。

2.4 多量子ビット状態とテンソル積

量子ビット1つでは、まだコンピュータになりません。量子ビットを組み合わせるには テンソル積(記号 \(\otimes\))を使います。

量子ビットAが状態 \(|\psi_A\rangle\)、量子ビットBが状態 \(|\psi_B\rangle\) にあるとき、この対の結合状態は

\[ |\psi_A\rangle \otimes |\psi_B\rangle \]

です。基底状態については \(|0\rangle \otimes |1\rangle\) を \(|01\rangle\) と略記します。したがって2量子ビットは4つの基底状態 \(|00\rangle, |01\rangle, |10\rangle, |11\rangle\) を持ち、一般の2量子ビット状態は

\[ |\psi\rangle = c_{00}|00\rangle + c_{01}|01\rangle + c_{10}|10\rangle + c_{11}|11\rangle, \qquad \sum_{ij} |c_{ij}|^2 = 1 \]

となります。一般に \(n\) 量子ビットには \(2^n\) 個の複素振幅が必要です。これは第1章で出会った指数的増大を、あらためて明示的に書いたものです。NumPyでは、ベクトルのテンソル積はまさにクロネッカー積 np.kron です。

2.5 量子もつれとBell状態

ここで、量子情報と古典情報を分かつ問いが登場します。すべての2量子ビット状態は、2つの単一量子ビット状態の積として書けるのか?

答えは「いいえ」であり、書けない状態を 量子もつれ状態(entangled)と呼びます。

📚 Bell状態

John Stewart Bellにちなんで名づけられた4つの Bell状態 は、標準的な最大量子もつれの2量子ビット状態です。

\[ |\Phi^{\pm}\rangle = \frac{1}{\sqrt{2}}\left(|00\rangle \pm |11\rangle\right), \qquad |\Psi^{\pm}\rangle = \frac{1}{\sqrt{2}}\left(|01\rangle \pm |10\rangle\right) \]

\(|\Phi^{+}\rangle\) を取り上げましょう。両方の量子ビットを測定すると、半分の確率で00、半分の確率で11が得られ、01や10は 決して 得られません。2つの結果は完全に相関しています。それでいて、各量子ビットを単独で調べると公平なコインのように振る舞います。相関は対の側に宿っており、どちらか一方に宿っているのではありません。

💻 コード例2: np.kron によるBell状態の構成

import numpy as np

ket0 = np.array([1, 0], dtype=complex)
ket1 = np.array([0, 1], dtype=complex)

# 2量子ビットの基底状態はテンソル積(クロネッカー積)で作る
ket00 = np.kron(ket0, ket0)
ket11 = np.kron(ket1, ket1)
print("|00> =", ket00.real.astype(int))
print("|11> =", ket11.real.astype(int))

# Bell状態 |Phi+> = (|00> + |11>)/sqrt(2)
bell = (ket00 + ket11) / np.sqrt(2)
labels = ["00", "01", "10", "11"]
print("Bell state amplitudes:")
for label, amp in zip(labels, bell):
    print(f"  |{label}> : {amp.real:+.4f}")

# 4つの結果に対するBorn則
probs = np.abs(bell) ** 2
print("probabilities:", {l: round(float(p), 4) for l, p in zip(labels, probs)})

# 両方の量子ビットの測定を10,000回サンプリングする
rng = np.random.default_rng(seed=7)
shots = 10000
draws = rng.choice(4, size=shots, p=probs)
counts = np.bincount(draws, minlength=4)
for label, c in zip(labels, counts):
    print(f"  outcome {label}: {c:5d}  (frequency {c/shots:.4f})")

# 量子ビットA単独の周辺統計
p_a0 = (counts[0] + counts[1]) / shots
print(f"qubit A alone: P(0) = {p_a0:.4f} -> looks like a fair coin")

検証済みの出力:

|00> = [1 0 0 0]
|11> = [0 0 0 1]
Bell state amplitudes:
  |00> : +0.7071
  |01> : +0.0000
  |10> : +0.0000
  |11> : +0.7071
probabilities: {'00': 0.5, '01': 0.0, '10': 0.0, '11': 0.5}
  outcome 00:  4983  (frequency 0.4983)
  outcome 01:     0  (frequency 0.0000)
  outcome 10:     0  (frequency 0.0000)
  outcome 11:  5017  (frequency 0.5017)
qubit A alone: P(0) = 0.4983 -> looks like a fair coin

混合した結果である01と10は一度も現れず、それでいて各量子ビットは単独では偏りがありません。この組み合わせこそが量子もつれの証拠です。

量子もつれ状態が因数分解できない理由

\(|\Phi^{+}\rangle\) について証明してみましょう。これが積の形に書けたと仮定します。

\[ (a_0|0\rangle + a_1|1\rangle) \otimes (b_0|0\rangle + b_1|1\rangle) = a_0 b_0 |00\rangle + a_0 b_1 |01\rangle + a_1 b_0 |10\rangle + a_1 b_1 |11\rangle \]

\(|\Phi^{+}\rangle\) と係数を照合すると、次が必要になります。

\[ a_0 b_0 = \tfrac{1}{\sqrt{2}}, \quad a_1 b_1 = \tfrac{1}{\sqrt{2}}, \quad a_0 b_1 = 0, \quad a_1 b_0 = 0 \]

第1式は \(a_0 \neq 0\) と \(b_0 \neq 0\) を強制し、第2式は \(a_1 \neq 0\) と \(b_1 \neq 0\) を強制します。しかしそうすると \(a_0 b_1 \neq 0\) となり、第3式と矛盾します。そのような \(a\) と \(b\) は存在しないので、\(|\Phi^{+}\rangle\) は量子もつれ状態です。

この議論はきれいに一般化されます。振幅を \(C_{ij} = c_{ij}\) となる行列 \(C\) に並べます。積状態では \(C_{ij} = a_i b_j\) となり、これはランク1の行列なので \(\det C = 0\) です。したがって 2量子ビット状態が積状態であるための必要十分条件は \(a_0 b_1 - a_1 b_0\) が消えること、すなわち

\[ c_{00} c_{11} - c_{01} c_{10} = 0 \]

です。

💻 コード例3: 可分性の数値的な判定

一方の量子ビットを無視することでも量子もつれを検出できます。縮約密度行列 \(\rho_A\) は、量子ビットBを捨てたときに残るものを記述し、その 純粋度 \(\mathrm{Tr}(\rho_A^2)\) は積状態では1に等しく、最大量子もつれの量子ビット対では \(1/2\) まで下がります。

import numpy as np


def is_product_state(state):
    """2量子ビット状態が積状態であるのは、その2x2振幅行列
    C[i, j] = |ij> の振幅 のランクが1、すなわち det(C) = 0 のときに限る。"""
    C = state.reshape(2, 2)
    return abs(np.linalg.det(C)) < 1e-12


def reduced_density_matrix_A(state):
    """量子ビットBをトレースアウトする: rho_A = Tr_B |psi><psi|"""
    C = state.reshape(2, 2)
    return C @ C.conj().T


ket0 = np.array([1, 0], dtype=complex)
ket1 = np.array([0, 1], dtype=complex)
plus = (ket0 + ket1) / np.sqrt(2)

product = np.kron(plus, plus)                 # |+>|+>、可分
bell = (np.kron(ket0, ket0) + np.kron(ket1, ket1)) / np.sqrt(2)

for name, state in [("|+>|+>", product), ("Bell |Phi+>", bell)]:
    C = state.reshape(2, 2)
    det = np.linalg.det(C)
    rho_a = reduced_density_matrix_A(state)
    purity = float(np.trace(rho_a @ rho_a).real)
    eigs = np.linalg.eigvalsh(rho_a)
    print(f"{name}")
    print(f"  det(C)          = {det.real:+.4f}")
    print(f"  product state?  = {is_product_state(state)}")
    print(f"  eigenvalues of rho_A = {np.round(eigs.real, 4)}")
    print(f"  purity Tr(rho_A^2)   = {purity:.4f}")

検証済みの出力:

|+>|+>
  det(C)          = +0.0000
  product state?  = True
  eigenvalues of rho_A = [0. 1.]
  purity Tr(rho_A^2)   = 1.0000
Bell |Phi+>
  det(C)          = +0.5000
  product state?  = False
  eigenvalues of rho_A = [0.5 0.5]
  purity Tr(rho_A^2)   = 0.5000

2つの判定は一致しています。可分な状態 \(|+\rangle|+\rangle\) は行列式が0で、単一量子ビットの記述は純粋状態です。一方Bell状態は \(\det C = 1/2\) を持ち、量子ビットAは単独では完全に不確定な状態に残され、固有値は両方とも \(1/2\) になります。全体としての対は厳密に分かっているのに、その半分は全く分かっていない — これは古典的な対応物を持たない状況です。

⚠️ 量子もつれは信号を送らない

量子もつれ状態の量子ビットは、しばしば「瞬時に通信している」と説明されます。そうではありません。Bell対の片方を持っているとき、相手がもう片方に何をしようとも、あなたの測定統計は公平なコインのものであり、それはコード例2が数値的に示したとおりです。相関が見えるようになるのは、両者が 通常の古典通信路を通じて記録を突き合わせたとき だけであり、その通信路は光速を超えません。この結果は 非信号伝達定理(no-signalling theorem)として知られています。量子もつれは本物の資源であり、量子テレポーテーションや超密度符号化を可能にしますが、超光速の電話ではありません。

2.6 量子複製不可能定理

もう1つの性質が、量子コンピューティングのすべてを形づくっています。

量子複製不可能定理(no-cloning theorem。WoottersとZurek、および独立にDieks、1982年): 任意の未知の量子状態をコピーする物理過程は存在しない。

証明の概略

万能なコピー機が存在したとしましょう。それはあらゆる入力に対して同一の単一操作 \(U\) であり、

\[ U\left(|\psi\rangle \otimes |0\rangle\right) = |\psi\rangle \otimes |\psi\rangle \]

を すべての 状態 \(|\psi\rangle\) について満たします。ここで2つ目のスロットは空のレジスタです。

量子的な時間発展は ユニタリ であり、ユニタリ操作は内積を保ちます。このコピー機を任意の2状態 \(|\psi\rangle\) と \(|\varphi\rangle\) に適用し、前後の内積を比べます。

\[ \langle \psi | \varphi \rangle = \left(\langle \psi | \varphi \rangle\right)^2 \]

\(x = \langle \psi | \varphi \rangle\) と置くと \(x = x^2\) が必要なので、\(x = 0\) または \(x = 1\) です。すなわちコピー機が機能するのは、直交する(\(|0\rangle\) と \(|1\rangle\) のように完全に区別できる)状態か、同一の 状態に対してだけです。任意の未知の状態、たとえば \(|0\rangle\) と並べた \(|+\rangle\) は、コピーできません。これで議論は完結です。

なぜ重要なのか

まとめ

本章では、量子計算の基本語彙を築きました。量子ビット とは任意の2準位量子系であり、複素 振幅 が 規格化条件 \(|\alpha|^2 + |\beta|^2 = 1\) を満たす 状態ベクトル \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle\) で記述されます。大域位相 は観測できないため、あらゆる量子ビット状態は角度 \(\theta\) と \(\phi\) でパラメータ表示される Bloch球 上の1点になります。Born則 は振幅を実験に結び付けます。結果の確率は \(|\alpha|^2\) と \(|\beta|^2\) であり、結果は真にランダムで、測定は状態を 収縮 させます。だからこそ1回の実行では1つのビット列しか得られません。複数の量子ビットは テンソル積 で結合し、\(n\) 量子ビットに対して \(2^n\) 個の振幅を与えます。NumPyの np.kron がこれをそのまま実装します。そのような積として書けない状態が 量子もつれ状態 であり、Bell状態 がその代表例です。\(|\Phi^{+}\rangle\) が完全に相関した同時測定結果を与える一方で、各量子ビット単独では完全に不確定であることを、代数的にも数値的にも確認しました。量子もつれは 信号伝達 なしに相関を生むことを強調しました。最後に、量子複製不可能定理 はユニタリ性から3行で導かれ、量子誤り訂正・量子鍵配送・状態トモグラフィが今の形をとっている理由を説明します。

次章では、これらの状態を動かします。量子ゲートとは、Bloch球上で状態を回転させ、量子もつれを生み出すユニタリ操作であり、量子回路とはそれらを組み立ててアルゴリズムにする方法です。

← 第1章: なぜ量子コンピューティングなのか 第3章: 量子ゲートと量子回路 →

免責事項