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 (les premières orbitales occupées ), permettent d'obtenir le déterminant de Slater. orbital_coeffs Voici une matrice d' s dont les lignes correspondent aux orbitales occupées de type « » exprimées dans une base d'orbitales spatiales de type « » ( ); 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 plutôt qu’une rotation orbitale complète ; elle utilise donc au maximum rotations de Givens disposées en forme de losange (contre le « mur de briques » 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éelless: la fonction sinus à valeurs complexesi: le premier indexj: le deuxième indice (adjacent)
ce qui donne une matrice de la forme suivante :
Paramètres
orbital_coeffs – matrice « » 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 « » , où chaque rotation agissant sur les indices et envoie
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 , qui correspond au carré du chevauchement entre les orbitales reconstruites et l'orbitale cible , 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
givens_decomposition() pour la décomposition en carrés (rotation orbitale complète).