第2章: 分子から量子ビットへ

第二量子化、電子ハミルトニアン、そしてJordan-Wigner変換

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

ビデオ講義

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

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

量子コンピューティング道場 > 量子コンピュータによる量子化学計算 > 第2章

第1章は、私たちに1つの問題と1つの約束を残しました。問題とは、厳密な電子波動関数が次元の爆発する空間に住んでいるということ。約束とは、量子レジスタがスピン軌道1つあたり量子ビット1つだけでそのような空間を張るということです。この2つの間に横たわっているのは翻訳の作業であり、それは形式的な手続きではありません。

電子は フェルミオン です。2つを入れ替えると波動関数の符号が変わります——第1章のスレーター行列式が、反対称化された積を1つずつ並べる力任せのやり方で符号化していた物理的事実です。量子ビットにはそのような性質はありません。量子ビット3と量子ビット7はラベルづけされた区別可能な対象であり、パウリ行列の代数のどこにも、同種粒子の交換について知っているものはありません。

本章は3つの段階で橋を架けます。まず、量子化学を 第二量子化 の言葉に書き直します。そこでは反対称性が帳簿づけであることをやめ、代数的な恒等式になります。次に、その言葉で電子ハミルトニアンを書きます。最後に、Jordan-Wigner変換 によってそれを量子ビットへ写像し、得られた行列が本当にフェルミオンとして振る舞うことを数値的に検証します。

2.1 第二量子化をゼロから

まず1つの習慣を捨てるところから始めましょう。第一量子化の描像では \(\psi(\mathbf{r}_1, \mathbf{r}_2, \ldots)\) と書きます——電子1 がどこにいて、電子2 がどこにいて、……を述べる関数です。この枠組みはすでに誤っています。電子には割り当てるべき素性など存在しないからです。反対称化の道具立てはすべて、そもそも導入すべきでなかったラベルづけを取り消すために存在しています。

第二量子化は最初からラベルを取り除きます。第1章の \(2K\) 個のスピン軌道を固定し、それらを スロット と考えてください。すると1つの配置は、各スロットについて、それが占有されているかどうかを述べることで記述されます。

\[ |n_1\, n_2\, n_3 \ldots n_{2K}\rangle, \qquad n_i \in {0, 1} \]

これが 占有数状態 であり、\(n_i \in {0,1}\) はパウリの排他律を、上から課される規則としてではなく記法そのものに書き込んだものです。ここには、どの電子がどこにいるかを述べるものは何もありません。その問いはもはや存在しないからです。

そのような文字列すべてが張る空間が フォック空間 です。その大きさに注目してください。ビット列1つにつき1状態で \(2^{2K}\) 状態——これはちょうど \(2K\) 個の量子ビットのヒルベルト空間の大きさです。必要な対応はすでに目に見えています。

📚 生成演算子と消滅演算子

占有数状態の間を行き来するために、スロットごとに2つの演算子を用います。

真空 \(|00\ldots0\rangle\) に作用させると、生成演算子の積があらゆる配置を組み立てます。

\[ a_2^\dagger a_1^\dagger |00\ldots0\rangle = |1\,1\,0\ldots0\rangle \times (\text{a sign}) \]

この括弧書きの符号こそが要点のすべてであり、それは定義となる代数によって固定されます。

\[ {a_i, a_j^\dagger} = \delta_{ij}, \qquad {a_i, a_j} = 0, \qquad {a_i^\dagger, a_j^\dagger} = 0 \]

ここで \({A, B} = AB + BA\) は 反交換子 です。この3つの関係式 こそが フェルミオンの定義です。他のすべてはここから導かれます。

📚 なぜ反対称性が自動的になるのか

2番目の関係式が \(i \neq j\) のときに何を述べているかを見てみましょう。

\[ a_i^\dagger a_j^\dagger = -\,a_j^\dagger a_i^\dagger \]

2つの電子を逆の順序で生成すると、状態の符号が反転します。これはまさに、スレーター行列式が課すために作られた反対称性そのものです——ただしここでは誰もそれを課していません。演算子代数の帰結であり、組み立てられるあらゆる状態について自動的に成り立ちます。

同じ関係式で \(i = j\) と置いてみます。

\[ a_i^\dagger a_i^\dagger = -\,a_i^\dagger a_i^\dagger \quad \Longrightarrow \quad (a_i^\dagger)^2 = 0 \]

同じスピン軌道に2つの電子を生成することはできません。パウリの排他律は後から付け足された追加の規則ではなく、反対称性の \(i = j\) の場合にほかなりません。

もう1つ、名前に値する演算子があります。数演算子

\[ \hat{n}_i = a_i^\dagger a_i, \qquad \hat{N} = \sum_i \hat{n}_i \]

は占有を数えます。占有数状態に作用すると、\(\hat{n}_i\) は \(n_i\)——そのスロット自身の占有数——を返し、\(\hat{N}\) は電子の総数を返します。2.7節でこれを数値的に確認しますが、これは見た目以上に重要です。化学のハミルトニアンは \(\hat{N}\) を保存するので、物理的に意味を持つ状態はフォック空間のごく小さな一角しか占めないからです。

2.2 電子ハミルトニアン

この言葉で書くと、第1章の電子ハミルトニアンはコンパクトで完全に一般的な形をとります。

\[ \hat{H} = \sum_{pq} h_{pq}\, a_p^\dagger a_q \;+\; \frac{1}{2} \sum_{pqrs} h_{pqrs}\, a_p^\dagger a_q^\dagger a_r a_s \]

項は2つだけであり、分子ごとに違うのは数値 \(h_{pq}\) と \(h_{pqrs}\) だけです。演算子の構造を読み解けば、物理が見えてきます。

📚 1電子項

\(a_p^\dagger a_q\) はスピン軌道 \(q\) から電子を取り除き、スピン軌道 \(p\) に置きます。これは ホッピング です。係数 \(h_{pq}\) は 1電子積分 であり、1個の電子に単独で起こることをすべて集めたもの、すなわちその運動エネルギーと、固定されたすべての原子核からの引力です。

対角の場合 \(p = q\) は \(h_{pp}\, \hat{n}_p\) を与えます——スピン軌道 \(p\) を占有すること自体に伴うエネルギーコストです。非対角の場合は異なる軌道どうしを結び、基底状態を単一の配置ではなく重ね合わせにしているのはこちらです。

📚 2電子項

\(a_p^\dagger a_q^\dagger a_r a_s\) は2つのスピン軌道から電子を取り除き、別の2つに電子を生成します。これは 2つの電子が相互作用して新しい軌道へ散乱すること を記述しており、\(h_{pqrs}\)——2電子積分——はその過程の強さで、すべて電子間のクーロン反発から生じます。

この項が第1章のあらゆる困難の源です。電子間反発こそが電子を相関させ、基底状態を多行列式的なものにし、電子を1個ずつ解こうとするあらゆる試みを打ち破ります。項の数が増える理由もこれです。2電子積分は \(K^4\) のオーダーで存在するので、ささやかな分子のハミルトニアンでさえ、すでに非常に多くの項を持ちます。

積分はどこから来るのか

\(h_{pq}\) と \(h_{pqrs}\) は選ばれた基底関数についての定積分であり、それらを計算することは古典的には解決済みの問題です——標準的な量子化学パッケージは、小さな分子であればこれらを1秒足らずで生成します。このことは強調に値します。分業の境界を正確に位置づけてくれるからです。積分は古典的な入力であり、基底状態の探索こそが量子側の仕事です。 第4章では実際の積分の組を計算し、まさにこの式に流し込みます。

このハミルトニアンが 含んでいない ものにも注目してください。どの電子がどれであるかへの言及は一切ありません。それはすべてスロットと、スロットを満たし空にする演算子だけで書かれています。これが第二量子化の見返りであり、次の一歩をそもそも可能にしているものです。

2.3 写像の問題

私たちの手元には \(a_p^\dagger\) と \(a_q\) から組み立てられたハミルトニアンと、量子ビットから組み立てられた機械があります。ここで勝利を宣言したくなります。占有数はビットであり、フォック空間は \(2^{2K}\) 状態を持ち、\(2K\) 個の量子ビットのレジスタも \(2^{2K}\) 状態を持つ。ならば \(|n_1 n_2 \ldots\rangle\) を \(|q_1 q_2 \ldots\rangle\) に写像して終わりにしよう、というわけです。

状態 は確かに対応します。演算子 は対応しません。

食い違いを1行で述べます。異なる量子ビットに作用する演算子は 可換 です: \(X_1 Z_3 = Z_3 X_1\) が常に成り立ちます。異なるテンソル因子に作用しており、テンソル積は順序を気にしないからです。ところが異なるモードのフェルミオン演算子は 反可換 です: \(a_1 a_3 = -a_3 a_1\)。

したがって素朴な割り当て \(a_j \mapsto \sigma_j^-\)(ここで \(\sigma^- = |0\rangle\langle 1|\) は単一の量子ビットを下げます)は、占有の帳簿づけは正しく得るものの、符号 を誤ります。そして符号は飾りではありません。それは電子波動関数の反対称性そのものです。これを失えば、たまたま占有数の上限に従う区別可能な粒子を模擬していることになります——異なる基底状態を持つ、別の物理系です。

したがって 写像の問題 とは、フェルミオンの反交換関係を厳密に再現する量子ビット演算子を見つけることです。異なるサイトの量子ビット演算子は可換なのですから、余分なマイナス符号は どこかで 作り出さなければなりません。それは演算子そのものに組み込まれる必要があるのです。

2.4 Jordan-Wigner変換

最も古い解法は、同時に最も見通しのよい解法でもあります。モードに固定の順序 \(1, 2, \ldots, 2K\) を割り当て、各モードを自分専用の量子ビットに写像して、次のように定義します。

\[ a_j = \left( \prod_{k<j} Z_k \right) \sigma_j^-, \qquad a_j^\dagger = \left( \prod_{k<j} Z_k \right) \sigma_j^+ \]

ここで \(\sigma^- = |0\rangle\langle 1| = \tfrac{1}{2}(X + iY)\) は量子ビットを空にし、\(\sigma^+ = |1\rangle\langle 0| = \tfrac{1}{2}(X - iY)\) はそれを満たします。

局所的な部分 \(\sigma_j^\pm\) は、量子ビット \(j\) を空にする、あるいは満たすという当たり前の仕事をします。新しい要素は Jordan-Wigner文字列 です。選ばれた順序において \(j\) より 下 にあるすべての量子ビットに作用する \(Z\) 演算子の積です。

📚 文字列はどのように符号を作り出すのか

\(Z\) は対角であり、\(Z|0\rangle = +|0\rangle\)、\(Z|1\rangle = -|1\rangle\) です。したがって文字列 \(\prod_{k<j} Z_k\) は状態に \((-1)^{m}\) を掛けます。ここで \(m\) は \(j\) より下にある占有されたモードの数です。左側の電子を数え、1個ごとにマイナス符号を寄与するのです。

これはまさに、スレーター行列式を展開して電子をその隣のものの脇を通り抜けさせるときに現れるパリティ因子——行列式が行の交換から受け取る符号——です。Jordan-Wignerはその帳簿づけを波動関数から取り出し、演算子の側へ置きます。

その帰結はまさに私たちが必要としていたものです。異なるサイトにある2つのJordan-Wigner演算子は、互いの脇を通り抜けさせると相対的なマイナス符号を拾います。一方が、他方が \(X\) または \(Y\) で作用するサイトに \(Z\) を担っており、\(Z\) はそのどちらとも反可換だからです。2.7節では、これを信じてくださいと言う代わりに、すべての反交換関係を数値的に検証します。

📚 代償: 局所性

ただで手に入るものはありません。単一のモードに作用するフェルミオン演算子は、最大で \(j\) 個の量子ビットに作用する量子ビット演算子になります。隣接するモードの間のホッピング項はコンパクトなままですが、遠く離れたモードの間のホッピング項は、その間にあるすべてを横切って \(Z\) 演算子の文字列を引きずります。

これがJordan-Wignerの 局所性の代償 であり、美的な問題ではなく実践的な問題です。多数の量子ビットに作用するパウリ項は、実装により深い回路を要し、推定により多くの測定を要します。そして文字列の長さは軌道数とともに伸びます。2.7節では、4モードのレジスタについて文字列を明示的に示します。

この代償を別のかたちで取引する代替の写像も存在します——最もよく知られているのは Bravyi-Kitaev変換 で、占有の情報を木構造に保持することによって、演算子の重みがモード数に対して線形にではなく対数的にしか増えないようにします。本シリーズではその詳細を必要としません。

2.5 手計算で追う微小例: 2つのスピン軌道

抽象論はここまでで十分です。最小の非自明な系——2つのスピン軌道、1個の電子——を取り上げ、変換を項ごとに手で実行してみましょう。

モードが2つしかないので、2.2節のハミルトニアンには2電子項がなく(1個の電子は自分自身と反発できません)、次のように簡約されます。

\[ \hat{H} = h_{00}\, a_0^\dagger a_0 + h_{11}\, a_1^\dagger a_1 + h_{01} \left( a_0^\dagger a_1 + a_1^\dagger a_0 \right) \]

Jordan-Wignerは \(a_0 = \sigma_0^-\)——モード0の下には何もないので、その文字列は空です——と \(a_1 = Z_0\, \sigma_1^-\) を与えます。

数演算子。 モード0については、文字列は自明です。

\[ a_0^\dagger a_0 = \sigma_0^+ \sigma_0^- = |1\rangle\langle 1|_0 = \frac{I - Z_0}{2} \]

モード1については文字列が2回現れて打ち消し合います。\(Z^2 = I\) だからです。

\[ a_1^\dagger a_1 = (Z_0 \sigma_1^+)(Z_0 \sigma_1^-) = Z_0^2\, \sigma_1^+\sigma_1^- = \frac{I - Z_1}{2} \]

したがって占有は、量子ビットあたり1つの \(Z\) に写像されます。占有されたスピン軌道は \(|1\rangle\) にある量子ビットであり、それを占有するエネルギーは \(Z\) 測定によって読み取られます。

ホッピング項。 ここでは文字列が生き残ります。\(\sigma^+ Z = \sigma^+\) と \(Z \sigma^- = \sigma^-\) を用いると

\[ a_0^\dagger a_1 = \sigma_0^+ Z_0 \sigma_1^- = \sigma_0^+ \sigma_1^-, \qquad a_1^\dagger a_0 = Z_0 \sigma_1^+ \sigma_0^- = \sigma_0^- \sigma_1^+ \]

となり、\(\sigma^\pm = \tfrac{1}{2}(X \mp iY)\) を代入すると虚部が打ち消し合います。

\[ \sigma_0^+\sigma_1^- + \sigma_0^-\sigma_1^+ = \frac{1}{2}\left( X_0 X_1 + Y_0 Y_1 \right) \]

まとめると、ハミルトニアン全体がパウリ文字列の重み付き和になります。

\[ \hat{H} = \frac{h_{00} + h_{11}}{2}\, I \;-\; \frac{h_{00}}{2} Z_0 \;-\; \frac{h_{11}}{2} Z_1 \;+\; \frac{h_{01}}{2} \left( X_0 X_1 + Y_0 Y_1 \right) \]

この式が何であるかを見てください。定数と、実係数を持つ少数のパウリ項の和です——量子コンピュータ入門 シリーズが変分ソルバーに与えたおもちゃのハミルトニアン \(0.4Z + 0.3X\) と構造的に同一です。分子のハミルトニアンと教科書的な量子ビットハミルトニアンは同じ種類の対象であり、分子は単に項が多いだけなのです。2.7節のコードは、この導出を行列要素ごとに確認します。

2.6 最小基底におけるH₂

本シリーズの残りを通して使われる例は、最小基底関数系における水素分子です。そしていま、その規模を正確に見積もることができます。

最小基底は各水素原子に \(s\) 型の関数を1つずつ置くので、\(K = 2\) の 空間軌道 となります。それぞれが上向きスピンか下向きスピンを収容し、\(2K = 4\) の スピン軌道 を与えます。Jordan-Wignerはスピン軌道1つにつき量子ビットを1つ割り当てるので、この分子は 4量子ビットのレジスタ に写像されます。

第1章の数え上げがそのまま適用できます。4つのスピン軌道に2個の電子で \(\binom{4}{2} = 6\) 個の行列式です。4量子ビットのレジスタは \(2^4 = 16\) 状態を張るので、レジスタの大部分は電子数が誤っている配置を記述しています。物理はそれらを無視しますが——ハミルトニアンは \(\hat{N}\) を保存します——量子ビットはそれでもそれらを担い続けます。

この隔たりは好機でもあります。対称性を使えばレジスタを縮小できるのです。

これらの簡約を活用することは標準的な実践であり、4量子ビットの分子問題をはるかに小さなデバイスに収める方法でもあります。第4章では、この簡約を実際の積分に対して明示的に実行します。 ここでは、動かせる余地がどこから来るのかが見えれば十分です。

2.7 ハンズオン: パウリ行列からフェルミオンを組み立てる

本節は本章の中心です。4モードについてのJordan-Wigner演算子を明示的なNumPy行列として構築し、そのうえでそれらを テスト します。符号を誤った写像は目で見て明らかに誤っているわけではなく、そして反交換関係は完全な検査になるからです。

コードはNumPyだけあれば動きます。4モードでは \(16 \times 16\) の行列となり、力任せに組み立てられるほど小さく、しかも \(Z\) 文字列が自明でなくなる程度には大きい大きさです。

import math
import numpy as np
from functools import reduce

# ---------------------------------------------------------------
# 1. 単一量子ビットの構成要素。
#    約束: |0> = 空のスピン軌道、|1> = 占有されたスピン軌道。
# ---------------------------------------------------------------
I2 = np.eye(2, dtype=complex)
X = np.array([[0, 1], [1, 0]], dtype=complex)
Y = np.array([[0, -1j], [1j, 0]], dtype=complex)
Z = np.array([[1, 0], [0, -1]], dtype=complex)
SIGMA_MINUS = np.array([[0, 1], [0, 0]], dtype=complex)   # |0><1| : 電子を取り除く

def kron_all(ops):
    """2x2行列のリストのテンソル積。モード0が最も左に来る。"""
    return reduce(np.kron, ops)

# ---------------------------------------------------------------
# 2. Jordan-Wigner変換。
#
#        a_j = ( Z_0 Z_1 ... Z_{j-1} ) sigma^-_j
#
#    より小さい添字を持つすべてのモードに作用するZ演算子の文字列こそが、
#    フェルミオンの反対称性が要求するマイナス符号を供給する。
# ---------------------------------------------------------------
def jw_annihilation(j, n_modes):
    ops = [Z] * j + [SIGMA_MINUS] + [I2] * (n_modes - j - 1)
    return kron_all(ops)

def pauli_on(pauli, j, n_modes):
    """単一量子ビットのパウリ演算子をモードjに埋め込み、レジスタ全体に拡張する。"""
    return kron_all([I2] * j + [pauli] + [I2] * (n_modes - j - 1))

M = 4                                   # 4つのスピン軌道 -> 4つの量子ビット
DIM = 2 ** M
a = [jw_annihilation(j, M) for j in range(M)]
adag = [op.conj().T for op in a]
IDENT = np.eye(DIM, dtype=complex)

print(f"Jordan-Wigner operators for M = {M} modes: each matrix is {DIM} x {DIM}")
print()

# ---------------------------------------------------------------
# 3. 決定的なテスト: これらの行列は本当にフェルミオンとして振る舞うか?
#       {a_i, a_j^dag} = delta_ij * I        {a_i, a_j} = 0
# ---------------------------------------------------------------
def anticommutator(A, B):
    return A @ B + B @ A

worst_ad, worst_aa = 0.0, 0.0
print("{a_i, a_j^dag} - delta_ij * I   (max |entry|, should be 0)")
for i in range(M):
    row = []
    for j in range(M):
        expected = IDENT if i == j else np.zeros((DIM, DIM), dtype=complex)
        dev = np.max(np.abs(anticommutator(a[i], adag[j]) - expected))
        worst_ad = max(worst_ad, dev)
        row.append(f"{dev:8.1e}")
    print("   " + " ".join(row))
print()

print("{a_i, a_j}                      (max |entry|, should be 0)")
for i in range(M):
    row = []
    for j in range(M):
        dev = np.max(np.abs(anticommutator(a[i], a[j])))
        worst_aa = max(worst_aa, dev)
        row.append(f"{dev:8.1e}")
    print("   " + " ".join(row))
print()
print(f"worst deviation, {{a_i, a_j^dag}} : {worst_ad:.3e}")
print(f"worst deviation, {{a_i, a_j}}     : {worst_aa:.3e}")
print(f"a_j^2 = 0 for every j            : "
      f"{all(np.allclose(a[j] @ a[j], 0) for j in range(M))}")
print()

# ---------------------------------------------------------------
# 4. 数演算子。n_j = a_j^dag a_j はモードjの占有を数え、
#    N = sum_j n_j は電子を数える。その固有値は整数0..Mで
#    なければならず、縮退度は二項係数C(M, k)になる。
# ---------------------------------------------------------------
N_op = sum(adag[j] @ a[j] for j in range(M))
eigvals = np.linalg.eigvalsh(N_op)
print("Eigenvalues of the total number operator N = sum_j a_j^dag a_j")
values, counts = np.unique(np.round(eigvals.real, 10), return_counts=True)
for v, c in zip(values, counts):
    print(f"  N = {v:.0f}   degeneracy {c:2d}   (C({M}, {v:.0f}) = {math.comb(M, int(v))})")
print(f"  imaginary part of every eigenvalue: {np.max(np.abs(eigvals.imag)):.1e}")
print()

# n_jは対角である: JWは占有を量子ビットの基底状態へ直接写像する。
n0_from_jw = adag[0] @ a[0]
n0_from_pauli = 0.5 * (IDENT - pauli_on(Z, 0, M))
print("Is  a_0^dag a_0 == (I - Z_0)/2 ?  "
      f"{np.allclose(n0_from_jw, n0_from_pauli)}")
print()

# ---------------------------------------------------------------
# 5. 2モードの微小例を、項ごとに確認する。
#    H = h00 n_0 + h11 n_1 + h01 (a_0^dag a_1 + a_1^dag a_0)
#    は次の形になるはずである
#    H = (h00+h11)/2 I - (h00/2) Z_0 - (h11/2) Z_1
#          + (h01/2) (X_0 X_1 + Y_0 Y_1)
# ---------------------------------------------------------------
m = 2
b = [jw_annihilation(j, m) for j in range(m)]
bdag = [op.conj().T for op in b]
I4 = np.eye(4, dtype=complex)
h00, h11, h01 = -1.25, -0.40, -0.30       # 説明用の積分値であり、実在の分子のものではない

H_fermionic = (h00 * bdag[0] @ b[0] + h11 * bdag[1] @ b[1]
               + h01 * (bdag[0] @ b[1] + bdag[1] @ b[0]))

Z0, Z1 = pauli_on(Z, 0, m), pauli_on(Z, 1, m)
X0X1 = pauli_on(X, 0, m) @ pauli_on(X, 1, m)
Y0Y1 = pauli_on(Y, 0, m) @ pauli_on(Y, 1, m)
H_pauli = ((h00 + h11) / 2 * I4 - h00 / 2 * Z0 - h11 / 2 * Z1
           + h01 / 2 * (X0X1 + Y0Y1))

print("Two modes, one electron: fermionic form vs. hand-derived Pauli form")
print(f"  matrices agree: {np.allclose(H_fermionic, H_pauli)}")
print(f"  max |difference|: {np.max(np.abs(H_fermionic - H_pauli)):.3e}")

print()

# 1電子セクターは|10>と|01>が張る -- 基底の添字は2と1。
# そのスペクトルは2x2の積分行列の固有値と一致しなければならない。
h_matrix = np.array([[h00, h01], [h01, h11]])
one_particle = np.linalg.eigvalsh(h_matrix)
sector = H_pauli[np.ix_([2, 1], [2, 1])]
sector_spectrum = np.linalg.eigvalsh(sector)

print("Spectra")
print(f"  full 4x4 qubit Hamiltonian : {np.round(np.linalg.eigvalsh(H_pauli).real, 6)}")
print(f"  N = 1 block of the qubit H  : {np.round(sector_spectrum.real, 6)}")
print(f"  2x2 one-electron integrals  : {np.round(one_particle, 6)}")
print(f"  they match: {np.allclose(sector_spectrum, one_particle)}")
print()

# ---------------------------------------------------------------
# 6. Jordan-Wignerの代価: Z文字列。遠く離れた2つのモードの間の
#    ホッピング項は、その間にあるすべてのモードに作用するパウリ
#    文字列に変わる。射影によって文字列を読み取る。
# ---------------------------------------------------------------
PAULIS = {"I": I2, "X": X, "Y": Y, "Z": Z}

def pauli_decompose(H, n_modes, tol=1e-12):
    """2^n x 2^nの行列をパウリ基底で展開する (Tr[P H] / 2^n)。"""
    terms = []
    from itertools import product
    for labels in product("IXYZ", repeat=n_modes):
        P = kron_all([PAULIS[c] for c in labels])
        coeff = np.trace(P.conj().T @ H) / (2 ** n_modes)
        if abs(coeff) > tol:
            terms.append(("".join(labels), coeff))
    return terms

for p, q in [(0, 1), (0, 3)]:
    hop = adag[p] @ a[q] + adag[q] @ a[p]
    terms = pauli_decompose(hop, M)
    weights = [sum(1 for c in label if c != "I") for label, _ in terms]
    print(f"a_{p}^dag a_{q} + a_{q}^dag a_{p}  ->  "
          f"{len(terms)} Pauli terms, max weight {max(weights)}")
    for label, coeff in terms:
        print(f"    {coeff.real:+.3f}  {label}")

出力:

Jordan-Wigner operators for M = 4 modes: each matrix is 16 x 16

{a_i, a_j^dag} - delta_ij * I   (max |entry|, should be 0)
    0.0e+00  0.0e+00  0.0e+00  0.0e+00
    0.0e+00  0.0e+00  0.0e+00  0.0e+00
    0.0e+00  0.0e+00  0.0e+00  0.0e+00
    0.0e+00  0.0e+00  0.0e+00  0.0e+00

{a_i, a_j}                      (max |entry|, should be 0)
    0.0e+00  0.0e+00  0.0e+00  0.0e+00
    0.0e+00  0.0e+00  0.0e+00  0.0e+00
    0.0e+00  0.0e+00  0.0e+00  0.0e+00
    0.0e+00  0.0e+00  0.0e+00  0.0e+00

worst deviation, {a_i, a_j^dag} : 0.000e+00
worst deviation, {a_i, a_j}     : 0.000e+00
a_j^2 = 0 for every j            : True

Eigenvalues of the total number operator N = sum_j a_j^dag a_j
  N = 0   degeneracy  1   (C(4, 0) = 1)
  N = 1   degeneracy  4   (C(4, 1) = 4)
  N = 2   degeneracy  6   (C(4, 2) = 6)
  N = 3   degeneracy  4   (C(4, 3) = 4)
  N = 4   degeneracy  1   (C(4, 4) = 1)
  imaginary part of every eigenvalue: 0.0e+00

Is  a_0^dag a_0 == (I - Z_0)/2 ?  True

Two modes, one electron: fermionic form vs. hand-derived Pauli form
  matrices agree: True
  max |difference|: 5.551e-17

Spectra
  full 4x4 qubit Hamiltonian : [-1.65     -1.345216 -0.304784  0.      ]
  N = 1 block of the qubit H  : [-1.345216 -0.304784]
  2x2 one-electron integrals  : [-1.345216 -0.304784]
  they match: True

a_0^dag a_1 + a_1^dag a_0  ->  2 Pauli terms, max weight 2
    +0.500  XXII
    +0.500  YYII
a_0^dag a_3 + a_3^dag a_0  ->  2 Pauli terms, max weight 4
    +0.500  XZZX
    +0.500  YZZY

結果の読み方。 ここでは5つのことが起こりました。そのそれぞれが立ち止まる価値を持ちます。

SIGMA_MINUS が \(Z\) 文字列なしで作用するように変えてみてください——つまり jw_annihilation を [Z] * j ではなく [I2] * j で定義して、再実行してみてください。占有の帳簿づけは相変わらず完全にもっともらしく見え、数演算子も相変わらず正しい固有値を持ちますが、反交換のテストはあらゆる \(i \neq j\) について直ちに失敗します。その失敗こそが、文字列が存在する理由のすべてです。

🎯 演習問題

  1. 代数から出てくる排他律。 \({a_i^\dagger, a_j^\dagger} = 0\) だけを出発点として \((a_i^\dagger)^2 = 0\) を導き、これがなぜ別個の要請ではなくパウリの排他律なのかを1文で説明してください。
  2. 手計算による数演算子。 反交換関係だけを用いて \(\hat{n}_i = a_i^\dagger a_i\) が \(\hat{n}_i^2 = \hat{n}_i\) を満たすことを示し、それがその固有値について何を意味するかを述べてください。出力されたスペクトルと突き合わせて、答えを確認してください。
  3. 微小例を拡張する。 2.5節の導出を 3つ のモードについて繰り返し、\(a_0^\dagger a_2 + a_2^\dagger a_0\) のJordan-Wigner形を手で求めてください。コード中の pauli_decompose 関数で検証してください。
  4. 順序が効いてくる。 Jordan-Wigner文字列の長さは、スピン軌道に番号をつける順序に依存します。大きなホッピング項がモード0↔1と2↔3を結び、小さな項が0↔3を結ぶようなハミルトニアンについて、どの順序がパウリ重みの合計を最小にするかを論じてください。そのうえで、逆の順序が勝つ場合を構成してください。
  5. セクターを数える。 \(M = 6\) モードについて、何かを実行する前に \(\hat{N}\) の固有値スペクトルと縮退度を予想してください。コードを改造して確認し、縮退度の合計が \(2^6\) になることを確かめてください。

まとめ

本章では、分子から量子ビットのレジスタへ至る橋を架けました。第二量子化 は、ラベルづけされた電子を、固定されたスピン軌道のスロットの組の上の占有数状態 \(|n_1 n_2 \ldots\rangle\) で置き換え、反対称化を代数で置き換えます。反交換関係 \({a_i, a_j^\dagger} = \delta_{ij}\) と \({a_i, a_j} = 0\) が反対称性を自動的なものにし、パウリの排他律を特別な場合 \((a_i^\dagger)^2 = 0\) として与えるのです。この言葉で書けば 電子ハミルトニアン は \(\hat{H} = \sum h_{pq} a_p^\dagger a_q + \tfrac{1}{2}\sum h_{pqrs} a_p^\dagger a_q^\dagger a_r a_s\) であり、1電子積分が運動エネルギーと原子核からの引力を担い、2電子積分がすべての相関の原因である電子間反発を担います——そして両方の積分の組は古典的な入力であり、量子側の計算が始まる前に普通の計算機で計算されます。続いて私たちは 写像の問題 に直面しました。異なるサイトの量子ビット演算子は可換であるのに対しフェルミオン演算子は反可換なので、占有をビットへ素朴に割り当てると、反対称性を符号化しているまさにその符号を失ってしまうのです。Jordan-Wigner変換 はこれを \(a_j = (\prod_{k<j} Z_k)\,\sigma_j^-\) によって修復します。ここで \(Z\) 文字列が \(j\) より下の占有されたモードを数えてパリティの符号を作り出しますが、その代償として演算子のパウリ重みがモードの隔たりとともに増大します。Bravyi-Kitaev 写像はその代償を別のかたちで取引します。2つのモードを手で計算すると \(\hat{H} = \tfrac{h_{00}+h_{11}}{2} I - \tfrac{h_{00}}{2}Z_0 - \tfrac{h_{11}}{2}Z_1 + \tfrac{h_{01}}{2}(X_0X_1 + Y_0Y_1)\) が得られました——パウリ文字列の重み付き和であり、入門シリーズのおもちゃのハミルトニアンと構造的に同一です。最小基底のH₂ では、2つの空間軌道が4つのスピン軌道となり、したがって4つの量子ビットとなりますが、その16状態のうち2個の電子を担うのは6つだけです。この隔たりの背後にある対称性こそ、第4章がレジスタを縮小するために活用するものです。そして私たちのNumPyによる構築は、この枠組み全体を検証しました。すべての反交換関係が厳密に満たされ、\(a_j^2 = 0\) が成り立ち、数演算子はスペクトル \(0..4\) と縮退度 \(1, 4, 6, 4, 1\) を持ち、手計算による導出は \(10^{-17}\) の精度で確認され、\(Z\) 文字列は遠いホッピングに対する重み4のパウリ項として目に見えました。

私たちはいま、量子ビットに作用するパウリ文字列の和として表された分子ハミルトニアンを手にしています——量子コンピュータが実際に測定できる形式です。次章では、その対象を1つの数値へと変えるアルゴリズムを取り上げます。変分量子固有値ソルバー、そのアンザッツの設計、あらゆるエネルギー推定の内側に潜む測定の問題、そしてそれが4段階のループが示唆するよりも実践的には難しい理由です。

← 第1章: なぜ化学がキラーアプリなのか 第3章: VQE — アルゴリズムの全体像 →

免責事項