Skip to main content
IBM Quantum Platform

OrbitalRotation

class OrbitalRotation(rotation_unitary)

ベース: FermionicGate

軌道周りの回転を実行します。

n×nn \times n のユニタリ行列 UU (rotation_unitary)が与えられたとき、このゲートは、生成演算子を次のように写像する単一粒子の基底変換を実現する

aijUjiaj,a^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j,

これは、多体ユニタリー演算を適用することと同等である

exp(ijlog(U)ijaiaj).\exp\left(\sum_{ij} \log(U)_{ij} \, a^\dagger_i a_j\right).

ゲートが作用するフェルミオンモードの数は、 nn の次元である rotation_unitary

このゲートのインスタンスの初期化は、以下に挙げる引数を使用して行うことができます。

パラメーター

rotation_unitary (np.ndarray) – n×nn \times n のユニタリ行列 UU は、 aijUjiaja^\dagger_i \mapsto \sum_j U_{ji} a^\dagger_j を通じて軌道回転を定義する。これは正方行列かつユニタリでなければならない。これは呼び出し側の責任であり、検証は行われない。


属性

rotation_unitary

軌道回転係数を表す単位行列。


方法

from_t1_amplitudes

classmethod from_t1_amplitudes(t1)

t1t_1 (単一)の振幅から軌道回転を構築します。

この回転は、ユニタリ変換 exp(t1t1)\exp(t_1 - t_1^\dagger) であり、ここで、 nocc×nvirtn_\text{occ} \times n_\text{virt} の振幅行列 t1t_1 が、すべての n=nocc+nvirtn = n_\text{occ} + n_\text{virt} 軌道にわたる反エルミート生成子に埋め込まれている

G=(0t1t10),G = \begin{pmatrix} 0 & -t_1^* \\ t_1^\top & 0 \end{pmatrix},

占有軌道が仮想軌道よりも先に並べられる。 これは、結合クラスター振幅から初期化される際に(L)UCJアンザッツに取り込まれる単一励起軌道回転である。詳細はを参照のこと UCJ

パラメーター

t1 (ndarray) – 形状を持つ t1t_1 の振幅であり (nocc, nvrt)、ここで nocc は占有軌道数、 は nvrt 仮想軌道数である。

戻り値

n=nocc+nvirtn = n_\text{occ} + n_\text{virt} モードで動作するもので OrbitalRotation 、その exp(t1t1)\exp(t_1 - t_1^\dagger)rotation_unitary である。

戻りの型

OrbitalRotation

プロトコルの方法

_apply_unitary_placed_

_apply_unitary_placed_(vec, norb, nelec, copy, freg_indices)

ベクトルのグローバルモードに配置した後、軌道回転を適用します。

ゲートの局所行列( rotation_unitary ゲートのモード num_modes に作用する n×nn \times n 行列)は、まずフルレジスタに埋め込まれます。具体的には、状態ベクトルのモード数分の単位行列を、によって選ばれた行・列に書き込む rotation_unitary 形となります freg_indices

スピンフルな場合、埋め込み行列はアルファ/ベータ分割に沿ってブロック対角でなければならない。 アルファ/ベータがゼロではない対角線外のブロックを持つ回転は、スピンセクターを混合させる。これにより、個々のアルファ/ベータ電子数が保存されなくなり、結果として固定 (n_alpha, n_beta) セクター外の振幅が写像されてしまう。これは、固定セクターの状態ベクトルでは表現できない操作である。 このような回転は、. によって拒否されます ValueError

その後、埋め込まれた行列は、次の2つの方法のいずれかで適用されます:

  • 高速パス (がインストール ffsim されている場合のみ):埋め込まれた行列は、 ffsim.apply_orbital_rotation()のギブンズ回転カーネルを介して適用されます。 スピンフル・ブロック・スピン表記法(モード 0..norb はアルファ軌道、モード norb..2*norb はベータ軌道)では、2つの対角ブロックは、ffsim に として渡されるスピンごとの回転を表します (mat_a, mat_b)
  • 一般的な手順 :それ以外の場合(すなわち、 が ffsim 利用できない場合)、回転は、その生成元 G=ijlog(U)ijaiajG = \sum_{ij} \log(U)_{ij} a^\dagger_i a_j による進化 exp(G)\exp(G) として適用される。ここで、 UU は埋め込み行列である。 GG は、 ( linear_operator() ネイティブの FCI 行列・ベクトルカーネルによってサポートされる)を scipy``LinearOperator 介して に変換され、 を通じて適用される scipy.sparse.linalg.expm_multiply()。 これは…を反映している Evolution._apply_unitary_placed_()

パラメーター

  • vec (ndarray) – 作用させる状態ベクトル。
  • norb (int) – グローバル状態ベクトルの空間軌道数。
  • nelec (int |tuple[int, int]) – スピンを持たない系の場合は単一の整数、あるいはスピンαおよびスピンβのフェルミオンの数を表す整数のペアのいずれか。 整数の場合はスピンなしモードの解釈(モード norb は軌道である)が選択され、ペアの場合はモード 2 * norb のスピンを含むブロック (orb, spin) ・スピン解釈が選択される。
  • copy (bool) – 操作を行う前にベクトルをコピーするかどうか。
  • freg_indices (list[int]) – このゲートのローカルモードが写像される絶対(グローバル)モードのインデックス。 回転は、適用される前にこれらのグローバルモードに組み込まれます。

戻り値

変換後のベクトル。

昇給

ValueError – がスピンフルな対であり nelec 、かつ(施された)回転がアルファおよびベータのスピンセクターを混合する場合。

戻りの型

ndarray

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