Skip to main content
IBM Quantum Platform

フェルミオン回路を用いた研究

重要

このガイドで解説している機能は、現時点では Python APIでのみ利用可能です。 同等の機能は、今後のリリースで C API でも利用可能になる予定です。

このガイドでは、最初に量子ビット(qubit)にマッピングすることなく、フェルミオン空間で直接量子アルゴリズムを実装 FermionicCircuit する方法について説明します。


なぜフェルミオン回路を使うのか

キュービットベースのアーキテクチャ上で、フェルミオンハミルトニアンの時間発展を実装するための従来のワークフローについて考えてみましょう:

  1. フェルミオンハミルトニアン(例えば、 H=∑pqhpqcp†cqH = \sum_{pq} h_{pq} c^\dagger_p c_q )を定義する。
  2. これを量子ビット演算子に写像する(例えば、ジョーダン・ウィグナー写像を用いて)。
  3. 量子ビット空間における時間発展を実装する(トロッター化またはその他の手法を用いて)。

このアプローチには根本的な限界がある。すなわち、クビットへの早期マッピングを行うと、フェルミオン構造に関する問題固有の知識が失われてしまう。 標準的な最適化パスでは、フェルミオン対称性や許容される項の並べ替えを活用できないため、不必要な深さやゲート数を持つ、最適とはいえない回路が生成されてしまう。

これにより、ワークフローが改善 FermionicCircuit されます:

  1. フェルミオンハミルトニアン(例えば、 H=∑pqhpqcp†cqH = \sum_{pq} h_{pq} c^\dagger_p c_q )を定義する。
  2. フェルミオンゲートを用いて、フェルミオン空間において時間発展を直接実装する。
  3. トランスパイレーションプロセスの一環として、量子ビット空間への写像を行う。

このアプローチは、問題に関連する知識をフェルミオン空間に保持することで、この制限に対処する。フェルミオン空間では、最適化処理においてフェルミオンの構造や交換関係を活用し、回路の深さを低減することができる。 フェルミオン回路はどのような計算を行うかを記述するのに対し、トランスピレーションはその計算を量子ビットにどのようにマッピングするかを処理するため、関心の分離がより明確になります。


汎用モードのインデックス作成

モジュール operators も も、モードの性質について何の仮定も行わない、汎用的なモードベースのインデックス機能を使用 FermionicCircuit しています。 モードとは、単にフェルミオンの自由度を表す抽象的な指標であり、それ自体に固有の意味合いはない。 この設計上の選択は、オペレーターモジュールと整合しており、最大限の柔軟性を確保しています。 たとえば、数学的な表現にかかわらず、この OperatorTrait プロトコルを実装する任意の演算子に対して、時間発展を実装することができます。


フェルミオン回路を構築する

以下の例では、前のセクションで説明した時間発展を実装しています。 フェルミオンモードの数を指定 FermionicCircuit して を構築し、そこからフェルミオンゲートを追加して時間発展を実現 qiskit_fermions.circuit.library する。

また、この例では、 演算子の項のグループ化を利用して、ドメイン知識を演算子に組み込む方法も示しています。 ハミルトニアン項にグループインデックスを割り当てることで、最適化処理がトランスパイラースタック全体を通じて活用できる構造情報を保持することができます。

>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>>
>>> # Create a circuit with 4 fermionic modes
>>> circuit = FermionicCircuit(4)
>>>
>>> # Define a simple fermionic Hamiltonian
>>> hamiltonian = FermionOperator.from_terms([
...     ([cre(0), ann(2)], 0.5),
...     ([cre(2), ann(0)], 0.5),
...     ([cre(1), ann(3)], 0.5),
...     ([cre(3), ann(1)], 0.5),
... ])
>>> # Add some problem structure by grouping our Hamiltonian terms
>>> hamiltonian.groups = [0, 0, 1, 1]
>>>
>>> # Add an evolution gate to implement exp(-i * t * H)
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)
単一の時間発展ゲートを備えた単純な `FermionicCircuit`。 いくつかの時間発展ゲートを備えた、分解された `FermionicCircuit`。

分解のような単純な演算であっても、演算子の項のグループ化が維持されている点に注目してください。 これは、構造情報が回路スタック内をどのように流れるかを示しています。 クビットへの完全なトランスパイリングについて理解するには、「 フェルミオン回路のトランスパイリングガイド」を参照してください。


フェルミオン回路のトランスパイル

で表される量子アルゴリズムを実装するには、 FermionicCircuit それを にトランスパイルする必要があります QuantumCircuit。 その方法については、「 フェルミオン回路のトランスパイル」 ガイドで学ぶことができます。


次のステップ

  • 利用可能なフェルミオンゲートについては、 qiskit_fermions.circuit.library ドキュメントをご覧ください。
  • 演算子の解説ガイドを参照し、フェルミオン回路で使用できるフェルミオンハミルトニアンの構築方法を理解しましょう。
  • SQDRIFTの 「はじめに」ガイドを参照して、実用的なエンドツーエンドの例を確認してください。
  • ffsimの関係ガイドを読んで、a がどのように直接シミュレートされる FermionicCircuit のか、またこれらの汎用モード指数がシミュレーション時にのみスピンセマンティクスを帯びる仕組みについて理解してください。
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。