givens_decomposition_slater
givens_decomposition_slater(orbital_coeffs)
Scompone gli orbitali occupati di un determinante di Slater in rotazioni di Givens.
Si tratta della versione rettangolare di givens_decomposition(), specializzata nella preparazione dello stato tramite il determinante di Slater. Data la matrice dei coefficienti degli orbitali occupati di un determinante di Slater, restituisce una sequenza di rotazioni di Givens che, applicate alla configurazione di riferimento (i primi orbitali occupati), preparano il determinante di Slater. orbital_coeffs Ecco una matrice di , le cui righe sono gli orbitali occupati espressi in una base di orbitali spaziali ( ); si presume che le sue righe siano ortonormali.
A differenza di givens_decomposition(), questa scomposizione deve solo realizzare gli orbitali occupati anziché una rotazione completa degli orbitali ; pertanto, utilizza al massimo rotazioni di Givens disposte a forma di rombo (rispetto alla struttura a “muro di mattoni” della scomposizione quadrata). La scomposizione non contiene fasi diagonali, poiché una fase globale e qualsiasi rotazione all’interno dello spazio occupato lasciano invariato il determinante di Slater preparato.
Ogni rotazione di Givens è definita da una quadrupla, (c, s, i, j), in cui:
c: il coseno a valori realis: il seno a valori complessii: il primo indicej: il secondo indice (adiacente)
che danno come risultato una matrice della forma:
Parametri
orbital_coeffs – la matrice “ ” dei coefficienti degli orbitali occupati.
Risultati
La sequenza di rotazioni di Givens rappresentata come quartupla, come spiegato sopra.
Gli orbitali occupati vengono ricavati applicando, in ordine, le rotazioni restituite alle colonne del riferimento “ ” ( ), dove ogni rotazione che agisce sugli indici e invia
Il risultato occupa lo stesso spazio ( orbital_coeffs poiché definiscono lo stesso determinante di Slater), quindi la sovrapposizione al quadrato tra gli orbitali ricostruiti e quelli di riferimento è pari a uno.
>>> 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() per la scomposizione in quadrati (rotazione orbitale completa).