Skip to main content
IBM Quantum Platform

マップ演算子の表現

マッパーとは、数学的な等価性を保ちつつ、演算子をある表現から別の表現へと変換するルーチンのことです。 これらを活用して、さまざまな演算子代数間で柔軟に処理を行い、量子回路の実行に向けた演算子の準備を行うことができます。


カスタムマッパーを実装する

mappers モジュールを使えば、カスタムマッピングを簡単に実装できます。 マッパーは、演算子を構成する基本作用(生成、消滅、マジョラーナなど)を変換し、変換されたこれらの作用を、対象の表現の規則に従って組み合わせることで機能する。

具体的な例として、次のように、をクビット演算子に MajoranaOperator 写像するジョーダン・ウィグナー変換を考えてみましょう map_majorana_action_generators():

>>> from qiskit.quantum_info import SparseObservable
>>> from qiskit_fermions.mappers import map_majorana_action_generators
>>> from qiskit_fermions.operators import MajoranaOperator
>>>
>>> # Create a Majorana operator
>>> maj_op = MajoranaOperator.from_dict({(0, 1): 1.0, (2,): 0.5})
>>>
>>> # Define how each Majorana action maps to Pauli strings
>>> num_qubits = 2
>>> def map_action(mode: int) -> SparseObservable:
...     idx = mode // 2
...     qubits = list(range(idx + 1))
...     pauli = "Y" if mode % 2 else "X"
...     return SparseObservable.from_sparse_list(
...         [("Z" * idx + pauli, qubits, 1.0)],
...         num_qubits=num_qubits,
...     )
>>>
>>> # Apply the mapping to transform the operator
>>> custom_observable = map_majorana_action_generators(
...     maj_op,
...     map_action,
...     identity=lambda: SparseObservable.identity(num_qubits),
...     compose=SparseObservable.compose,
... )
>>> print(custom_observable.simplify())
<SparseObservable with 2 terms on 2 qubits: (0+1j)(Z_0) + (0.5+0j)(X_1 Z_0)>

カスタムマッパーを実装するための主な手順は次のとおりです:

  1. アクション変換の定義 :各アクション(モードによってインデックス付けされる)が、ターゲット表現にどのようにマッピングされるかを指定します。 上記の例では、ジョーダン・ウィグナーの規則に従って、マジョラナ作用がパウリ弦に対応付けられる。
  2. 提供されているマッピング関数のいずれかを使用してください。このモジュール mappers は、演算子の項を反復処理し、その後、この operators モジュールが提供する演算子の表現に対してカスタムアクションマップを適用するためのユーティリティ関数を提供しています。 例えば、はマジョラナ演算子を用いて map_majorana_action_generators() 扱われます。
  3. 結果の取得 :マッピング関数は、すべての項に対して一貫して変換が適用された、ターゲット表現の演算子を返します。

この設計により、内部の演算子の構造について深い知識がなくても、カスタムマッピングのプロトタイプを簡単に作成できます。 この変換は、数学的な等価性を保ちつつ、演算子内のすべての項に自動的に適用されます。

ヒント

また、提供されているイテレータ関数のいずれかを使用する代わりに、演算子の項を手動で反復処理することもできます。 詳細については、演算子ガイドの「 項の反復」 に関するセクションを参照してください。


ライブラリの実装

このモジュール qiskit_fermions.mappers.library は、一般的なマッピングに対する、効率的で徹底的にテストされた実装を提供します。 これらはカスタムマッパーと同じ基本的なパターンに従っていますが、本番環境での使用に最適化されており、 Python およびC APIの両方で利用可能です。

以下の例では、カスタムマッパーのセクションにある MajoranaOperator ものと同じライブラリマッパーを適用しており、同等の結果が得られることを示しています:

>>> from qiskit_fermions.mappers.library import majorana_to_fermion, jordan_wigner
>>>
>>> # Convert MajoranaOperator to FermionOperator using library mapper
>>> ferm_op = majorana_to_fermion(maj_op)
>>>
>>> # Apply Jordan-Wigner mapper to get qubit operator
>>> sparse_observable = jordan_wigner(ferm_op, num_qubits=2)
>>> difference = sparse_observable - custom_observable
>>> print(difference.simplify() == SparseObservable.zero(num_qubits))
True
注

上記の2段階の手順は、2つのライブラリ・マッパーを組み合わせる様子を示すために記述されています。 実際には、代わりに を1ステップ MajoranaOperator で写像することになります majorana_jordan_wigner() (qf_maj_op_jordan_wigner() C APIでは )。他の演算子タイプについても同様で、 edge_vertex_jordan_wigner() や ( transfer_vertex_jordan_wigner()qf_edge_op_jordan_wigner() , qf_transfer_op_jordan_wigner())も FermionOperator 同様です。 を経由すると、中間結果も肥大化してしまいます。これらの代数の各生成元は単一のパウリ文字列に写像されるのに対し、各フェルミオン作用は2項の和に写像されるため、複数の生成元から構成された項は展開された後、再び統合されてしまうのです。 その節約効果は項の長さに伴って大きくなります。ホッピング・ハミルトニアンの単一生成子項については、2つの経路のコストはほぼ同じです。

Python API では、これらのライブラリマッパーの一部は、型に依存しない便利なマッパーを介して利用することもできます。 fermion_operator() そして、… majorana_to_fermion() や… fermion_to_majorana() (その他も)の前に配置 majorana_operator() され、ユーザーが自分で適切な関数を選ぶ必要はなく、渡されたオブジェクトの型に基づいて内部的に適切なライブラリの実装に処理を委譲します。 これと同様に jordan_wigner()、も、与えられた演算子に一致する4つの直接実装のうちのいずれかに処理を委譲します。 このディスパッチが内部でどのように実装されているか qiskit_fermions.protocols については、を参照してください。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。