givens_decomposition_slater
givens_decomposition_slater(orbital_coeffs)
Zerlegt die besetzten Orbitalen einer Slater-Determinante in Givens-Rotationen.
Dies ist das rechteckige Pendant zu givens_decomposition(), das speziell für die Zustandsvorbereitung mittels Slater-Determinanten ausgelegt ist. Ausgehend von der Koeffizientenmatrix der besetzten Orbitalen einer Slater-Determinante gibt die Funktion eine Folge von Givens-Rotationen zurück, die, auf die Referenzkonfiguration (die ersten besetzten Orbitalen) angewendet, die Slater-Determinante erzeugen. Hier ist orbital_coeffs eine Matrix der Art „ “, deren Zeilen die besetzten Orbitale darstellen, ausgedrückt in einer Basis aus räumlichen Orbitalen ( ); es wird angenommen, dass ihre Zeilen orthonormal sind.
Im Gegensatz givens_decomposition()dazu muss diese Zerlegung lediglich die besetzten Orbitale abbilden und nicht eine vollständige Orbitaldrehung; daher verwendet sie höchstens Givens-Drehungen, die in einem rautenförmigen Muster angeordnet sind (im Gegensatz zur „Ziegelmauer“ der quadratischen Zerlegung). Die Zerlegung enthält keine Diagonalphasen, da eine globale Phase und jede Rotation innerhalb des besetzten Raums den vorbereiteten Slater-Determinanten unverändert lassen.
Jede Givens-Rotation wird durch ein 4-Tupel definiert (c, s, i, j), wobei:
c: der reellwertige Kosinuss: die komplexwertige Sinusfunktioni: der erste Indexj: der zweite (angrenzende) Index
was zu einer Matrix der folgenden Form führt:
Parameter
orbital_coeffs – die „ “-Matrix der Koeffizienten der besetzten Orbitale.
Rückgabe
Die Folge von Givens-Rotationen, dargestellt als 4-Tupel, wie oben erläutert.
Die besetzten Orbitalen werden ermittelt, indem die zurückgegebenen Rotationen der Reihe nach auf die Spalten der Referenz „ “ ( ) angewendet werden, wobei jede Rotation, die auf die Indizes und wirkt,
Das Ergebnis erstreckt sich über denselben besetzten Raum wie orbital_coeffs (sie definieren dieselbe Slater-Determinante), sodass die quadratische Überlappung zwischen den rekonstruierten Orbitalen und dem Zielorbital gleich eins ist.
>>> 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() für die quadratische (vollständige Umlaufbahnrotation) Zerlegung.