Skip to main content
IBM Quantum Platform

givens_decomposition_slater

givens_decomposition_slater(orbital_coeffs)

Décompose les orbitales occupées d'un déterminant de Slater en rotations de Givens.

Il s'agit de l'équivalent rectangulaire de givens_decomposition(), spécialisé dans la préparation d'états par déterminant de Slater. À partir de la matrice des coefficients des orbitales occupées d'un déterminant de Slater, cette fonction renvoie une séquence de rotations de Givens qui, appliquées à la configuration de référence ∣1⋯10⋯0⟩\lvert 1 \cdots 1 0 \cdots 0 \rangle (les premières orbitales occupées mm ), permettent d'obtenir le déterminant de Slater. orbital_coeffs Voici une matrice d' m×nm \times n s dont les lignes correspondent aux orbitales occupées de type « mm » exprimées dans une base d'orbitales spatiales de type « nn » ( m≤nm \le n ); on suppose que ses lignes sont orthonormées.

Contrairement à givens_decomposition(), cette décomposition ne nécessite que la réalisation des orbitales occupées mm plutôt qu’une rotation orbitale complète n×nn \times n; elle utilise donc au maximum m(n−m)m (n - m) rotations de Givens disposées en forme de losange (contre le « mur de briques » n(n−1)/2n (n - 1) / 2 de la décomposition carrée). Cette décomposition ne comporte aucune phase diagonale, car une phase globale et toute rotation dans l'espace occupé laissent inchangé le déterminant de Slater préparé.

Chaque rotation de Givens est définie par un quadruplet, (c, s, i, j), où :

  • c: le cosinus à valeurs réelles
  • s: la fonction sinus à valeurs complexes
  • i: le premier index
  • j: le deuxième indice (adjacent)

ce qui donne une matrice de la forme suivante :

(cs−s†c)\begin{pmatrix} c & s \\ -s^\dagger & c \end{pmatrix}

Paramètres

orbital_coeffs – matrice « m×nm \times n » des coefficients des orbitales occupées.

Retours

La séquence de rotations de Givens représentée sous forme de quadruplets, comme expliqué ci-dessus.

Les orbitales occupées sont obtenues en appliquant, dans l'ordre, les rotations renvoyées aux colonnes de la référence « m×nm \times n » (Im0)\begin{pmatrix} I_m & 0 \end{pmatrix}, où chaque rotation agissant sur les indices ii et jj envoie

vi↦c vi+s†vj,vj↦c vj−s vi.v_i \mapsto c \, v_i + s^\dagger v_j, \qquad v_j \mapsto c \, v_j - s \, v_i.

Le résultat couvre le même espace occupé que orbital_coeffs (ils définissent le même déterminant de Slater); par conséquent, le ∣det⁡(AB†)∣2\lvert \det(A B^\dagger) \rvert^2, qui correspond au carré du chevauchement entre les orbitales reconstruites AA et l'orbitale cible BB, est égal à un.

>>> 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
Voir aussi

givens_decomposition() pour la décomposition en carrés (rotation orbitale complète).

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.