givens_decomposition_slater
givens_decomposition_slater(orbital_coeffs)
Descompone los orbitales ocupados de un determinante de Slater en rotaciones de Givens.
Esta es la versión rectangular de givens_decomposition(), especializada en la preparación de estados mediante el determinante de Slater. A partir de la matriz de coeficientes de los orbitales ocupados de un determinante de Slater, devuelve una secuencia de rotaciones de Givens que, al aplicarlas a la configuración de referencia (los primeros orbitales ocupados ), dan como resultado el determinante de Slater. Aquí orbital_coeffs tenemos una matriz de tipo « », cuyas filas son los orbitales ocupados expresados en una base de orbitales espaciales ( ); se supone que sus filas son ortonormales.
A diferencia de givens_decomposition(), esta descomposición solo necesita representar los orbitales ocupados en lugar de una rotación orbital completa , por lo que utiliza como máximo rotaciones de Givens dispuestas en forma de rombo (frente al «muro de ladrillos» de la descomposición cuadrada). La descomposición no contiene fases diagonales, ya que una fase global y cualquier rotación dentro del espacio ocupado no modifican el determinante de Slater preparado.
Cada rotación de Givens se define mediante un cuádruple, (c, s, i, j), en el que:
c: el coseno de valor reals: el seno de valor complejoi: el primer índicej: el segundo índice (adyacente)
lo que da lugar a una matriz de la forma:
Parámetros
orbital_coeffs : la matriz « » de coeficientes de orbitales ocupados.
Devuelve
La secuencia de rotaciones de Givens representada mediante cuatrupletas, tal y como se ha explicado anteriormente.
Los orbitales ocupados se recuperan aplicando, en orden, las rotaciones devueltas a las columnas de la referencia « » ( ), donde cada rotación que actúa sobre los índices y envía
El resultado abarca el mismo espacio ocupado que orbital_coeffs (definen el mismo determinante de Slater), por lo que el solapamiento al cuadrado entre los orbitales reconstruidos y el orbital de referencia es igual 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() para la descomposición cuadrática (rotación orbital completa).