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):
La propiedad fundamental de que un fermión de Majorana sea su propia antipartícula resulta evidente de inmediato:
Esto da lugar a las siguientes relaciones de anticomutación para un es de fermiones de Majorana:
De este modo, la definición del operador completo queda así:
donde es el coeficiente (complejo) que constituye la combinación lineal de los productos de . El índice 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:
coeffs | Un vector de coeficientes complejos formado por dos números de coma flotante de 64 bits. |
modes | Un vector de enteros de 32 bits que almacena los índices de los modos de Majorana sobre los que se ha actuado. |
boundaries | Un 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: . Cuando se utiliza la función de conveniencia gamma(), se emplean índices pares (impares) para ( ).
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)
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)]
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
La composición de operadores se corresponde con la multiplicación por la izquierda: se c = a & b corresponde con « ». 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)
Por comodidad, la multiplicación por la derecha se implementa mediante c = a @ b (lo que da como resultado « »).
>>> (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.
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 y .
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.
Este método devuelve una copia de los datos internos.
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.
Este método devuelve una copia de los datos internos.
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.
Este método devuelve una copia de los datos internos.
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() .
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.
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.
¡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.
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.
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.
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.
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.
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 « » ( ) 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().