Fock打ち切り、量子シミュレーションで残す状態数をどう決めるか

高さの異なる二つの淡い青の枠と、その中で広がる曲面。計算に用意する状態範囲の違いを表す抽象画。

量子の振動を計算するとき、「何回測るか」の前に、計算の中へ何段の状態を用意するかを決めることがあります。その数が足りなければ、測定回数を増やしても、計算から抜け落ちた状態は戻りません。

Open Quantum Design(OQD)の公開エミュレーターには、モードの状態数を指定するfock_cutoffがあります。Fock(フォック)打ち切りとは何を切り、結果をどう変えるのか。固定版のOQDと、その依存先であるQuTiP 5.1.1の実装を読み、小さな独立計算で確かめます。[1][2]

簡単にまとめると?

  • 保持する状態数をNとすると、数えるのは励起数0からN−1までです。Nは測定回数でも、量子ビット数でもありません。
  • 有限の行列では、最上位から一段上へ移る作用が表せません。確率の合計が1でも、十分な計算範囲を確保できたとは限りません。
  • 状態数を増やし、必要な時刻と観測量で結果の変化を比べます。平均値の一致だけを、全分布や実機モデルの正しさへ広げないことが大切です。

Fock打ち切りは、計算に残す状態の範囲

光の一つのモードなどを、量子調和振動子として扱うモデルを考えます。モードは、ここでは独立した一つの振動の自由度です。その励起が0個、1個、2個……と決まった状態をFock状態と呼びます。理想的な振動子には上限がありませんが、コンピューターでは有限の状態数に区切って表す必要があります。

QuTiPのdestroy(N)やcreate(N)は、N個の状態を持つ行列を作ります。通常の下限0の設定なら、N=4で残るのは0、1、2、3の4状態です。「励起数4まで含む」という意味ではありません。生成演算子は励起を一つ増やす作用、消滅演算子は一つ減らす作用を表します。[2][4]

確認したOQDの実装は、量子ビットに2次元、モードにfock_cutoff次元を割り当て、それらを組み合わせて初期状態を作ります。モードの生成・消滅演算子も、同じ値をQuTiPへ渡して構成します。引数クラスの既定値は4ですが、これはコードの初期設定であり、どの問題でも4状態で十分という推奨値ではありません。[1]

行列の最上位には、本来ない境界ができる

無限に状態を持つ振動子なら、励起数3の状態へ生成演算子を作用させると、励起数4の状態へ進みます。ところがN=4の行列には、その行き先がありません。最上位の3へ同じ作用を与えた結果は、ゼロベクトルになります。これは「真空の状態0に戻る」という意味でも、実物がそれ以上励起されないという意味でもなく、有限の表現に行き先がないということです。

この違いは、上げる作用と下げる作用を順に行った結果にも現れます。無限系では、その順序を入れ替えた差[a, a†]は単位行列です。一方、N状態へ切った行列では、[a_N, a_N†] = I − N|N−1⟩⟨N−1|となります。ここでIは状態を変えない単位行列、最後の項は最上位の状態だけに作用する項です。N=4なら対角成分は1、1、1、−3となり、境界だけが変わります。これは固定実装の行列から求めた関係です。[2]

計算した状態が上の方まで広がると、この境界が時間変化へ影響し得ます。そのため、出力が滑らかに見えることや、確率の合計が1であることだけでは、打ち切りが十分かを判断できません。

確率の合計が1でも、平均値は変わる

具体例として、最初は励起数0の真空状態を用意し、励起を増減させる一定の駆動を加えます。時間と駆動の強さをまとめた無次元の量をτとし、ħ=1、時間発展を定める行列をH_N=i(a_N†−a_N)と置きます。τは説明用に規格化した時間であり、秒や実機のパルス条件ではありません。この例には環境による減衰を入れていません。

状態数を制限しない同じモデルでは、τのときに実数振幅α=τのコヒーレント状態となり、平均励起数はτ²です。そこでτ=2、平均励起数4となる場合を、有限の行列で比較しました。有限側は行列の指数関数から状態を計算し、別に組んだ級数計算でも照合しています。OQDやQuTiP本体の実行結果ではなく、公開実装の行列定義に基づく独立した数学的検算です。[2][3]

保持状態数を増やした比較。τ=2、無限系の平均励起数4を基準とした独立計算。数値は丸めて表示。
保持する状態数N 励起数の範囲 平均励起数 4との差の絶対値 確率の合計
4 0〜3 2.563436 約1.44 1.000000
8 0〜7 3.921905 約0.0781 1.000000
12 0〜11 3.998949 約0.00105 1.000000
20 0〜19 4.000000 約8.79×10−9 1.000000

狭い画面では表を横にスクロールできます。N=4では、そもそも励起数3までしか残していないので、平均4を表すことはできません。Nを増やすと、この例では平均値が無限系の値に近づきます。しかし、すべての行で確率の合計は同じように1です。有限行列の時間発展自体は正規化を保つため、抜け落ちた状態の影響は「確率の合計が減る」という形では現れません。

QuTiPのコヒーレント状態を作る実装も、二つの作り方を区別しています。有限空間の変位演算子で作るoperator方式は正規化を保ちます。一方、無限系の解析式から係数を取り出すanalytic方式では、少ない状態で切ると確率の合計が1にならない場合があります。後者の不足分と、前者の正規化済みの状態のずれを混同しないことが重要です。[3]

状態数を増やす前後で、何を比べるか

実際に計算範囲を選ぶときは、最初に必要な観測量と許容する変化の大きさを決めます。平均励起数が必要なら、同じモデル、初期状態、駆動、時刻の範囲を保ち、Nを増やしたときの平均値を比較します。分布そのものが必要なら、各状態の確率も比べます。平均値が合うだけでは、分布全体が合っているとは言えません。

また、最後の時刻だけでなく、途中の時間変化も確認します。最上位付近の状態に確率が集まっていないかは、境界の影響を疑う手掛かりになります。ただし、その確率が小さいという一つの条件だけで、すべての観測量の誤差を保証できるわけではありません。表のN=20も、このモデルと時刻での結果であり、別の駆動や長い時間に通用する万能の設定ではありません。

状態数を増やすと、計算で扱う量も増えます。OQDの固定実装ではモードの状態空間を組み合わせるため、量子ビットを含まない2モードならN=4で16次元、N=8で64次元です。これは状態空間の大きさの比較であり、実行時間やメモリー消費が必ず4倍になるという測定結果ではありません。[1]

測定回数や物理モデルの確認とは分ける

ショット数は、同じ計算上の確率から何回の模擬測定結果を取り出すかに関わります。Fock打ち切りは、その確率を作る状態空間の範囲に関わります。さらに、環境との相互作用をモデルに入れるか、数値計算の精度をどう設定するかも別の問題です。どれか一つを細かくしても、ほかの不足が自動的に解消するわけではありません。

今回確認したのは、OQDの固定版が有限次元をどう渡すかと、その行列に生じる境界の一例です。必要な状態数が確保できたとしても、採用した物理モデルが実際の装置に合うかは別途確かめます。まず状態数を変えた比較で数値表現の範囲を点検し、そのうえで標本のばらつきや物理的な仮定を評価する。この順に分けると、計算の何を改善すべきかが見えやすくなります。

参考資料

OQDは固定コミット6a086a9843b91d041e76fbd4fed83c5384a14e6e、QuTiPコードは依存版5.1.1の固定コミット7accc77a70a08f965a29fdd13515f79cdcab9703を確認しました。最新版一般の性能を示すものではありません。表と境界式はQuantum Seaによる独立計算です。

  1. Open Quantum Design, oqd-analog-emulator conversion.py、interface.py、pyproject.toml。モード次元、演算子生成、既定値と依存版。
  2. QuTiP, operators.py。destroy、create、displaceの有限行列定義。
  3. QuTiP, states.py。coherent関数のoperator/analytic方式、Fock基底の係数。
  4. QuTiP 5.1 Documentation, Manipulating States and Operators。Fock状態、生成・消滅演算子と数演算子の説明。