givens_decomposition_slater
givens_decomposition_slater(orbital_coeffs)
スレーター行列式の占有軌道をギブンズ回転に分解する。
これは、スレーター行列式による状態生成に特化した givens_decomposition()、の矩形版です。 スレーター行列式の占有軌道係数行列が与えられると、参照構成 (最初の の軌道が占有されている)に適用することで、スレーター行列式を生成する一連のギブンズ回転を返す。 以下は、行が の占有軌道であり、 の空間軌道( )を基底として表された 行列である orbital_coeffs 。この行列の行は直交正規化されていると仮定する。
とは異なり givens_decomposition()、この分解では、 の完全な軌道回転ではなく、 の占有軌道のみを実現すればよいため、最大で のギブンズ回転をダイヤモンド状のパターンで配置して使用します(これに対し、正方形の分解では の「レンガの壁」のような配置となります)。 この分解には対角成分の位相は含まれていない。なぜなら、全体的な位相や、占有空間内でのいかなる回転も、準備されたスレーター行列式を変化させないからである。
各ギブンズ回転は、4-タプル で定義され (c, s, i, j)、その内容は以下の通りである:
c: 実数値のコサインs: 複素数値の正弦関数i: 最初のインデックスj: 2番目(隣接する)のインデックス
その結果、次のような形式の行列が得られる:
パラメーター
orbital_coeffs – 占有軌道係数の 行列。
戻り値
前述のように、4-タプルとして表されるギブンズ回転の列。
占有軌道は、 の参照データ の各列に対して、返された回転を順に適用することで復元される。ここで、インデックス および に作用する各回転は、
この結果は orbital_coeffs (それらは同じスレーター行列式を定義するため)同じ占有空間をカバーしているため、再構成された軌道 と対象の軌道 との重なり の二乗は1となる。
>>> import numpy as np
>>> from qiskit_fermions.linalg import givens_decomposition_slater
>>> # two occupied orbitals in a basis of three, with orthonormal rows
>>> base = np.array([[0.8, 0.6, 0.0], [-0.48, 0.64, 0.6]])
>>> orbital_coeffs = (base * np.array([[1.0], [1j]])).astype(complex)
>>> rotations = givens_decomposition_slater(orbital_coeffs)
>>> m, n = orbital_coeffs.shape
>>> reconstructed = np.eye(m, n, dtype=complex)
>>> for c, s, i, j in rotations:
... col_i, col_j = reconstructed[:, i].copy(), reconstructed[:, j].copy()
... reconstructed[:, i] = c * col_i + s.conjugate() * col_j
... reconstructed[:, j] = c * col_j - s * col_i
>>> overlap = abs(np.linalg.det(reconstructed @ orbital_coeffs.conj().T)) ** 2
>>> bool(np.isclose(overlap, 1.0))
True
givens_decomposition() 正方形(軌道完全回転)の分解について。