タグ: オープンソース

  • TrICalで見るイオンの平衡位置と振動モード——並び方と揺れ方の違い

    TrICalで見るイオンの平衡位置と振動モード——並び方と揺れ方の違い

    イオントラップの中では、同じ符号の電荷を持つイオン同士が反発しながら、外から加えた閉じ込めの力によって一定の配置をつくります。その並び方が分かっても、少し押したときにどう揺れるかは、まだ分かりません。位置と揺れ方は、同じ力から求める別々の情報です。

    Open Quantum Design(OQD)の公開計算ツールTrICalには、平衡位置を求める処理と、そこから振動モードを求める処理があります。この二段階を追うと、イオンが落ち着く場所と、集団として動く仕組みの違いが見えてきます。

    簡単にまとめると?

    • 平衡位置は、閉じ込めとイオン同士の反発を合わせたポテンシャルエネルギーが、局所的に最小になる配置です。
    • 振動モードは、その配置から少しずれたときの戻る力を使って求めます。イオンごとに独立して揺れるとは限りません。
    • TrICalの公開実装では、平衡位置の計算に続き、エネルギーの曲率と質量からモードの周波数と動く向きを求めています。

    反発と閉じ込めが釣り合う場所

    まず、同じ電荷を持つ二つのイオンを、左右に動ける一本の軸に沿って閉じ込めた場合を考えます。中央へ戻そうとする力だけなら、どちらも中央に集まるはずです。しかしイオン同士は反発するので、一定の間隔を空けた配置に落ち着きます。

    この力の関係は、位置に応じて変わるポテンシャルエネルギーで表せます。閉じ込めによる項とクーロン反発の項を足し合わせ、エネルギーが小さくなる位置を探すのが平衡位置の計算です。OQDの解説も、この二つの寄与を合計して配置を求める流れを示しています。

    実際の数値計算では、最適化が止まっただけで最も安定した配置と断定できるわけではありません。初期配置や計算する方向によって、別の局所的な極小へ進む場合があります。まず力が十分小さくなっているか、その近くでエネルギーが増えるかを調べることが、次の振動計算につながります。

    同じ位置でも、揺れる向きによって戻る力が違う

    平衡位置から少しだけイオンをずらすと、元へ戻そうとする力が生まれます。その強さを決めるのは、エネルギーの値そのものではなく、位置に対してどれくらい急に曲がっているかです。

    多くの座標について、この曲がり方をまとめた行列をヘッセ行列(Hessian)と呼びます。対角成分は一つの座標を動かしたときの曲率を、非対角成分は別の座標の変化との結び付きを表します。一つのイオンを押すと隣のイオンへの反発も変わるので、集団の動きを考える必要があるのです。

    そこで、一定の割合を保ちながらイオンが一緒に動く組合せを探します。これが振動モード(基準振動)です。動く向きと相対的な大きさを表す固有ベクトルと、その揺れの周波数が一組になります。モードの形が分かれば、どのイオンが同じ向きに動き、どこで反対向きになるかを読み取れます。

    二つのイオンでは、同じ向きと反対向きに分かれる

    違いが見えやすいのは、質量と電荷が同じ二つのイオンを、左右対称な調和ポテンシャルに閉じ込めた理想モデルです。ここでは軸方向の小さな振動だけを考え、横方向の動きは十分強く閉じ込められているとします。これはTrICalの実行結果や装置の測定値ではなく、仕組みを説明するための模型です。

    軸方向のモード イオンの動き 二つの間隔 角周波数
    重心モード 同じ向きに同じ量だけ動く 変わらない ω₀
    伸縮モード 反対向きに同じ量だけ動く 広がったり狭まったりする √3 ω₀
    同じ質量・電荷、調和的な軸方向閉じ込め、小振幅を仮定した二イオン模型。ω₀は単独のイオンの軸方向角周波数。模型からの計算:Quantum Sea。

    重心モードでは、二つのイオンの間隔が変わりません。そのため、動きに伴うクーロン反発の変化はなく、集団全体が閉じ込めの力で揺れます。伸縮モードでは間隔が変わるので、反発の変化も戻る力に加わり、より速い揺れになります。

    この模型で平衡点のヘッセ行列を質量で割ると、ω₀²に行列[[2, −1], [−1, 2]]を掛けた形になります。固有値はω₀²と3ω₀²で、平方根を取ると表の二つの角周波数が得られます。固有ベクトルの成分が同符号なら同じ向き、異符号なら反対向きの動きです。

    たとえば単独のイオンの周波数を仮に1 MHzと置くと、この理想模型では重心モードが1 MHz、伸縮モードは約1.73 MHzになります。異なる質量を混ぜたり、閉じ込めが調和的でなかったりする場合に、この比をそのまま使うことはできません。

    TrICalの処理では、位置から曲率、質量へ進む

    OQDが公開するTrappedIonsの実装では、equilibrium_positionがイオン間反発と外部ポテンシャルを合計し、最適化で平衡位置を探します。normal_modesは、その平衡位置でヘッセ行列を評価する処理です。位置がまだ保存されていなければ、先に平衡位置を計算します。

    曲率だけでは揺れる速さは決まりません。同じ戻る力でも、重いものほど加速しにくいため、質量が必要です。今回確認した実装は、共通の質量を使う場合には行列を質量で割り、質量を並べて与える場合には平方根を使って座標間の重みを調整してから、固有値と固有ベクトルを求めます。

    さらに、計算のために無次元化した長さやエネルギーの尺度を戻し、固有値の平方根から周波数に相当する量を得ます。この式の次元で得られるのは角周波数ωです。Hz単位の周波数fにするには、f = ω / 2π と換算します。返り値をそのままMHzと読まず、質量・長さ・ポテンシャルの単位をそろえることが大切です。

    参照したのは、OQDの上位リポジトリから指定されているTrICalのcommit 2c3a91dです。その版のパッケージ記載は0.1.0dev1で、開発段階の公開実装として読みました。ここで説明した処理はコードの照合に基づくもので、TrICalを実行した性能評価や実機の動作確認ではありません。

    周波数の一覧だけで、安定性まで決めない

    小さな振動として扱うには、対象とする自由度で平衡点が安定していることが必要です。質量を考慮した曲率に負の固有値があれば、その方向は元へ戻る揺れとして扱えません。ゼロに近い値なら、弱い閉じ込めや対称性に由来する自由な動き、数値誤差などを区別する必要があります。

    同じ配置でも、軸方向では安定し、横方向では不安定ということも考えられます。計算した方向、ポテンシャルの近似、質量と単位、そして固有値の符号をそろえて見ると、周波数の違いが物理的な変化なのか、模型や計算条件の違いなのかを判断しやすくなります。平衡位置は「どこにいるか」、振動モードは「その近くでどう動くか」を教えてくれます。

    出典

  • IBMのQiskit 2.6、C APIで量子回路の変換と保存を組み込む

    IBMのQiskit 2.6、C APIで量子回路の変換と保存を組み込む

    量子コンピューターで計算するときも、実機へ渡す回路を作り、装置に合う形へ変換する仕事は通常のコンピューターが担います。研究施設の計算システムにこの前処理を組み込むには、量子向けのソフトウェアを、すでに動いているプログラムから呼び出せることが大切です。

    2026年10月16日に公開されたQiskit 2.6では、C言語から利用する窓口であるC APIが拡充されました。IBMが10月22日に紹介した今回の変更では、回路を変換する手順を組み立てる機能と、回路をファイルへ保存・復元する機能が加わっています。高性能計算、HPCの処理の中へ量子回路の前処理を置きやすくする更新です。[1、2]

    簡単にまとめると?

    • Qiskit 2.6のC APIでは、回路の検査や変換を行う処理を、自分で選んで順番につなげられます。
    • 回路を保存するQPY形式にも対応しました。ただし、古いソフトで新しい形式を開けるとは限らず、Pythonに依存する内容にも制約があります。
    • 単独で使うC APIは実行時にPythonの処理系を起動しませんが、2.6ではPythonのインストール自体はまだ必要です。APIも実験段階です。

    装置へ渡す前の回路を、どこで整えるか

    量子回路は、量子ビットにどの操作をどの順番で施すかを表すものです。考えた通りの回路を、そのままどの装置でも実行できるわけではありません。装置が扱える基本操作や、量子ビット同士の接続に合わせて、回路を書き換える必要があります。この変換をトランスパイルと呼びます。

    Qiskitは、こうした回路の作成や変換に使うオープンソースの開発基盤です。Pythonから扱う方法に加えて、内部のRust実装をCから呼び出すAPIの整備が進んでいます。Cを呼べるC++などのプログラムからも利用できるため、既存の計算処理へ接続する選択肢になります。[1、3]

    たとえば、材料の状態を調べる計算で、通常のコンピューターが候補となる回路を何度も作り直す場面を考えてみます。これは利用方法を説明する仮想例です。回路の準備を既存のHPCプログラムから直接呼べれば、量子向けの処理だけを別のアプリケーションとして切り離さず、一連の計算手順として組み立てやすくなります。

    回路の変換手順を、自分で組み立てる

    従来のC APIでも、用意された変換手順を使うことはできました。2.6で加わったカスタム・パスマネージャーは、その中の処理をより細かく選ぶための仕組みです。パスとは、回路の状態を調べたり、回路を書き換えたりする一つの処理を指します。パスマネージャーが、それらを指定した順に実行します。[1、4]

    たとえば、回路の情報を調べる段階と、特定の基本操作へ変換する段階を分け、必要な処理を順に並べる、といった使い方です。用意された設定を選ぶだけで足りない研究や、独自の変換手順を比較したい開発では、この組み立て方が役立ちます。

    処理の途中では、回路をプログラムが扱いやすい内部の形にします。これが中間表現、IRです。C APIのパスマネージャーは、前の処理が出すIRの種類と、次の処理が受け取る種類が合うかを調べます。受け渡しの不一致を見つける仕組みであり、変換後の回路が特定の実機で高い精度を出せることまで保証するものではありません。[4]

    なお、C側のトランスパイラーが想定するのは、C APIで作られた回路です。Python側の機能を混ぜた回路をそのまま渡すと、十分な結果を得られない可能性があります。Pythonと組み合わせる場合はPython側の変換入口を使う、という境界も公式文書に示されています。[3]

    QPYで保存しても、読み手の版はそろえる

    回路を毎回作り直す代わりに、準備した回路を保存して次の処理へ渡したいこともあります。QPYはQiskitの回路を記録するバイナリー形式です。2.6ではC APIからも保存と読み込みを行えるようになり、対応する内容ならPython側との受け渡しにも使えます。[1、5]

    ただし、ファイルを渡すだけで、どの環境でも同じように開けるわけではありません。Qiskit 2.6の既定のQPY形式はバージョン18です。古いQiskitが新しい形式を読めるとは限らないため、受け取る側の対応版を先に確かめる必要があります。保存時に形式の版を選ぶ場合も、そのAPIが書き出せる範囲で選びます。[5、6]

    もう一つの境界は、保存する内容がPythonの処理系を必要とするかどうかです。C APIのQPY機能は、そのような内容を扱おうとするとエラーを返します。Python上で作れた回路や付随情報を、すべてそのままC側へ移せると考えるのは早計です。実際に使う回路の種類と付随情報で、保存・復元できる範囲を確かめることになります。[5]

    保存した回路を後から再利用するなら、QPYファイルに加えて、使ったQiskitの版や変換先の装置条件も記録しておくと、何を前提に準備した回路かを追いやすくなります。回路の保存と、実験環境や実機の測定結果まで含めた再現性は、分けて考える必要があります。

    Pythonを起動しないことと、不要になることの違い

    今回の変更を読むうえで紛らわしいのが、「Pythonなしで動く」という表現です。単独で使うC APIは、実行時にPythonインタープリターを起動しません。一方、2.6の内部にはPythonの型への依存が残り、プログラムをリンクするときに必要なシンボルをそろえるため、Pythonをインストールしておく必要があります。[1、3]

    つまり、実行中の処理をC側で進める道は広がりましたが、配備する環境からPythonを完全に取り除ける段階にはまだ達していません。IBMの紹介では依存を減らす今後の方針にも触れていますが、将来の予定を2.6で完了した機能とは扱えません。

    C API自体も実験段階です。組み込む側はQiskitの版を固定し、更新時には自分の変換手順と保存データを読み戻せるかを検証する必要があります。今回の意義は、量子回路の準備を既存の計算システムへ組み込むための部品が増えたことにあります。量子計算そのものの速度や精度が、この更新だけで向上したという発表ではありません。

    Qiskitを開発するIBMの事業や、量子計算への取り組みの位置づけは、CyclewaveのIBMの企業解説で紹介しています。

    参考資料

    1. IBM Quantum — Qiskit 2.6 release summary(2026年10月22日)。
    2. Qiskit — Release 2.6.0(2026年10月16日、commit 65094a0)。
    3. Qiskit 2.6.0 — C APIの構成と利用形態(リリース版ソース)。
    4. Qiskit 2.6.0 — C API PassManager(リリース版ソース)。
    5. Qiskit 2.6.0 — C API QPY(保存・読み込みと制約)。
    6. Qiskit 2.6.0 — QPY形式の版定義。資料確認:2026年10月27日。未固定の最新版文書ではなく、2.6.0の内容を参照しています。
  • 平均光子数だけでは分からない光の揺らぎ QuTiPの二次相関で比較する

    平均光子数だけでは分からない光の揺らぎ QuTiPの二次相関で比較する

    ある光のモードに含まれる光子数の平均が2だったとします。毎回必ず2個なのか、1個や3個などがばらついて出るのか、ときには多く、ときにはほとんど出ないのか。平均だけでは、この違いは見えません。

    光子の数の揺らぎを比較する手掛かりが、二次相関g(2)です。ここではQuTiPの公式資料と5.1.1の固定実装を読み、時間差がゼロのg(2)(0)を中心に、同じ平均を持つ光がどう違うのかを整理します。装置の実測ではなく、単一モードを仮定した量子状態と独立計算の比較です。[1][2]

    簡単にまとめると?

    • g(2)(0)は平均光子数だけでなく、異なる2個の光子からなる組の平均を見ます。同じ平均でも、光子数の揺らぎ方によって値が変わります。
    • 平均2の理想例では、2光子のFock状態が0.5、コヒーレント状態が1、単一モードの熱状態が2です。ただし、この一つの値だけで状態全体は決まりません。
    • ゼロでない平均、対象モード、時刻、規格化の分母をそろえます。時間差をつけた相関では、定常な場合と平均が変化する場合を区別します。

    平均の次に、光子の「組」を数える

    光のモードとは、空間的な形や周波数などで区別する場の一つの自由度です。ここでは一つのモードだけを扱い、同じ量子状態を用意して光子数を測るときの分布を考えます。光子数演算子をn=a†aと書き、aは光子を一つ減らす消滅演算子、a†は増やす生成演算子です。山括弧〈 〉は、その状態での平均を表します。

    時間差ゼロの二次相関は、平均光子数〈n〉がゼロでないとき、次の形になります。[1][2]

    g(2)(0)=〈a†a†aa〉 / 〈a†a〉2=〈n(n−1)〉 / 〈n〉2

    分子が〈n2〉ではない点が大切です。n個の中から最初の光子を一つ選ぶ方法はn通り、同じ光子を除いて次を選ぶ方法はn−1通りなので、順序を区別した組はn(n−1)通りです。これは2個の組に関わる量であり、光子を自分自身と組にする分は数えていません。量子演算子でも、aaが|n⟩へ作用する係数の二乗がn(n−1)になります。

    たとえば毎回2個なら、組の数は常に2です。一方、平均が2になるように光子数がばらつくと、多く出る回の組の数は二乗に近い速さで増えます。平均光子数をそろえても、分子にはその違いが残ります。g(2)(0)は光子数そのものではなく、この平均で規格化した無次元の指標です。

    平均2の三つの状態を比べる

    違いを具体的にするため、理想的な三つの状態を比べます。Fock状態|2⟩は、光子数が必ず2となる状態です。コヒーレント状態では光子数がポアソン分布に従い、平均2の場合の分散も2になります。単一モードの熱状態では幾何分布となり、同じ平均2でも分散は6です。分散は、平均からのずれを二乗して平均した、ばらつきの大きさです。[3]

    光子数がnとなる確率をP(n)とすると、今回のコヒーレント状態はP(n)=e−22n/n!、熱状態はP(n)=(1/3)(2/3)nです。これらの分布から平均と組の数を計算すると、次のようになります。

    単一モード・平均光子数2の独自計算。無限の光子数空間における理論値で、実験値ではありません。
    状態 〈n〉 分散 〈n(n−1)〉 g(2)(0)
    Fock状態 |2⟩ 2 0 2 0.5
    コヒーレント状態
    |α|2=2
    2 2 4 1
    単一モードの熱状態 2 6 8 2

    表は確率分布の式から導き、光子数基底の消滅演算子を別に組み立てた行列計算でも照合しました。残す基底を10、20、40、80状態へ増やして確認し、80状態でのg(2)(0)の理論値との差は、三例とも1.3×10−11以下でした。QuTiP本体や光源を動かした結果ではありません。

    熱状態は光子数の大きい側にも確率が残るため、平均だけでなく二次の量も収束しているかを見ます。今回の数値照合では、解析式の係数を有限範囲へ切り出して正規化しました。QuTiPのcoherentには有限空間の変位演算子を使う方法もあるため、同じNという表示だけで構成法まで同一とはしません。[3]

    g(2)(0)が1より小さい、または大きいと何が分かるか

    分散Var(n)=〈n2〉−〈n〉2を使うと、同じ式を次のように書き直せます。

    g(2)(0)=1+[Var(n)−〈n〉] / 〈n〉2

    したがって、この単一モードの条件でg(2)(0)が1より小さければ、分散はポアソン分布の基準である平均光子数より小さくなります。1より大きければ、その基準より大きい揺らぎです。光子がまとまって現れる傾向を論じる際の手掛かりになりますが、時間をずらしたときの相関の形は、これだけでは分かりません。

    1未満というだけで「必ず1個ずつ出る」とは言えません。表のFock状態|2⟩はg(2)(0)=0.5ですが、測れば必ず2個です。一般に、光子数mが正の整数で固定されたFock状態ではg(2)(0)=1−1/mとなります。単一光子の理想状態|1⟩なら0ですが、0.5を見てそれと同じだと扱うことはできません。

    逆に、g(2)(0)=1だから状態が純粋なコヒーレント状態だとも断定できません。光子数分布が同じポアソン分布でも、異なる光子数成分の位相の関係を平均して失わせた混合状態を作れます。光子数の平均と二次相関は同じでも、密度行列の非対角成分は違います。今回の独立計算でも、平均と二次相関が同じでも密度行列は異なることを確認しました。g(2)(0)は有用な比較軸ですが、状態全体を復元する情報ではありません。

    時間差をつけるなら、分母も時刻に合わせる

    ゼロ遅延の比較は、ある時点の状態の光子数分布から行えます。ここまでの表に、時間に依存しない定常状態という仮定は必要ありません。一方、時間差τをつけてg(2)(τ)を求めるときは、その間に状態がどう変わるかというモデルが必要です。

    QuTiP 5.1.1の固定実装coherence_function_g2は、初期時刻を0として、非規格化のG(2)(τ)と、規格化したg(2)(τ)の両方を返します。初期状態を指定する経路では、平均光子数を時間に沿って求め、分母にn̄(0)n̄(τ)を使います。ここでn̄は平均光子数です。[2]

    g(2)(τ)=〈a†(0)a†(τ)a(τ)a(0)〉 / [n̄(0)n̄(τ)]

    定常な状態で平均が一定なら、この分母はn̄2になります。減衰中などで平均が変わる場合に、初期平均の二乗で割り続けると、別の量を比較することになります。公式ガイドの説明式と、初期状態を時間発展させる例の分母を読むときも、この条件を分ける必要があります。[1][2]

    同関数でstate0=Noneを指定すると定常状態を求めて使いますが、文書に記載された条件は、時間に依存しないハミルトニアンと崩壊演算子があることです。遅延相関の計算には量子回帰定理を用いるため、時間発展のモデルとその適用条件を引き継ぎます。任意の記憶効果を持つ環境で、同じ手続きを使えばよいという意味ではありません。

    公式例の三つの曲線は、指定した熱浴との相互作用の下での時間変化です。g(2)(0)が0.5、1、2であることから、どの光源でも同じ時間尺度で同じ曲線へ進むとは言えません。本稿の表はゼロ遅延の数値であり、遅延曲線を独立に再計算したものではありません。

    比較の前に、平均・モード・計算条件をそろえる

    まず、比較する対象が同じモードなのか、複数の周波数や空間モードをまとめたものなのかを確認します。表の熱状態の値2は単一モードの理想例であり、複数モードをまとめた測定へそのまま当てはめる数ではありません。

    次に、平均光子数がゼロでないかを確認します。真空では分子も分母もゼロで、規格化したg(2)(0)は定義できません。平均が非常に小さい計算でも、比だけを見る前に、分子G(2)と平均の値、数値精度を確認したいところです。QuTiPが両方の相関値を返すことは、この切り分けに役立ちます。

    実験と比較するなら、検出する時間幅や周波数帯、背景光、検出器の応答などを含む測定条件と、モデルが表す量を対応させます。理想状態の分散が大きいことと、有限回の測定からg(2)を推定した値の誤差が大きいことも別です。後者には標本数と推定手順の情報が必要です。

    平均光子数に加えて「組の平均」を選ぶと、見えていなかった揺らぎが比較できるようになります。そのうえで、数が固定されているのか、位相の関係まで知りたいのか、時間をまたぐ変化を知りたいのかを分ける。g(2)が答える問いと、追加の観測量が必要な問いを切り分けることが、計算や測定の使い道につながります。

    参考資料

    1. QuTiP 5.1 Documentation, Two-time correlation functions。二時刻相関、定常性、二次相関の定義と熱浴下の計算例。
    2. QuTiP 5.1.1, correlation.pyの固定実装。coherence_function_g2の入力条件、平均の計算、G2とg2の規格化。最新版を示すものではありません。
    3. QuTiP 5.1.1, states.pyの固定実装。coherent・fock_dm・thermal_dmの定義と有限空間での構成法。本文の数表と同じ光子数分布を持つ状態の比較は、Quantum Seaによる独立の解析・行列計算です。
  • QuTiPの定常状態は一つとは限らない 初期状態と収束の確かめ方

    QuTiPの定常状態は一つとは限らない 初期状態と収束の確かめ方

    量子系の計算で「十分に時間がたった後」を知りたいとき、QuTiPのsteadystateは便利な入口です。時間発展を長く追わずに、変化しない密度行列を求められます。ただし、返ってきた一つの行列だけでは、どの初期状態からもそこへ落ち着くことや、手元の計算時間で十分に近づいたことまでは分かりません。

    見分けたいのは、定常解があること、定常解が一つであること、その解へ十分に近づいたことです。QuTiP 5.1の公式資料と、版を固定した5.1.1の実装を手掛かりに、二準位の小さな例で確認の順序を整理します。[1][2]

    簡単にまとめると?

    • 定常状態は、その状態から出発すると変化しない状態です。初期状態の情報が残り、複数の定常解が存在する場合もあります。
    • 位相だけを失う二準位では占有確率が残ります。上下の遷移を入れた今回の例では占有確率が一つに定まりますが、近づく速さは成分によって違います。
    • 密度行列の正規化と正値性、定常方程式の残差、零空間、異なる初期状態からの時間発展を、役割を分けて確かめます。

    「動かない状態を求める」と「そこへ到達する」は別の計算

    密度行列ρは、各状態にいる確率と、状態間の位相の関係をまとめたものです。時間に依存しないLindblad方程式を、dρ/dt=L(ρ)と書きます。Lはリウヴィリアンと呼ばれ、ハミルトニアンによる変化と、環境に由来する変化をまとめた作用です。定常状態ρssでは、その変化がゼロになります。[1][3]

    L(ρss)=0、tr(ρss)=1

    前の式は「今から変わらない」、後の式は「確率の合計が1」という条件です。物理的な密度行列であるためには、エルミート性に加え、固有値が負にならない正値性も必要です。

    QuTiPの通常のdirect法は、定常方程式へトレースを1にする条件を加えて線形方程式を解きます。この計算には、時間発展の出発点となる初期状態を指定しません。一方、時間発展を計算するmesolveなどでは初期状態が入力です。前者は「変化しない解」を探し、後者は「この出発点からどこへ進むか」を追っています。[1][2]

    位相だけを失うと、最初の占有確率が残る

    基底状態を|0⟩、励起状態を|1⟩とする二準位を考えます。占有確率とは、その状態にいる確率のことです。ここでは励起状態の占有確率p1=ρ11を使います。ハミルトニアンをH=0とし、位相の関係だけを弱める純粋位相緩和を入れます。

    Cφ=√(γφ/2) Z、Z=|0⟩⟨0|−|1⟩⟨1|、γφ>0

    Cは環境の作用を表す崩壊演算子です。この設定をLindblad項へ代入すると、対角成分である占有確率は変わらず、非対角成分はρ01(t)=ρ01(0)e−γφtで減少します。つまり、位相の関係は薄れても、|0⟩と|1⟩の間で占有確率を移す仕組みがありません。[3]

    そのため、0≦p≦1を満たすどのρ=diag(1−p, p)も定常解です。|0⟩から始めればp=0、|1⟩から始めればp=1のままです。両者とも残差L(ρ)はゼロですが、同じ状態にはなりません。|+⟩=(|0⟩+|1⟩)/√2から始めた場合は、占有確率1/2を保ったまま位相の成分が消え、diag(1/2, 1/2)へ近づきます。

    この例では、トレース1の条件を加えても占有確率を一つに決められません。定常方程式の解空間に自由度が残るためです。ソルバーが特異性を知らせたり、手法によって解の一つが得られたりしても、それを特定の初期状態からの長時間後の答えと同一視しないことが大切です。

    上下の遷移がある例では、収束先と速さを分けて見る

    次に、H=0のまま、|1⟩から|0⟩へ下がる過程と、逆向きに上がる過程を入れます。ここからは純粋位相緩和だけのモデルを置き換えた、別の設定です。

    C↓=√γ↓ |0⟩⟨1|、C↑=√γ↑ |1⟩⟨0|、γ↓, γ↑>0

    占有確率の変化は、入ってくる分と出ていく分の差になります。

    dp1/dt=γ↑(1−p1)−γ↓p1

    変化がゼロになる占有確率は、p1,ss=γ↑/(γ↑+γ↓)です。このモデルでは非対角成分も減衰するので、密度行列全体の定常解が一つに定まります。状態間を遷移する経路ができたことで、最初の占有確率を保持する自由度がなくなりました。

    具体例としてγ↓=3 s−1、γ↑=1 s−1を仮定すると、定常占有確率は1/4です。τ=(γ↓+γ↑)t=(4 s−1)tを無次元の経過時間とすると、

    p1(t)=1/4+[p1(0)−1/4]e−τ、ρ01(t)=ρ01(0)e−τ/2

    となります。下の表はこの仮定モデルから計算した値です。演算子の式から別に組み立てた4×4のリウヴィリアンと行列指数でも照合しました。実験値やQuTiP本体の実行結果ではありません。

    上下遷移モデルの計算例。占有確率の2列は異なる初期状態、位相の列は初期|+⟩に対応します。
    無次元時間τ
    実時間t
    初期|0⟩のp1 初期|1⟩のp1 初期|+⟩の
    |ρ01|
    0
    0 s
    0 1 0.5
    1
    0.25 s
    0.1580 0.5259 0.3033
    5
    1.25 s
    0.2483 0.2551 0.0410
    十分長い時間の極限 0.25 0.25 0

    τ=5では、二つの初期状態の占有確率はすでに1/4へかなり近づいています。それでも、初期|+⟩に残る位相の成分は約0.0410です。この成分は占有確率のずれより遅い指数で減衰します。励起確率だけを見て止めてよいか、密度行列全体の誤差を小さくしたいのかで、必要な計算時間は変わります。

    計算結果は、四つの問いで点検する

    最初は、物理的な状態になっているか。トレース、エルミート性、固有値を確認します。丸め誤差に由来する微小な負値と、大きな負値を同じ扱いにせず、許容誤差を記録します。正規化し直しただけで、不適切な解や一意性の問題が解消するわけではありません。

    次は、その状態が定常方程式を満たしているか。L(ρ)のノルムで残差を見ます。残差はモデル内の変化率なので、時間の単位やLのスケールをそろえて比較します。すべての速度を小さくしただけでも生の残差は小さくなります。小さな残差は有用な確認ですが、先ほどの純粋位相緩和の例のように、一意性は別に調べる必要があります。

    三つ目は、解を一つに決めるだけの条件があるか。小さなモデルなら、Lの零空間、つまりLがゼロへ写す行列の集合を調べられます。今回の独立計算では、その次元は純粋位相緩和で2、上下遷移で1でした。トレース1という条件を加えた後に自由度が残るかが違います。数値上ゼロとみなすしきい値を変えても結果が安定しているかを確認し、大規模・悪条件の行列へ小例の精度をそのまま持ち込みません。

    最後は、必要な精度まで近づいたか。異なる占有確率から出発させ、位相も重要なら重ね合わせ状態も加えて、時間を延ばした結果を比較します。この例ではLの零でない固有値は−4 s−1と−2 s−1で、位相の成分のほうが遅く減衰します。一般のモデルでも遅い成分の時間尺度は手掛かりになりますが、いくつかの初期状態で一致したというだけで、すべての初期状態についての証明にはしません。

    QuTiPの停止条件を、物理的な一意性と混同しない

    固定した5.1.1の実装には、method='propagator'もあります。初期密度行列rhoへ時間発展を繰り返し作用させ、反復前後の状態の距離がpropagator_tol以下になると返す方法です。rhoを省略した場合はランダムな密度行列から始め、収束しない場合は反復上限で例外を返します。[2]

    ここで判定しているのは、選んだ出発点からの反復がどれだけ変化したかです。純粋位相緩和のように定常解が複数ある系では、到達する占有確率は初期状態に依存します。また、モデルの変化がとても遅ければ、短い間隔での変化が小さいことと、最終状態に近いことは別になります。初期状態、時間間隔、許容誤差を変えて確かめる理由はここにあります。

    一意な定常状態が欲しいのか、保存される初期情報を調べたいのかで、計算結果の読み方は変わります。まず環境との相互作用が何を変え、何を残すモデルなのかを確認し、その上でソルバーの出力と時間発展を照合すると、定常状態の計算を目的に結び付けやすくなります。

    参考資料

    1. QuTiP 5.1 Documentation, Solving for Steady-State Solutions。定常方程式、計算法、時間発展との比較例。
    2. QuTiP, steadystate API、5.1.1の固定実装。トレース条件、各手法、propagatorの初期状態と停止条件。参照版を固定しており、現在の最新版という意味ではありません。
    3. QuTiP, 5.1.1のliouvillian / lindblad_dissipator実装。本文の二準位モデル、解の導出と表の数値は、このLindblad形式を用いた独自の説明・計算例です。
  • Floquet法で周期駆動を読む、一周期後と途中の状態の違い

    Floquet法で周期駆動を読む、一周期後と途中の状態の違い

    同じ周期で駆動する二つの量子系を、一周期ごとの同じタイミングで比べると、結果が一致する。では、その途中も同じように動いているのでしょうか。周期に同期した記録は便利ですが、周期内だけに現れる違いを見落とすことがあります。

    Floquet(フロケ)法は、繰り返す駆動の下での量子状態を、「一周期ごとに積み重なる変化」と「周期内で繰り返す変化」に分けて扱います。QuTiP 5.1.1の公開実装と小さな可解モデルから、準エネルギーの値だけでは何が分からず、どの時刻の状態を比較すればよいのかを見ていきます。[1][2]

    簡単にまとめると?

    • 準エネルギーは、一周期の時間発展に含まれる位相の進みを表します。その瞬間のハミルトニアンのエネルギーとは別です。
    • 一周期後の時間発展が同じ二つのモデルでも、周期内の観測値は違い得ます。周期ごとの記録だけで、途中の状態まで一致したとは言えません。
    • 駆動の周期、時間の原点、初期状態、観測量と観測時刻を揃えます。QuTiPでは周期的なモードと、位相を含む実際の状態を区別して読みます。

    準エネルギーは、一周期で進む位相から求める

    外からの駆動が周期Tで繰り返すなら、量子状態の変化を定めるハミルトニアンもH(t+T)=H(t)となります。本稿では、環境への散逸を含めない閉じた系を扱います。Floquet法では、その状態の基本的な解を、一定の速さで進む位相と、周期Tで繰り返す部分に分けられます。後者をFloquetモード、位相の進みを定める量を準エネルギーと呼びます。[1]

    一周期の時間発展をまとめた演算子をU(T,0)と書きます。これは、時刻0の状態を時刻Tの状態へ移す働きです。その固有値は、閉じた系では大きさ1の複素数になり、角度が一周期の位相の進みを表します。QuTiPのFloquetBasisも、一周期の伝播を計算して対角化し、固有値の角度からe_quasiを求めます。ここでいう伝播は、位置の移動に限らず、量子状態の時間発展です。[2]

    一周して2πだけ余分に回った位相は、一周期後の複素数としては区別できません。そのため、準エネルギーにはℏΩの整数倍を加えても同じ表現になる自由度があります。Ωは駆動の角周波数でΩ=2π/T、ℏはエネルギーと位相の進みを結ぶ定数です。準エネルギーをずらしたときは、周期モード側の位相も合わせて変えます。物理的な状態そのものが変わるわけではありません。[1][2]

    したがって、準エネルギーを、その瞬間にH(t)を対角化して得るエネルギーと同じものとして読むことはできません。駆動条件を変えたグラフで値が折り返して見える場合も、選んだ表示範囲を確認する必要があります。固定版の実装は複素数の角度の主値を使い、一つの範囲へ折り返した値を返します。

    一周期後が同じになる、二つの駆動を比べる

    違いを具体的に見るため、状態0と1を持つ二準位系を用意します。最初は両者を同じ重みで重ねた|+⟩=(|0⟩+|1⟩)/√2とします。観測するのは、同じ|+⟩として得られる確率です。0・1それぞれの確率だけではなく、二つの成分の位相の関係に応じて変わる量を選びます。

    説明用のハミルトニアンはH(t)/ℏ=[ω₀+A cos(Ωt)]Z/2です。Zは0の成分に+1、1の成分に−1を掛ける演算子、ω₀は一定の成分、Aは周期的に加える成分の振幅です。ω₀、A、Ωは同じ角周波数の単位で揃え、Ωは正とします。ここではω₀=Ω/4とし、周期成分を加えないA=0と、加えるA=Ωを比較します。実機のパルスや測定値を指定したものではありません。

    このモデルでは、二成分の間に積み重なる位相差はΔ(t)=ω₀t+(A/Ω)sin(Ωt)です。従って、調べたい確率はP₊(t)=[1+cosΔ(t)]/2となります。一周期の整数倍ではsinの項が0になるので、両モデルの時間発展は一致します。一方、その間ではsinの項が残り、確率が変わります。

    同じ初期状態から出発したときのP₊。Quantum Seaによる独立計算、数値は小数第4位まで。
    観測する時刻 周期成分なし A=0 周期成分あり A=Ω
    0 1.0000 1.0000
    T/4 0.9619 0.5886
    T/2 0.8536 0.8536
    3T/4 0.6913 0.9921
    T 0.5000 0.5000
    2T 0.0000 0.0000

    狭い画面では表を横にスクロールできます。閉じた形の式とは別に、Schrödinger方程式を数値積分して照合しました。QuTiP本体や量子装置を実行した結果ではなく、指定した二準位モデルの独立検算です。

    この二つのモデルでは、一周期の演算子自体が同じで、準エネルギーの代表値も±ℏΩ/8で一致します。それでも、T/4の確率は約0.96と約0.59、3T/4では約0.69と約0.99に分かれます。なお、一般には準エネルギーの値だけが一致しても、対応する固有状態が違えば、一周期の演算子まで同じとは限りません。ここでは演算子の一致も別に確かめています。

    また、駆動が周期Tで繰り返すからといって、状態も毎回同じ状態へ戻るわけではありません。表でも確率は0、T、2Tで1、0.5、0と変わっています。周期モードが繰り返すことと、その上に積み重なる位相を含む状態が繰り返すことは別です。

    周期モードから、観測する状態へ戻す

    QuTiP 5.1.1では、FloquetBasis.mode(t)は時刻を周期Tで折り返して、周期的なモードを返します。一方、state(t)はそこへ準エネルギーに対応する位相の進みを掛けます。関数名が似ていても、返すものの役割は異なります。[2][3]

    任意の初期状態を扱うときは、初期状態をFloquetの基底へ分解し、必要な時刻の状態を元の基底へ戻してから観測量を計算します。同版にはto_floquet_basisとfrom_floquet_basisがあり、fsesolveもこの流れを使っています。係数や準エネルギーだけを取り出して、周期内で変わるモードを落とすと、先ほどのT/4のような違いを再現できません。[2]

    渡すTは、見たい計算時間の長さではなく、ハミルトニアンが繰り返す周期です。確認したfsesolveはTを省略した場合、最後の出力時刻を周期として使うため、長い時間区間を計算するなら実際の周期を明示することが大切です。出力時刻も、一周期ごとだけが必要なのか、周期内の特定のタイミングが必要なのかを、読みたい現象に合わせて選びます。[2]

    「平均すればよい」と広げないための条件

    今回の例は、異なる時刻のハミルトニアンがすべて同じZに比例する、特別に解きやすいモデルです。時間発展の順序を入れ替えても結果が変わらないので、周期成分の一周期の積分が0になることを、そのまま使えました。異なる方向の作用を組み合わせ、順序で結果が変わる一般の駆動では、ハミルトニアンを単純に時間平均して同じ結果になるとは限りません。

    比較するときは、周期と駆動の開始位相、初期状態、観測量、観測時刻を揃えます。毎周期の状態を知りたいなら一周期の演算子が出発点になりますが、途中で操作や測定を行うなら、その時刻のモードと状態も必要です。準エネルギーの図だけで結論を出さず、実際に使うタイミングで何が観測されるかまで戻して比べます。

    さらに、本稿は閉じた系の話です。環境による緩和まで含めるには、駆動下での環境との結合や近似を別に確認する必要があります。QuTiPにはFloquet-Markovの機能もありますが、この二準位の比較だけで、その近似や実機の損失まで検証したことにはなりません。[1][2]

    参考資料

    QuTiP 5.1.1の固定コミット7accc77a70a08f965a29fdd13515f79cdcab9703と5.1系公式文書を2026年10月14日に確認しました。最新版一般の評価ではありません。本文の式と表はQuantum Seaによる独立計算で、速度向上や実機性能の実証ではありません。QuTiPへハミルトニアンを渡す際のℏ=1の表記では、準エネルギーに対応する値は角周波数の単位になります。

    1. QuTiP 5.1 Documentation, Floquet Formalism。周期モード、準エネルギー、一周期の伝播演算子と、閉じた系・散逸系の区別。
    2. QuTiP 5.1.1, floquet.py。FloquetBasisの初期化、mode/state、基底変換、fsesolveの周期指定を参照。コードの利用条件はBSD 3-Clause。
    3. QuTiP 5.1 API, FloquetBasis。一周期の伝播、準エネルギー、時刻を指定する基底変換の入出力。
  • 量子軌道法の計算はいつ止めるか、QuTiPの軌道数と誤差目標

    量子軌道法の計算はいつ止めるか、QuTiPの軌道数と誤差目標

    量子ビットが周囲へエネルギーを失う様子を計算すると、平均は滑らかに減っていきます。一方、環境で光子を検出する記録に応じて状態を追えば、変化が突然起きる経路も現れます。同じモデルを扱っていても、一本の経路と、多数の経路を集めた平均は別の結果です。

    QuTiPのmcsolveは、このような「量子軌道」を計算するソルバーです。軌道数を増やせば何が改善し、計算が終了したときには何を確認すればよいのでしょうか。QuTiP 5.1.1の固定実装を読み、小さな独立計算で判断の手掛かりを整理します。最新版や実機の性能評価ではありません。[1][2]

    簡単にまとめると?

    • 量子軌道は、環境の観測記録を条件にした状態の時間経路です。最後の状態から測定結果を何回取り出すか、というショット数とは分けて考えます。
    • 軌道ごとのばらつきと、平均を推定する誤差は別です。まれな変化が標本に出ないだけで、変化が起きないとは判断できません。
    • 軌道数、時間制限、誤差目標のどれで止まったかを確認します。統計的な誤差目標は、物理モデルや数値積分の正しさまで保証しません。

    滑らかな平均を、条件付きの経路から作る

    環境とやり取りする量子系では、密度行列を使って多数の実現の平均的な変化を求める方法があります。量子軌道法は、同じ開放系モデルに対して、環境の観測記録に対応する経路を生成し、その結果を平均する方法です。ここでは、光子を数える観測のように、検出のたびに状態が変わる量子ジャンプの表現を扱います。物体が空間を走る軌跡ではなく、量子状態の時間経路です。[1]

    計算では、ジャンプがまだ起きていない状態を進め、その生存確率と乱数を比べて、ジャンプの時刻を選びます。ジャンプ時には、c_opsで指定した作用を状態へ適用し、正規化して先へ進みます。環境をどのように観測するかという表現に依存するため、一本の軌道を、測定方法によらない実物の唯一の履歴とみなすことはできません。[1][2]

    この方法では、一本ずつの状態ベクトルを扱うことで、大きな密度行列を直接進める負担を減らせる場合があります。ただし、必要な平均精度を得るために多数の経路が要ることもあります。状態空間の大きさだけでなく、観測したい量、必要な精度、保存する経路数を揃えて選ぶ必要があり、「軌道法なら必ず速い」という関係ではありません。

    一本は途中で変わり、平均は少しずつ変わる

    二つの状態0と1を持つ、説明用のモデルを考えます。最初は励起状態1にあり、速度γで基底状態0へ緩和します。再励起する駆動はなく、ハミルトニアンは0、環境の作用はC=√γ|0⟩⟨1|です。γは時間の逆数の単位で、時間を秒で表すなら毎秒です。以下では無次元の時間τ=γtを使います。

    このモデルでは、一回のジャンプの後は0に留まります。それぞれの正規化された軌道では、ジャンプまでは1の確率が1、ジャンプ後は0です。多くの軌道を平均すると、時刻τにまだ1にいる割合はexp(−τ)となります。個々の経路の突然の変化と、平均の滑らかな減少は矛盾しません。

    ここでは一様乱数UからγJ=−log(U)でジャンプ時刻Jを生成する独立コードを用意しました。乱数シードを20261014に固定し、同じ10,000本の先頭100本、1,000本、全体を集計した結果です。QuTiP本体の実行結果ではなく、同じ単純モデルの待ち時間を直接生成した数学的検算です。

    τ=1で1に留まる割合。理論値は約0.367879。Quantum Seaによる独立計算。
    軌道数M 標本の平均 理論値との差の絶対値 平均の理論標準誤差
    100 0.3500 約0.01788 約0.04822
    1,000 0.3440 約0.02388 約0.01525
    10,000 0.3676 約0.000279 約0.004822

    狭い画面では表を横にスクロールできます。平均の理論標準誤差は、独立なM本をあらかじめ決めて集める場合の√(p(1−p)/M)で、ここではp=exp(−1)です。回数を増やすほど推定のばらつきは小さくなりますが、個別の標本の誤差が毎回小さくなる保証はありません。この実行でも、100本から1,000本へ増やした段階では理論値との差が一度広がっています。

    「ばらつきゼロ」が、十分な計算を意味しない場合

    同じモデルでも、短い時間τ=0.01では、一軌道にジャンプが起きる確率は約0.995%です。このとき、独立な100本がすべてジャンプしない確率は(exp(−0.01))100=exp(−1)、約36.8%もあります。0回という結果は、十分に起こり得る標本です。

    その標本だけを見れば、励起状態の値は全軌道で1となり、経験的な分散は0です。しかし、モデル上のジャンプ確率まで0になったわけではありません。まれな過程を調べるなら、無変化の標本が得られる確率や、軌道数を増やした比較も確かめます。結果が静かだから十分、と判断しないための具体例です。

    QuTiPのstd_expectにも注意が必要です。確認した実装は、各軌道の期待値の二乗平均と平均の二乗からばらつきを計算します。これは軌道間の標準偏差であり、そのまま平均の推定誤差を表す欄ではありません。上の単純な独立・等重みの例では、軌道間の理論標準偏差は√(p(1−p))、平均の標準誤差はさらに√Mで割った値です。重み付きの計算や、結果を見て途中で止める計算へ、この式を無条件に当てはめないようにします。[3]

    終了した理由を、要求した精度と照合する

    固定版のmcsolveでは、ntrajは軌道数の上限です。timeoutによる時間制限やtarget_tolによる誤差目標も指定すると、いずれかに先に達したところで止まります。したがって、ntraj=1000と書いたことだけでは、1,000本が計算されたとも、誤差目標を満たしたとも言えません。結果のnum_trajectoriesとstats["end_condition"]を読み、実際の本数と終了理由を確かめます。[2][3]

    target_tolは、指定した観測量e_opsと出力時刻に対する平均の統計的誤差を見ます。確認した版ではジャックナイフ法に基づく推定を使い、絶対誤差、または絶対・相対誤差の組を指定できます。これは数値積分の誤差許容値atol・rtolとは別です。観測していない量、出力点の間の挙動、モデルの近似、状態空間の打ち切りまで保証するものではありません。[2][3]

    まれなジャンプが重要な場合には、同版のimproved_samplingも検討対象です。無ジャンプの経路を先に計算してその確率を保持し、残りはジャンプを含む条件付きの経路を生成して、対応する重みで平均します。ジャンプを多く見せるために物理的な発生率を増やす設定ではありません。本稿の表は、この重み付き方式を使った性能比較ではありません。[2]

    版による制約もあります。5.1.1は混合初期状態を受け取れますが、その場合はtarget_tolをサポートせず、APIの注意書きは軌道数以外の理由で終了した結果を無効と扱うよう求めています。純粋な初期状態で確認した設定を、そのまま混合状態へ広げる前に、採用版の制約を読み直します。[2]

    残すべきなのは、平均曲線だけではない

    比較のためには、ハミルトニアン、環境の作用、初期状態、観測量、出力時刻、採用版を揃え、乱数シード、実際の軌道数、終了理由も残します。ジャンプ時刻や各軌道を保存すれば、平均がどのような経路からできたかを追えます。ただし、全経路を保存する量は本数とともに増えるので、必要な観測結果に合わせて保存範囲を選びます。

    量子軌道の本数は、状態を計算し終えてから最終測定を何回行うかというショット数や、計算空間に何状態を残すかというFock打ち切りとは異なります。まず同じ物理モデルの経路を十分に標本化できているかを点検し、そのうえで数値計算や物理的な仮定を確かめる。これらを分けると、曲線のばらつきに対して何を増やし、何を見直すべきかが判断しやすくなります。

    参考資料

    QuTiPは5.1.1の固定コミット7accc77a70a08f965a29fdd13515f79cdcab9703と5.1系の公式文書を参照。資料は2026年10月14日に確認しました。表、待ち時間の生成、まれな事象の確率はQuantum Seaによる独立検算であり、実機測定やQuTiP実行時間の比較ではありません。

    1. QuTiP 5.1 Documentation, Monte Carlo Solver。量子ジャンプの生成、個別経路と平均、結果の保存を参照。
    2. QuTiP 5.1.1, mcsolve.py。入力、停止条件、混合初期状態の制約、improved samplingの固定実装。対応API解説。
    3. QuTiP 5.1.1, multitrajresult.py。平均・軌道間標準偏差、目標誤差と終了理由の記録を参照。コードの利用条件はBSD 3-Clause。
  • Fock打ち切り、量子シミュレーションで残す状態数をどう決めるか

    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状態、生成・消滅演算子と数演算子の説明。
  • Lindblad方程式で量子ビットの緩和を読む、確率と位相の違い

    Lindblad方程式で量子ビットの緩和を読む、確率と位相の違い

    量子ビットを0と1で測ると、どちらも半分ずつ出る。しばらく待っても、その割合は変わらない。それだけで、量子状態が保たれていると言えるでしょうか。0と1の重ね合わせでは、結果の割合に加えて、二つの成分の位相の関係も大切です。

    Open Quantum Design(OQD)の公開エミュレーターを調べると、確認した版はQuTiPのsesolveで状態を時間発展させています。そこには、環境による緩和を指定する入力はありません。本稿ではその境界を出発点に、QuTiPが別に備えるLindblad(リンドブラッド)方程式の機能から、モデルに何を加えると何が変わるのかを見ます。OQD自体がこの機能を実装しているという説明ではありません。[1]

    簡単にまとめると?

    • エネルギー緩和と位相の乱れは別の変化です。0・1の割合だけを見ても、重ね合わせの変化を捉えきれません。
    • Lindblad方程式では、ハミルトニアンに加えて、環境から受ける作用とその速さを指定します。
    • 計算できたことと実機を再現できたことは別です。作用の種類、速度の単位、近似の適用条件を確認します。

    閉じた系の計算には、指定していない緩和は現れない

    ハミルトニアンは、量子状態が時間とともにどう変わるかを定めるものです。外部環境とのやり取りを含めずに扱う「閉じた系」では、状態の変化をユニタリーな時間発展として計算します。位相が回転したり、駆動によって0と1の割合が変わったりしても、それ自体が環境による緩和ではありません。[2]

    一方、対象の量子ビットが周囲へエネルギーを失ったり、周囲の影響で位相の関係が乱れたりするなら、その作用をモデルに加える必要があります。Lindblad方程式は、そのような「開いた系」を扱う代表的な形です。状態を密度行列で表し、ハミルトニアンによる変化と、環境による変化を合わせます。[2]

    密度行列は、結果の割合と重ね合わせの関係をまとめた表と考えると読みやすくなります。対角の成分は0・1それぞれの確率、対角でない成分は両者のコヒーレンスを表します。以下では、その非対角成分の大きさを比べます。位相が回転することと、その大きさが減ることは分けて扱います。

    同じ重ね合わせを、三つのモデルで待たせる

    説明用に、0と1を同じ重みで重ねた状態を用意します。最初は1の確率が0.5、コヒーレンスの大きさも0.5です。0を基底状態、1を励起状態とし、0・1を入れ替える外部の駆動は加えません。0と1のエネルギー差は一定とし、その差による位相回転の速さには依らない、非対角成分の大きさを比較します。

    比べるのは、環境の作用なし、1から0へ戻るエネルギー緩和のみ、そして0・1の確率を変えない純粋位相緩和のみ、の三通りです。ここでTは説明用の時間尺度であり、実機の寿命ではありません。後二つのモデルでは、それぞれの速度を1/Tと置きます。Lindbladの散逸項から得た式を、独立に作成した2行2列の行列計算とも照合しました。[4]

    表1 同じ初期状態を時間Tだけ変化させた説明用の計算。Quantum Sea作成。
    モデル 1になる確率 コヒーレンスの大きさ
    環境の作用なし 0.500 0.500
    1から0へのエネルギー緩和のみ 約0.184 約0.303
    純粋位相緩和のみ 0.500 約0.184

    狭い画面では表を横にスクロールできます。QuTiPや量子装置を実行した性能評価ではなく、指定した方程式の独立検算です。

    エネルギー緩和の行では、1の確率は0.5×exp(−t/T)、コヒーレンスの大きさは0.5×exp(−t/2T)で減ります。純粋位相緩和の行では、1の確率は0.5のまま、コヒーレンスだけが0.5×exp(−t/T)で減ります。

    この違いが、何を調べるべきかを変えます。0・1の割合が同じでも、純粋位相緩和がないとは言えません。逆に、1の割合が減るデータを、確率を変えない純粋位相緩和だけで説明することもできません。0・1とは異なる重ね合わせの基底(X、Y)でも測定すると、非対角成分の実部・虚部を調べられます。実機と照合するときは、割合とコヒーレンスに関わる情報を区別し、どの作用を仮定したモデルなのかを揃えます。

    c_opsには、速さだけでなく「何を変えるか」を渡す

    QuTiPのmesolveでは、環境の作用をc_opsという引数へ渡します。各要素はcollapse operatorと呼ばれ、作用を表す演算子に、速度の平方根を掛けたものです。この名前は、途中測定の結果を乱数で一つ選ぶ処理そのものを意味しません。ここでは密度行列の平均的な変化を計算します。[2][3]

    先ほどのエネルギー緩和は、1を0へ移す演算子に√γを掛けます。γは緩和の速度です。純粋位相緩和では、0と1の成分へそれぞれ+1と−1を掛ける演算子Zを使います。これに√(γφ/2)を掛けると、非対角成分の大きさが速度γφで減ります。平方根や2分の1は単なる書き方の違いではなく、計算される減衰速度を変える係数です。[4]

    時間を秒で表すならγとγφは毎秒の単位、たとえばs−1で揃えます。ハミルトニアンも、ℏを1とする表記なら角周波数の単位で揃えます。表のTを特定装置の測定値へ置き換えるには、その装置と条件に対応した速度を別に確かめる必要があります。

    エネルギー緩和だけでも、確率とコヒーレンスの減る速さは異なります。この例で、励起確率の減衰時間をT1と呼べばT1=1/γ、コヒーレンスの減衰時間T2は2/γです。純粋位相緩和も同時に加えると、1/T2=γ/2+γφになります。T1とT2を同じ値だと置く前に、何が減る時間を測ったのかを確認したいところです。これは今の二準位モデルから得た関係で、すべての装置への無条件な当てはめではありません。

    ソルバーの名前より、入力と近似を確かめる

    確認対象はQuTiP 5.1の公式文書と、対応する5.1.1の固定コードです。最新版を評価した記事ではありません。固定実装では、c_opsが空、初期状態が状態ベクトル、ハミルトニアンがsuperoperatorではない、という条件がそろうと、mesolveからsesolveへ処理を渡します。初期状態が密度行列なら、環境の作用が空でも密度行列側の計算経路を使います。関数名だけで「緩和を含めた」とは判断できません。[3]

    さらに、Lindblad形で数値が出ることと、現実の環境にその近似が合うことは別です。公式解説は、初期に系と環境の相関を置かないこと、系と環境の弱い結合を扱うBorn近似、環境の記憶が対象の変化より短いMarkov近似、速く振動する項を除く近似などを説明しています。強い結合や長い記憶を持つ環境へ、同じ単純なモデルをそのまま広げることはできません。[2]

    まず知りたいのは、結果の割合が変わるのか、位相の関係が失われるのか。その問いに合わせて作用と速度を指定し、適用条件を確かめる。そうして初めて、理想的な時間発展と、環境を含む計算の違いが、量子ビットを扱う判断材料になります。

    参考資料

    資料は2026年10月14日に確認。OQDは固定commit 6a086a9843b91d041e76fbd4fed83c5384a14e6e、QuTiPはタグv5.1.1に対応する固定commit 7accc77a70a08f965a29fdd13515f79cdcab9703を参照しています。本文の表と数値はQuantum Seaによる説明用の独立計算です。

    1. Open Quantum Design, oqd-analog-emulator。conversion.pyのQutipOperation処理、interface.py、pyproject.toml。OQDの時間発展処理とQuTiP 5.1.1への依存を参照。固定版の時間発展処理/依存版の指定。
    2. QuTiP 5.1 Documentation「Lindblad Master Equation Solver」。Unitary evolution、Non-unitary evolution、The Lindblad Master equation。状態・環境作用・導出の近似条件を参照。公式解説。
    3. QuTiP 5.1.1、qutip/solver/mesolve.py。c_opsと初期状態による計算経路の分岐。固定版の実装。
    4. QuTiP 5.1.1、qutip/core/superoperator.pyのlindblad_dissipatorとqutip/core/operators.pyのsigmax・sigmay・sigmaz。CρC†−(C†Cρ+ρC†C)/2の形を本稿の2行2列の計算に使用。固定版の散逸項/観測量の演算子/コードの利用条件。
  • QED-Cの量子ベンチマーク、結果の品質と実行時間を同じ条件で比べる

    QED-Cの量子ベンチマーク、結果の品質と実行時間を同じ条件で比べる

    量子コンピューターを選ぶとき、「量子ビットが多い」「計算が速い」という数字だけでは、任せたい計算に向くかは分かりません。同じ問題を解かせたのか、結果はどれくらい理想に近いのか、時間には準備や待ち時間も入っているのか。比較する前に揃えたい条件があります。

    Quantum Economic Development Consortium(QED-C)の研究者らは、用途に近いアルゴリズムを使い、回路の大きさと結果の品質を一緒に見るベンチマークを提案しています。原論文と公開実装から、性能グラフを読むときに何を確かめればよいかをたどります。[1][2]

    簡単にまとめると?

    • 量子ビット数だけでなく、同じ問題・回路の大きさ・結果の品質を揃えて比較します。
    • 「結果の忠実度」は理想的な出力分布との近さを表す指標で、そのまま正解率にはなりません。
    • 回路の変換条件と、どこからどこまでを測った時間なのかを確認してから、用途への適合を判断します。

    答えが分かる小さな計算で、回路を試す

    アルゴリズムの名前が同じでも、入力や問題の大きさが違えば、装置がこなす仕事は変わります。この研究では、問題の大きさごとに回路を選び、入力やパラメーターを変え、結果を集めます。実機が動かせる命令へ変換するコンパイラーも通るので、評価対象にはハードウェアだけでなく、その変換の仕方も含まれます。[1]

    具体例が、量子フーリエ変換(QFT)を使うQFT(1)ベンチマークです。整数を量子ビットに入れ、QFTで別の表現に移し、その表現の中で1を加え、逆QFTで戻します。正しい結果があらかじめ分かるため、得られた出力と比べられます。

    説明用に3量子ビットで考えると、表せる整数は0から7です。入力が3なら結果は4、7なら一周して0になります。この例は原論文の手順を小さい数で確かめたもので、実機の測定結果ではありません。また、答えを確かめやすい回路が動いたことだけで、実務の量子計算まで有利になったとは言えません。論文も、このQFTの入力条件と、一般の用途で必要になる条件を区別しています。[1]

    グラフの位置と色を、一緒に読む

    図1の縦軸は回路が使う量子ビット数、横軸は共通の基準で数え直した回路の深さです。深さは、同時には進められない操作を何段重ねるかに関係します。色は、その位置に集まる回路の「結果の忠実度」の平均です。同じ量子ビット数でも、深い回路まで品質を保てるかを見るための表示になっています。[1]

    三つのアルゴリズム群について、縦軸に回路幅、横軸に回路深さ、色に平均結果忠実度を示すノイズシミュレーターのプロット
    図1 回路の幅・正規化した深さ・結果の忠実度を合わせて示す、ノイズを含むシミュレーターの例。左・中央・右は異なる種類のアルゴリズム群です。灰色の背景は量子ボリュームからの予測であり、各マスの実測値ではありません。Thomas Lubinskiほか「Application-Oriented Performance Benchmarks for Quantum Computing」IEEE Transactions on Quantum Engineering, 4 (2023), 3100332、Fig. 1(出版版p.2)。原論文、CC BY 4.0。出版版PDFから図領域のみ切り出してPNG化。図内の描画・配色・注記は変更していません。 図中の実行日時は2022年10月15日。図は横にスクロールでき、原寸でも開けます。 原寸図を開く。出典[4]

    これはノイズを含むシミュレーターの例です。灰色の背景は、別の総合指標である量子ボリュームから予測した領域で、実行結果を塗った色とは違います。予測と色が合わない場所も、アルゴリズムによって得意・不得意が変わる手掛かりになります。現在の実機の順位表としては読めません。

    横軸にも注意が必要です。論文の「正規化した深さ」は、共通のゲート集合や接続条件へ変換して数えます。一方、実機では量子ビットの接続に制約があり、状態を入れ替える操作などが追加されます。同じ横軸の値でも、実機での操作段数や所要時間が同じとは限りません。変換はコンパイラーの手法にも依存するため、その版や設定を揃える必要があります。[1]

    忠実度0.6を「正解率60%」と読まない

    原論文の指標は、観測した出力分布と理想の分布との近さを求め、一様なランダム出力を基準の0、理想との一致を1とするように尺度を調整します。基準を下回る値は0に丸めます。そのため、表示された値は、単純に正解が出た割合とは異なります。[1]

    たとえば先ほどの3量子ビットのように正解が1種類なら、均等な当てずっぽうで当たる割合は8分の1です。仮に正解が出た割合を60%とすると、この指標は(0.60−0.125)÷(1−0.125)で約0.54になります。これは定義を使った説明用の検算で、装置の性能値ではありません。

    理想の出力自体が一様なら、この尺度の基準を作れません。また、平均値だけでは、特定の入力で悪い結果が出ることを見落とします。論文の付録Bは、指標とアルゴリズムの正解確率が食い違う例を示しています。自分の用途で何を正解とするか、どの入力を含めた平均かを併せて読む必要があります。[1]

    「何秒」の始まりと終わりを揃える

    利用者が結果を得るまでは、回路の作成、実機向けの変換、古典計算とのやり取り、量子回路の実行があります。共有サービスなら、順番待ちも加わります。原論文の時間評価は主に量子回路の実行部分を扱っており、依頼してから結果が戻るまでの全体時間ではありません。提供側APIの時間項目も、範囲が必ずしも同じとは限らないと指摘しています。[1]

    たとえばパラメーターを変えて何度も計算するとき、毎回回路を作って変換し直す方法と、変換済みの回路へ値だけ渡す方法では、準備の負担が変わります。量子回路の実行時間だけが短くても、作業全体が速くなるとは限りません。次の条件を合わせると、比較結果を用途に結び付けやすくなります。

    表1 比較前に揃える条件。原論文を基にQuantum Seaが整理。
    確認するもの 比較で取り違えないために
    問題と入力 同じアルゴリズム、大きさ、回路の選び方と入力条件か
    品質の数え方 何と照合した指標か、何回実行したか、平均の対象やばらつきはどうか
    回路の変換 コンパイラーの版・最適化・接続条件が同じか
    時間の範囲 準備、変換、反復、量子実行、待ち時間のうち何を含むか

    公開コードも、指標の定義と版を確かめる

    QED-Cは実行用のコードを公開しています。ただし、READMEはこれを性能標準ではなく、複数の実行環境で参照用アプリケーションを試すための試作群と位置付けています。確認した固定版のパッケージ表記は2.0.8で、コードのライセンスはApache 2.0です。コードが公開されていること自体は、特定装置で性能を再現できた証拠ではありません。[2]

    実際、この版の指標計算には、測定する量子ビットが16を超える場合、処理の負担を抑えるために一様分布を基準とした再尺度化を省く分岐があります。その場合、同じfidelityという項目名でも、返すのは再尺度化前の分布の近さです。論文の説明とコードの出力を結ぶには、版だけでなく、その条件でどの処理が通るかも必要です。本稿は保存した実装を読んだ範囲であり、このパッケージや実機を実行した評価ではありません。[3]

    自分の仕事に向く量子計算機を探すなら、まず小さい既知の問題で出力を確かめ、回路を大きくしたときの品質と、結果までにかかる時間を追います。そこで得た比較を、別の問題や現在の装置へ広げる前に、入力・指標・変換・時間範囲をもう一度揃える。それが、このベンチマークから得られる実用的な読み方です。

    参考資料

    1. Thomas Lubinskiほか「Application-Oriented Performance Benchmarks for Quantum Computing」。arXiv:2110.03137v3、2023年1月10日投稿版(PDF表紙の日付は1月11日)。本稿は第III節、第V節、付録A・B・CとFig.1を参照。書誌・版/原論文PDF。
    2. QED-C Standards TAC「QC-App-Oriented-Benchmarks」。README、pyproject.toml、LICENSE。2026年10月14日確認。固定版README/版情報/コードの利用条件。
    3. 同リポジトリ qedclib/metrics.py、hellinger_fidelity_with_expected・rescale_fidelity・polarization_fidelity。固定版の指標計算。
    4. 図1の使用版:Thomas Lubinskiほか「Application-Oriented Performance Benchmarks for Quantum Computing」、IEEE Transactions on Quantum Engineering 4 (2023)、論文番号3100332、DOI: 10.1109/TQE.2023.3253761。2023年3月7日公開、出版版の現行版日付は2023年4月19日、全32頁、Fig.1はp.2。出版社DOI/出版社公開PDF/CC BY 4.0。図はこの出版版から採用し、本文の技術説明は参考資料[1]の版を基にしています。

    公開実装の確認コミット:21dfc331ce61a2170b06f88259aa19f901c021bc。本稿の数値例と表はQuantum Seaによる説明用の整理です。

  • OQDの量子エミュレーターで読む期待値、1回の測定や100回の集計との違い

    OQDの量子エミュレーターで読む期待値、1回の測定や100回の集計との違い

    量子計算のグラフに「期待値0.5」と表示されても、1回の測定で0.5が出るとは限りません。何を測り、その結果にどんな数を割り当てたかで、グラフの読み方は変わります。

    Open Quantum Design(OQD)が公開する量子エミュレーターには、その違いをコードから追える小さな例があります。量子状態の時間変化を古典コンピューターで計算し、そこから期待値を求める処理と、確率に従って測定結果を取り出す処理を分けています。単一の量子ビットを例に、何が計算値で、何が測定の集計なのかを見ていきます。[1][2]

    簡単にまとめると?

    • 期待値は、起こりうる結果を確率で重み付けした平均で、1回に出る結果とは異なります。
    • OQDのZ期待値は数値状態から計算され、Measure命令の有限回の模擬測定とは別の出力です。
    • ショット数を増やすことと、モデルや数値計算の誤りを小さくすることは別に確かめる必要があります。

    0と1の測定結果に、Zではプラスとマイナスを割り当てる

    ここでは、量子ビットを0と1で読み分ける測定を考えます。Zという観測量では、0の結果を+1、1の結果を−1として数えます。期待値は、この数をそれぞれの確率で重み付けして足したものです。

    たとえば0になる確率が75%、1になる確率が25%なら、Zの期待値は「+1×0.75+(−1)×0.25=0.5」です。一方、1回の測定で出るのは0か1であり、Zの値としては+1か−1です。0.5という途中の値が1回の結果になるわけではありません。

    同じ状態を用意する試行を100回繰り返した場合も、必ず75回と25回に分かれるとは限りません。仮に80回が0、20回が1なら、その標本平均は0.6です。これは説明用の仮の集計で、OQDや量子装置の実測値ではありません。

    表1 同じ確率から、異なる種類の値を読む。Quantum Sea作成。100回の欄は説明用の仮例です。
    対象 この例での値 分かること
    1回の測定 0または1。Zとしては+1または−1 個々の試行で起きた結果
    モデルのZ期待値 +1×0.75−1×0.25=0.5 確率で重み付けした平均
    100回の仮の集計 0が80回、1が20回ならZの標本平均0.6 有限回の結果から求める平均

    狭い画面では表を横にスクロールできます。

    期待値の曲線と、ショット数が使われる場所

    OQDのREADMEには、状態を反転させる作用を持つXをハミルトニアンに指定し、Zの期待値を時間に沿って表示する例があります。ハミルトニアンは、状態が時間とともにどう変わるかを定めるモデルです。ここでは離散的なXゲートを1回実行するのではなく、Xを使った連続的な時間発展を計算します。[1]

    実装は回路と観測量の次元が合っているかを検査し、数値計算ライブラリQuTiPへ渡します。単一量子ビットなら初期状態は0で、時間発展後の数値状態からZの期待値を求めます。READMEの例にショット数100と書かれていても、描かれるZ期待値は100個の測定結果を平均した値ではありません。[2]

    ショット数が使われるのはMeasure命令の処理です。計算した状態から0と1の確率を求め、乱数で指定回数だけ結果を選び、その個数をcountsへまとめます。READMEの最小例自体には、このMeasure命令はありません。期待値の曲線があることだけでは、測定結果を100回集計した証拠にならないのです。[1][2]

    小さな検算で、0.5の意味を確かめる

    先ほどの75%と25%は、READMEと同じXによる時間発展からも作れます。初期状態を0、ハミルトニアンをXとし、係数と時間の単位を規格化すると、0の確率はcos²t、1の確率はsin²tになります。t=π/6を選ぶと、それぞれ3/4と1/4になり、Z期待値は0.5です。ここでのtは秒や実機のパルス時間を指定した値ではありません。

    この例は、2行2列の行列による時間発展と三角関数の式を別々に計算して照合した、説明用の数学的検算です。OQD本体を実行して性能を測った結果ではありません。同じ理想状態を独立に100回測る場合、Zの標本平均の標準偏差は約0.087になります。回数が有限なら、平均が0.5の周りでばらつくことを数で捉えられます。

    回数、時間の出力点、モデルの範囲を分けて選ぶ

    何を確かめたいかによって、見直す設定も変わります。模擬測定の集計がばらつくならショット数が関係します。今回の独立試行の例では、回数を4倍にすると標本平均の標準偏差は半分になります。ただし、誤ったモデルが回数を増やすだけで正しくなるわけではありません。

    時間変化を細かく見たい場合は、別の設定であるdtを確認します。この版ではdtを使って出力する時刻の点数を作り、QuTiPのソルバーへ渡しています。dtそのものを内部計算の固定刻みとして指定しているわけではなく、小さくすれば数値誤差が必ず減るという保証にもなりません。[2]

    実装上の対象範囲も重要です。この版のMeasureは結果を集計しますが、測定で決まった状態へ置き換える処理はありません。ここで説明した最後の測定の集計から、途中で測定し、その結果で後続操作を変える計算まで正しく再現できるとは広げられません。期待値についても、本稿は単一のZを対象にしており、任意の複雑な観測量の動作を検証したものではありません。[2]

    確認した公開コードはバージョン表記0.1.0、開発段階はAlphaです。量子コンピューターの実機性能を示す測定結果ではなく、モデルから数値を得る実装として読みます。グラフを見るときは「どんな状態を計算したか」「何を結果として返したか」「何回の標本に基づくか」を揃えると、期待値と測定集計を取り違えずに比較できます。[3]

    参考資料

    以下は2026年10月14日に確認した固定コミット 6a086a9843b91d041e76fbd4fed83c5384a14e6e(2025年9月10日)の資料です。本文の検算例はQuantum Seaによる独立計算です。

    1. Open Quantum Design, oqd-analog-emulator README。単一量子ビットのRabi flopping例と、エミュレーターの位置付け。 固定版を読む
    2. Open Quantum Design, qutip_backend.py / conversion.py / interface.py / passes.py。次元検査、初期状態、期待値、模擬測定、時間発展の実装。 固定版を読む
    3. Open Quantum Design, pyproject.toml。版0.1.0、Alpha、QuTiP 5.1.1への依存。 固定版を読む