Skip to main content
IBM Quantum Platform

MajoranaOperator

class MajoranaOperator(coeffs, modes, boundaries)

Bases: object

Un operador de fermión de Majorana.


Definición

Este operador viene definido por una combinación lineal de productos de operadores de Majorana [1], que pueden definirse en términos de los operadores estándar de creación y aniquilación de fermiones en segunda cuantización (véase también FermionOperator):

γ=a+a  and  γ=i(aa)\gamma = a^\dagger + a ~~\text{and}~~ \gamma' = i(a^\dagger - a)

La propiedad fundamental de que un fermión de Majorana sea su propia antipartícula resulta evidente de inmediato:

γi=γi  and  γi2=(γi)2=1\gamma_i = \gamma_i^\dagger ~~\text{and}~~ \gamma_i^2 = (\gamma_i^\dagger)^2 = 1

Esto da lugar a las siguientes relaciones de anticomutación para un 2n2n es de fermiones de Majorana:

{γi,γj}=2δij\left\{\gamma_i,\gamma_j\right\} = 2\delta_{ij}

De este modo, la definición del operador completo queda así:

MajoranaOperator=icijγj^,\text{\texttt{MajoranaOperator}} = \sum_i c_i \bigotimes_j \hat{\gamma_j} \, ,

donde cic_i es el coeficiente (complejo) que constituye la combinación lineal de los productos de γj\gamma_j. El índice jj puede tomar cualquier valor comprendido entre 0 y el número de modos fermiónicos de Majorana sobre los que actúa el operador, menos 1.


Implementación

Esta clase almacena los términos y los coeficientes en varios vectores dispersos, de forma similar al formato de filas dispersas comprimidas que se utiliza habitualmente para las matrices dispersas. Más concretamente, un único operador contiene 4 matrices:

coeffsUn vector de coeficientes complejos formado por dos números de coma flotante de 64 bits.
modesUn vector de enteros de 32 bits que almacena los índices de los modos de Majorana sobre los que se ha actuado.
boundariesUn vector de números enteros que indica los límites en modes.

Los números enteros del índice modes corresponden a los modos de Majorana: jj. Cuando se utiliza la función de conveniencia gamma(), se emplean índices pares (impares) para γ\gamma ( γ\gamma' ).

Nota

Puedes acceder a copias de solo lectura de estos matrices internas a través de sus respectivos métodos: get_coeffs(), get_modes(), y get_boundaries().

Esta estructura de datos permite crear y manipular operadores de forma muy eficiente. Sin embargo, esto implica que un operador podría contener términos duplicados en cualquier momento. Estos deben resolverse manualmente mediante el uso de simplify().

Construcción

Se puede crear un operador directamente proporcionando las matrices descritas anteriormente:

>>> from qiskit_fermions.operators import MajoranaOperator
>>> coeffs = [1.0, -2.0, 3.0j, -0.5j]
>>> modes = [0, 1, 0, 2, 0, 1, 2, 3]
>>> boundaries = [0, 0, 2, 4, 8]
>>> op = MajoranaOperator(coeffs, modes, boundaries)
>>> print(format(op))
  1.000000e0 +0.000000e0j * ()
 -2.000000e0 +0.000000e0j * (γ0 γ'0)
 -0.000000e0-5.000000e-1j * (γ0 γ'0 γ1 γ'1)
  0.000000e0 +3.000000e0j * (γ0 γ1)

Por comodidad, es posible crear un operador a partir de un diccionario de tipo « Python » de la siguiente manera:

>>> from qiskit_fermions.operators import gamma
>>> op = MajoranaOperator.from_dict(
...     {
...         (): 1.0,
...         (gamma(0, False), gamma(0, True)): -2.0,
...         (gamma(0, False), gamma(1, False)): 3.0j,
...         (gamma(0, False), gamma(0, True), gamma(1, False), gamma(1, True)): -0.5j,
...     }
... )
>>> print(format(op))
  1.000000e0 +0.000000e0j * ()
 -2.000000e0 +0.000000e0j * (γ0 γ'0)
 -0.000000e0-5.000000e-1j * (γ0 γ'0 γ1 γ'1)
  0.000000e0 +3.000000e0j * (γ0 γ1)

En este ejemplo, hemos utilizado gamma() para crear los operadores de Majorana.

Además, se dispone de los siguientes métodos de construcción y de ayuda rápida:

zero()Crea el operador de identidad aditiva.
one()Crea el operador de identidad multiplicativa.
from_terms(términos)Crea un nuevo operador a partir de un iterador de términos (véase también iter_terms()).
from_terms_with_groups(términos)Crea un nuevo operador a partir de un iterador de términos con grupos (véase también iter_terms_with_groups()).

Formateado

En los ejemplos anteriores, los operadores creados se han mostrado utilizando la salida de format(), lo que da como resultado una forma del operador legible para el ser humano.

>>> print(format(op))
  1.000000e0 +0.000000e0j * ()
 -2.000000e0 +0.000000e0j * (γ0 γ'0)
 -0.000000e0-5.000000e-1j * (γ0 γ'0 γ1 γ'1)
  0.000000e0 +3.000000e0j * (γ0 γ1)
Nota

El orden de impresión de format(op) se ordena explícitamente antes de la impresión. Por lo tanto, no refleja el orden de los términos dentro del operador.

Se puede obtener una forma alternativa a partir de la función repr() , lo que da como resultado una representación interpretable mediante « Python ». En otras palabras, este resultado se puede copiar y pegar fácilmente en un shell de Python :

>>> print(repr(op))
MajoranaOperator.from_dict({...})

Por último, en el caso de los grandes operadores, ambos resultados podrían ser muy extensos y poco deseables. A continuación, se puede obtener de la función str() un formulario muy sencillo con información mínima:

>>> print(str(op))
<MajoranaOperator with 4 terms>

Iteración

Dado que la estructura de datos subyacente está implementada en Rust y tiene una disposición compleja, no es posible recorrerla directamente:

>>> list(iter(op))
Traceback (most recent call last):
  ...
TypeError: 'qiskit_fermions.operators.majorana_operator.MajoranaOperator' object is not iterable

En su lugar, esta clase proporciona iteradores personalizados para cumplir este propósito:

>>> list(sorted(op.iter_terms()))
[([], (1+0j)), ([0, 1], (-2+0j)), ([0, 1, 2, 3], (-0-0.5j)), ([0, 2], 3j)]
Consulte también

iter_terms()

Para obtener más detalles relevantes sobre la implementación.

En la tabla siguiente se enumeran todos los iteradores disponibles:

iter_terms()Un iterador sobre los términos del operador.
iter_terms_with_groups()Un iterador que recorre los términos del operador junto con su índice de grupo asociado.

Aritmética

Se admiten las siguientes operaciones aritméticas:

Suma/Resta

>>> op = MajoranaOperator.one()
>>> (op + op).simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> (op - op).simplify()
MajoranaOperator.from_dict({})
>>> op += op
>>> op.simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> op -= op
>>> op.simplify()
MajoranaOperator.from_dict({})

Multiplicación y división escalar

>>> op = MajoranaOperator.one()
>>> (2 * op).simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> (op / 2).simplify()
MajoranaOperator.from_dict({(): 0.5+0j})
>>> op *= 2
>>> op.simplify()
MajoranaOperator.from_dict({(): 2+0j})
>>> op /= 2
>>> op.simplify()
MajoranaOperator.from_dict({(): 1+0j})

Composición del operador

Nota

La composición de operadores se corresponde con la multiplicación por la izquierda: se c = a & b corresponde con « C=BAC = B A ». En otras palabras, la composición de dos operadores devuelve un operador resultante que realiza «primero y a luego ». b

>>> op1 = MajoranaOperator.from_dict({(): 2.0, (gamma(0, False),): 3.0})
>>> op2 = MajoranaOperator.from_dict({(): 1.5, (gamma(0, True),): 4.0})
>>> comp = (op1 & op2).simplify()
>>> print(format(comp))
  3.000000e0 +0.000000e0j * ()
  4.500000e0 +0.000000e0j * (γ0)
  8.000000e0 +0.000000e0j * (γ'0)
  1.200000e1 +0.000000e0j * (γ'0 γ0)
>>> op2 &= op1
>>> print(format(op2.simplify()))
  3.000000e0 +0.000000e0j * ()
  4.500000e0 +0.000000e0j * (γ0)
  1.200000e1 +0.000000e0j * (γ0 γ'0)
  8.000000e0 +0.000000e0j * (γ'0)
>>> squared = (op1 ** 2).simplify()
>>> print(format(squared))
  4.000000e0 +0.000000e0j * ()
  1.200000e1 +0.000000e0j * (γ0)
  9.000000e0 +0.000000e0j * (γ0 γ0)
Nota

Por comodidad, la multiplicación por la derecha se implementa mediante c = a @ b (lo que da como resultado « C=ABC = A B »).

>>> (op1 @ op2).equiv(op2 & op1)
True

Otras operaciones

Además de los métodos mágicos que corresponden a las operaciones aritméticas descritas anteriormente, se dispone de los siguientes métodos:

adjoint()Devuelve el conjugado hermitiano (o adjunto) de este operador.
ichop( [atol] )Elimina los términos cuyo coeficiente sea inferior al umbral indicado.
simplify( [atol] )Devuelve un operador equivalente pero simplificado.
normal_ordered( [ascendente, reducir] )Devuelve un operador equivalente con términos ordenados normalmente.
relabel_modes(permutación)Devuelve un nuevo operador con los modos renombrados.

Propiedades

Por último, existen diversos métodos para comprobar determinadas propiedades de un operador:

is_hermitian( [atol] )Devuelve si este operador es hermitiano.
max_rank()Devuelve el rango máximo de los términos de este operador.
is_even()Devuelve si este operador es par.

[ 1 ]

https://en.wikipedia.org/wiki/Majorana _fermion


Atributos

groups

Un vector opcional de índices de grupo para cada término.

Para obtener más información, consulta el módulo grouping .


Métodos

adjoint

adjoint()

Devuelve el conjugado hermitiano (o adjunto) de este operador.

Esto afecta a los términos y coeficientes de la siguiente manera:

  • las acciones de cada término invierten su orden
  • los coeficientes son conjugados complejos
>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): -1.0j, (gamma(0, False), gamma(0, True)): 1.0})
>>> adj = op.adjoint()
>>> print(format(adj))
 -0.000000e0 +1.000000e0j * ()
  1.000000e0 -0.000000e0j * (γ'0 γ0)
equiv

equiv(other, atol=1e-08)

Comprueba si este operador es equivalente a otro operador.

En este contexto, «equivalencia» significa igualdad aproximada dentro de los límites de la tolerancia absoluta especificada. Para ser más precisos, este método devuelve True, cuando todos los valores absolutos de los coeficientes de la diferencia other - self están por debajo del umbral especificado atol.

Nota

Esta es la comparación matemática que casi siempre te interesa. Se diferencia del operador == , que comprueba la igualdad exacta de los términos almacenados (sus coeficientes, modos y límites internos de los términos) sin tolerancia ni simplificación. Por lo tanto, dos operadores matemáticamente iguales pueden dar resultados diferentes en la comparación en == si se almacenan de forma distinta; por ejemplo, un no simplificado a + a frente a un 2 * a, o términos ordenados de forma diferente. Utiliza equiv para comparar operadores dentro de los límites de la tolerancia numérica.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 1e-7})
>>> zero = MajoranaOperator.zero()
>>> op.equiv(zero)
False
>>> op.equiv(zero, 1e-6)
True
>>> op.equiv(zero, 1e-9)
False

Parámetros

  • otro : el otro operador con el que se va a comparar.
  • atol : la tolerancia absoluta para la comparación. Este valor se establece por defecto en 1e-8.
from_dict

classmethod from_dict(data)

Crea un nuevo operador a partir de un diccionario.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict(
...     {
...         (): 1.0-1.0j,
...         (0, 1): 2.0,
...     }
... )
>>> print(format(op))
  1.000000e0 -1.000000e0j * ()
  2.000000e0 +0.000000e0j * (γ0 γ'0)

Parámetros

datos : un diccionario que asocia tuplas de términos a coeficientes complejos. Cada clave es una tupla de números enteros que indexan los modos de Majorana. Puedes utilizar gamma() para simplificar la asignación de índices pares e impares a γ\gamma y γ\gamma'.

Devuelve

Un nuevo operador.

from_terms

classmethod from_terms(terms)

Crea un nuevo operador a partir de un iterador de términos (véase también iter_terms()).

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0, (0,): 1.0, (1,): -1.0j})
>>> op.equiv(MajoranaOperator.from_terms(op.iter_terms()))
True

Parámetros

términos : un iterador de términos tal y como los genera iter_terms().

Devuelve

Un nuevo operador.

from_terms_with_groups

classmethod from_terms_with_groups(terms)

Crea un nuevo operador a partir de un iterador de términos con grupos (véase también iter_terms_with_groups()).

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator([2.0, 1.0, -1.0j], [0, 1], [0, 0, 1, 2])
>>> op.groups = [0, 1, 1]
>>> reconstructed = MajoranaOperator.from_terms_with_groups(op.iter_terms_with_groups())
>>> op.equiv(reconstructed) and op.groups == reconstructed.groups
True

Parámetros

términos : un iterador de términos tal y como los genera iter_terms_with_groups().

Devuelve

Un nuevo operador.

get_boundaries

get_boundaries()

Devuelve una lista de solo lectura con los índices que indican los límites entre los términos del operador.

Nota

Este método devuelve una copia de los datos internos.

Consulte también

Aquí tienes la explicación de la estructura interna de datos.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.one()
>>> op += MajoranaOperator.from_dict({(0, 1): 1.0})
>>> op.get_boundaries()
[0, 0, 2]

Devuelve

Una lista de los límites de los términos del operador.

get_coeffs

get_coeffs()

Devuelve una lista de solo lectura con los coeficientes del operador.

Nota

Este método devuelve una copia de los datos internos.

Consulte también

Aquí tienes la explicación de la estructura interna de datos.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.one()
>>> op += -1j * MajoranaOperator.one()
>>> op.get_coeffs()
[(1+0j), -1j]

Devuelve

Una lista de los coeficientes del operador.

get_modes

get_modes()

Devuelve una lista de solo lectura con los índices de los modos sobre los que ha actuado el operador.

Nota

Este método devuelve una copia de los datos internos.

Consulte también

Aquí tienes la explicación de la estructura interna de datos.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.one()
>>> op += MajoranaOperator.from_dict({(0, 1): 1.0})
>>> op.get_modes()
[0, 1]

Devuelve

Una lista de los modos de funcionamiento del operador.

get_support

get_support()

Devuelve el conjunto de índices de modo sobre los que actúa este operador.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict(
...     {
...         (0, 4): 1,
...         (1, 3, 4, 7): 1,
...     }
... )
>>> assert op.get_support() == {0, 1, 3, 4, 7}

Devuelve

El conjunto de índices de modo sobre los que actúa este operador.

group_weights

group_weights()

Devuelve la media de la magnitud absoluta del coeficiente de cada grupo.

La i-ésima entrada es la suma de abs(coeff) sobre los términos del grupo i, dividida entre el número de términos de ese grupo. Si es groups None, esta función también devuelve None.

Se trata de la ponderación de muestreo de una fórmula de producto aleatoria (por ejemplo, qDRIFT ) que extrae grupos completos en lugar de términos individuales. Calcularlo de forma nativa resulta considerablemente más económico que reducir y get_coeffs() groups en NumPy,, ya que esos dos accesores copian cada uno un valor por cada término no agrupado del operador, solo para volver a agregarlo en un único valor por grupo, mientras que esta operación devuelve únicamente los valores reducidos num_groups() .

Nota

Un índice de grupo que ningún término tiene asignado un peso 0.0, lo que hace que quede excluido de la muestra.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
...     [1.0, 2.0, -1.0, -2.0],
...     [0, 1, 2, 3, 1, 0, 3, 2],
...     [0, 2, 4, 6, 8],
... )
>>> print(op.group_weights())
None
>>> op.groups = [0, 1, 0, 1]
>>> op.group_weights()
[1.0, 2.0]

Devuelve

La magnitud media absoluta del coeficiente de cada índice de grupo.

has_groups

has_groups()

Devuelve si este operador realiza un seguimiento de los índices de grupo.

Esto equivale a (aunque es más barato que) comprobar op.groups is not None, ya que no copia los índices de grupo del operador para inspeccionarlos.

Nota

Esto devuelve un resultado True incluso cuando groups es una lista vacía, que es el estado de un operador agrupado que no contiene ningún término.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
...     [1.0, 2.0, -1.0, -2.0],
...     [0, 1, 2, 3, 1, 0, 3, 2],
...     [0, 2, 4, 6, 8],
... )
>>> op.has_groups()
False
>>> op.groups = [0, 1, 0, 1]
>>> op.has_groups()
True

Devuelve

Si groups se ha establecido en este operador.

ichop

ichop(atol=1e-08)

Elimina los términos cuyo coeficiente sea inferior al umbral indicado.

Este método modifica el operador in situ y devuelve None.

Precaución

¡Este método trunca los coeficientes de forma «codiciosa»! Si el operador sobre el que se realiza la operación puede contener coeficientes distintos para términos duplicados, ¡considera la posibilidad de llamar a simplify() en su lugar!

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 1e-4, (0,): 1e-6, (1,): 1e-10})
>>> print(format(op))
  1.000000e-4 +0.000000e0j * ()
  1.000000e-6 +0.000000e0j * (γ0)
 1.000000e-10 +0.000000e0j * (γ'0)
>>> op.ichop()
>>> print(format(op))
  1.000000e-4 +0.000000e0j * ()
  1.000000e-6 +0.000000e0j * (γ0)
>>> op.ichop(1e-5)
>>> print(format(op))
  1.000000e-4 +0.000000e0j * ()

Parámetros

atol : la tolerancia absoluta para el umbral de corte. Este valor se establece por defecto en 1e-8.

is_even

is_even()

Devuelve si este operador es par.

Nota

Se considera que un operador es par incluso cuando todos sus términos contienen un número par de acciones.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(0, 1): 1})
>>> op.is_even()
True
>>> op = MajoranaOperator.from_dict({(0,): 1})
>>> op.is_even()
False

Devuelve

Si este operador es par.

is_hermitian

is_hermitian(atol=1e-08)

Devuelve si este operador es hermitiano.

Nota

Esta comprobación se lleva a equiv() cabo utilizando la normal_ordered() diferencia entre self y sus y adjoint() zero().

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({
...     (0, 1, 2, 3): 1.00001j,
...     (3, 2, 1, 0): -1j,
... })
>>> op.is_hermitian()
False
>>> op.is_hermitian(1e-4)
True

Parámetros

atol – La precisión numérica hasta la cual se considera que los coeficientes son iguales. Este valor se establece por defecto en 1e-8.

Devuelve

Si este operador es hermitiano.

iter_terms

iter_terms()

Un iterador sobre los términos del operador.

Aviso

La modificación de los elementos de la iteración no afecta a los datos del operador subyacente.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0, (0,): 1.0, (1,): -1.0j})
>>> list(sorted(op.iter_terms()))
[([], (2+0j)), ([0], (1+0j)), ([1], (-0-1j))]
iter_terms_with_groups

iter_terms_with_groups()

Un iterador sobre los términos del operador con su índice de grupo asociado.

Aviso

La modificación de los elementos de la iteración no afecta a los datos del operador subyacente.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator([2.0, 1.0, -1.0j], [0, 1], [0, 0, 1, 2])
>>> op.groups = [0, 1, 1]
>>> list(op.iter_terms_with_groups())
[([], (2+0j), 0), ([0], (1+0j), 1), ([1], (-0-1j), 1)]
max_rank

max_rank()

Devuelve el rango máximo de los términos de este operador.

Nota

La longitud del término más largo puede depender de la forma del operador, lo que significa que (por ejemplo) la simplificación del operador o el orden normal pueden dar lugar a un rango máximo diferente.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(0, 1, 2, 3): 1})
>>> op.max_rank()
4

Devuelve

El rango máximo de este operador.

normal_ordered

normal_ordered(ascending=False, reduce=True)

Devuelve un operador equivalente con términos ordenados normalmente.

El orden normal de un término de operador se define de tal manera que todas las acciones se ordenan lexicográficamente. Que suban o bajen depende del valor del parámetro ascending . De acuerdo con la convención establecida por gamma() para colocar « γ\gamma » ( γ\gamma' ) en índices pares (impares), esto da como resultado el siguiente ejemplo (para el valor predeterminado, ascending=False): [\gamma(1, True), \gamma(1, False), \gamma(0, True), \gamma(0, False)] = [3, 2, 1, 0].

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(gamma(0, False), gamma(0, True), gamma(0, False)): 1})
>>> print(format(op.normal_ordered(reduce=False)))
 -1.000000e0 +0.000000e0j * (γ'0 γ0 γ0)
>>> print(format(op.normal_ordered(reduce=True)))
 -1.000000e0 +0.000000e0j * (γ'0)

Parámetros

  • ascendente : si los índices deben ascender o descender.
  • reducir : si se debe reducir cada término a su forma mínima eliminando las acciones que se elevan al cuadrado y dan como resultado la identidad. Véase también el ejemplo anterior.

Devuelve

Un operador equivalente pero ordenado de forma normal.

num_groups

num_groups()

Devuelve el número de grupos.

Si es groups None, esta función también devuelve None. De lo contrario, devolverá el número de grupos, que se define como el índice del grupo más grande que aparece más 1 (que, por lo tanto, puede utilizarse como índice para el siguiente grupo).

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
...     [1.0, 2.0, -1.0, -2.0],
...     [0, 1, 2, 3, 1, 0, 3, 2],
...     [0, 2, 4, 6, 8],
... )
>>> op.groups = [0, 1, 0, 1]
>>> op.num_groups()
2

Devuelve

El índice del grupo más grande está en más groups 1.

one

classmethod one()

Crea el operador de identidad multiplicativa.

La combinación del operador creado mediante este método con otro no tiene ningún efecto.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0})
>>> one = MajoranaOperator.one()
>>> op & one == op
True
relabel_modes

relabel_modes(permutation)

Devuelve un nuevo operador con los modos renombrados.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({
...     (0, 1): 1,
...     (0, 1, 2, 3): 1,
... })
>>> permutation = [5, 6, 4, 3]
>>> relabeled = op.relabel_modes(permutation)
>>> print(format(relabeled))
  1.000000e0 +0.000000e0j * (γ'2 γ3)
  1.000000e0 +0.000000e0j * (γ'2 γ3 γ2 γ'1)

Parámetros

permutación : la lista de permutaciones de índices. El modo se i renombra como permutation[i], por lo que la lista no debe contener entradas duplicadas y debe tener la longitud suficiente para indexar todos los modos sobre los que actúa el operador (su longitud debe superar el índice de modo más alto del operador).

Devuelve

Un nuevo operador cuyos modos se han renombrado.

Subidas

ValueError – si permutation contiene entradas duplicadas o es demasiado corta para renombrar algún modo sobre el que actúa el operador.

simplify

simplify(atol=1e-08)

Devuelve un operador equivalente pero simplificado.

El proceso de simplificación suma primero todos los coeficientes que pertenecen a términos iguales y, a continuación, solo conserva aquellos cuyo coeficiente total supera la tolerancia especificada (al igual que ichop()).

Cuando un operador haya sido manipulado aritméticamente o construido de tal forma que no garantice la unicidad de los términos, se debe llamar a este método antes de aplicar cualquier método que filtre los coeficientes numéricamente pequeños, con el fin de evitar la pérdida de información. Observa el ejemplo siguiente, que muestra cómo se ichop() pueden truncar términos cuya suma da como resultado una magnitud total del coeficiente que no debería truncarse:

>>> from qiskit_fermions.operators import MajoranaOperator
>>> coeffs = [1e-5] * int(1e5)
>>> boundaries = [0] + [0] * int(1e5)
>>> op = MajoranaOperator(coeffs, [], boundaries)
>>> canon = op.simplify(1e-4)
>>> assert canon.equiv(op.one(), 1e-6)
>>> op.ichop(1e-4)
>>> assert op.equiv(op.zero(), 1e-6)

Parámetros

atol : la tolerancia absoluta para el umbral de corte. Este valor se establece por defecto en 1e-8.

Devuelve

Un operador equivalente, pero simplificado.

split_out_groups

split_out_groups(group_indices=None)

Divide este operador en una lista opcional de nuevos operadores basándose en groups.

Si es groups None, esta función también devuelve None. De lo contrario, si group_indices es None (valor por defecto), devuelve una lista con un nuevo operador por cada índice de grupo de groups, en orden de índice. Si group_indices se proporciona, solo se construyen los índices solicitados, en el orden indicado: esto evita el coste que supone construir operadores para grupos que nunca se utilizan, lo cual resulta especialmente beneficioso cuando solo se necesita un pequeño número de grupos de entre un total mucho mayor, por ejemplo, al realizar un submuestreo de grupos para una fórmula de producto aleatoria. Un índice duplicado en group_indices se devuelve una vez por cada aparición.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator(
...     [1.0, 2.0, -1.0, -2.0],
...     [0, 1, 2, 3, 1, 0, 3, 2],
...     [0, 2, 4, 6, 8],
... )
>>> print(op.split_out_groups())
None
>>> op.groups = [0, 1, 0, 1]
>>> groups = op.split_out_groups()
>>> for g in groups:
...     print(list(sorted(g.iter_terms())))
[([0, 1], (1+0j)), ([1, 0], (-1+0j))]
[([2, 3], (2+0j)), ([3, 2], (-2+0j))]
>>> groups = op.split_out_groups(group_indices=[1])
>>> for g in groups:
...     print(list(sorted(g.iter_terms())))
[([2, 3], (2+0j)), ([3, 2], (-2+0j))]

Parámetros

group_indices : los índices de grupo para los que se van a crear operadores, en el orden de salida deseado. Si no se especifica lo contrario, se crean todos los grupos, en orden de índice.

Devuelve

Un vector opcional que contiene un nuevo operador por cada índice de grupo solicitado.

zero

classmethod zero()

Crea el operador de identidad aditiva.

Añadir el operador creado mediante este método a otro no tiene ningún efecto.

>>> from qiskit_fermions.operators import MajoranaOperator
>>> op = MajoranaOperator.from_dict({(): 2.0})
>>> zero = MajoranaOperator.zero()
>>> op + zero == op
True

Métodos del protocolo

_anti_commutator_

static _anti_commutator_(op_a, op_b)

_commutator_

static _commutator_(op_a, op_b)

_double_commutator_

static _double_commutator_(op_a, op_b, op_c, sign)

_fermion_operator_

_fermion_operator_()

Convierte este operador en un FermionOperator.

Esto implementa el protocolo SupportsFermionOperator delegando en majorana_to_fermion().

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