Skip to main content
IBM Quantum Platform

filter_diagonal_terms

filter_diagonal_terms(op)

Filtra los términos de un operador que son diagonales en la base «ocupación-número».

Esto elimina todos los términos de la expresión proporcionada que FermionOperator sean un producto de operadores numéricos ( aiaia^\dagger_i a_i ). Esto incluye el término constante (un producto de cero operadores numéricos), los operadores numéricos simples, así como los productos de orden superior, como ninj=aiajajain_i n_j = a^\dagger_i a^\dagger_j a_j a_i.

Sugerencia

Una de las principales razones para filtrar dichos términos surge durante la evolución temporal de los operadores, en la que dichos términos diagonales no afectan a la evolución temporal, salvo por la introducción de una fase global. Por consiguiente, las cadenas de bits muestreadas a partir de un estado que ha evolucionado con el tiempo no se ven afectadas. Por lo tanto, se recomienda eliminarlos, por ejemplo, al preparar un hamiltoniano de estructura electrónica para la evolución temporal « qDRIFT » utilizada por SqDRIFT,, ya que así se evita una sobrecarga de muestreo que, de otro modo, sería innecesaria.

Precaución

¡El operador proporcionado debe estar ordenado de forma normal! Se trata de una suposición subyacente de la implementación que no se está verificando. Consulta normal_ordered() para saber cómo obtener un operador de esa forma.

Nota

El operador se modifica in situ. Si se tienen en cuenta los índices de grupo (véase groups), los términos que se conservan mantienen su agrupación relativa, pero los índices de grupo se reasignan a un intervalo contiguo que comienza en 0. Por lo tanto, no debes dar por sentado que el índice de grupo específico de ningún término se mantenga durante la llamada a esta función.

>>> from qiskit_fermions.operators import FermionOperator
>>> from qiskit_fermions.operators.terms.filtering import filter_diagonal_terms
>>> op = FermionOperator.from_dict(
...     {
...         (): 1.0,  # constant (diagonal)
...         ((True, 0), (False, 0)): 2.0,  # n_0 (diagonal)
...         ((True, 0), (True, 1), (False, 1), (False, 0)): 3.0,  # n_0 n_1 (diagonal)
...         ((True, 0), (False, 1)): 4.0,  # a†_0 a_1 (off-diagonal)
...     }
... )
>>> filter_diagonal_terms(op)
>>> list(op.iter_terms())
[([(True, 0), (False, 1)], (4+0j))]

Parámetros

op : el operador de orden normal cuyos términos diagonales se deben filtrar.

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.