Skip to main content
IBM Quantum Platform

givens_decomposition_slater

givens_decomposition_slater(orbital_coeffs)

スレーター行列式の占有軌道をギブンズ回転に分解する。

これは、スレーター行列式による状態生成に特化した givens_decomposition()、の矩形版です。 スレーター行列式の占有軌道係数行列が与えられると、参照構成 1100\lvert 1 \cdots 1 0 \cdots 0 \rangle (最初の mm の軌道が占有されている)に適用することで、スレーター行列式を生成する一連のギブンズ回転を返す。 以下は、行が mm の占有軌道であり、 nn の空間軌道( mnm \le n )を基底として表された m×nm \times n 行列である orbital_coeffs 。この行列の行は直交正規化されていると仮定する。

とは異なり givens_decomposition()、この分解では、 n×nn \times n の完全な軌道回転ではなく、 mm の占有軌道のみを実現すればよいため、最大で m(nm)m (n - m) のギブンズ回転をダイヤモンド状のパターンで配置して使用します(これに対し、正方形の分解では n(n1)/2n (n - 1) / 2 の「レンガの壁」のような配置となります)。 この分解には対角成分の位相は含まれていない。なぜなら、全体的な位相や、占有空間内でのいかなる回転も、準備されたスレーター行列式を変化させないからである。

各ギブンズ回転は、4-タプル で定義され (c, s, i, j)、その内容は以下の通りである:

  • c: 実数値のコサイン
  • s: 複素数値の正弦関数
  • i: 最初のインデックス
  • j: 2番目(隣接する)のインデックス

その結果、次のような形式の行列が得られる:

(cssc)\begin{pmatrix} c & s \\ -s^\dagger & c \end{pmatrix}

パラメーター

orbital_coeffs – 占有軌道係数の m×nm \times n 行列。

戻り値

前述のように、4-タプルとして表されるギブンズ回転の列。

占有軌道は、 m×nm \times n の参照データ (Im0)\begin{pmatrix} I_m & 0 \end{pmatrix} の各列に対して、返された回転を順に適用することで復元される。ここで、インデックス ii および jj に作用する各回転は、

vicvi+svj,vjcvjsvi.v_i \mapsto c \, v_i + s^\dagger v_j, \qquad v_j \mapsto c \, v_j - s \, v_i.

この結果は orbital_coeffs (それらは同じスレーター行列式を定義するため)同じ占有空間をカバーしているため、再構成された軌道 AA と対象の軌道 BB との重なり det(AB)2\lvert \det(A B^\dagger) \rvert^2 の二乗は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() 正方形(軌道完全回転)の分解について。

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