Skip to main content
IBM Quantum Platform

TernaryTreeEncoding

class TernaryTreeEncoding(tree, mode_map=None)

Bases: object

Un árbol ternario representado mediante las imágenes de Pauli de sus operadores de Majorana.

La asociación de las «patas» del árbol con los operadores de Majorana y la construcción de sus cadenas de Pauli se realiza una sola vez, aquí, en lugar de hacerlo para cada operador mapeado. Pasa uno de estos a los mapeadores de árboles ternarios.

El emparejamiento sigue el Algoritmo 1 del artículo de Bonsai: [1] desde cada nodo, se desciende por su X enlace y, a continuación, por los enlaces Z hasta llegar a un tramo que transporta γ\gamma del modo de ese nodo; el Y enlace, del mismo modo, da γ′\gamma'. Esto es lo que constituye ∣0⋯0⟩|0\cdots0\rangle el vacío fermiónico, por lo que no se trata de una convención ajustable.

[ 1 ]

A Miller, Z., Zimborás, S., Knecht, S., Maniscalco y G. García-Pérez, «Algoritmo Bonsai: crea tus propias correspondencias entre fermiones y qubits», PRX Quantum 4, 030314 (2023), arXiv:2212.09731.


Uso

>>> from qiskit_fermions.mappers import TernaryTree, TernaryTreeEncoding
>>> enc = TernaryTreeEncoding(TernaryTree.breadth_first(4, 3))
>>> enc.num_modes, enc.max_weight
(4, 2)

Dos codificaciones se consideran iguales cuando asignan la misma cadena de Pauli a cada operador de Majorana, lo que permite que un conjunto o un diccionario elimine los duplicados. Omitir el mapa de modos equivale a dar la identidad, mientras que cualquier otro cambia el operador de Majorana al que pertenece cada cadena:

>>> tree = TernaryTree.chain(3, "Z")
>>> TernaryTreeEncoding(tree) == TernaryTreeEncoding(tree, [0, 1, 2])
True
>>> TernaryTreeEncoding(tree) == TernaryTreeEncoding(tree, [2, 1, 0])
False

La codificación se crea una sola vez y se reutiliza en todos los operadores asignados a través de ella, por lo que el emparejamiento y la construcción de la cadena no se repiten en cada llamada. El número de qubits de un operador mapeado se proporciona al mapeador, en lugar de fijarse aquí, por lo que una misma codificación sirve para registros de cualquier anchura a partir de esa num_modes .

Una codificación no se puede convertir a formato «pickled». Se trata de un artefacto derivado: al compilar se descartan el árbol y el mapa de modos a partir de los cuales se creó, por lo que admitir el formato «pickle» implicaría conservarlos únicamente con el fin de serializarlos. Selecciona el ( TernaryTree y el mapa de modos) y vuelve a compilar.


Atributos

max_weight

El mayor peso de Pauli de cualquier operador de Majorana individual.

Siempre es igual a la del TernaryTree.max_weight árbol a partir del cual se compiló: la rama que queda sin emparejar nunca está más profunda que la más profunda de las emparejadas.

num_modes

El número de modos fermiónicos que abarca esta codificación.


Métodos

majorana_image

majorana_image(majorana)

Devuelve la imagen de Pauli del operador de Majorana majorana, en forma de pares (qubit, label) .

El índice es 2 * mode + is_prime, lo que coincide con gamma(). La cadena está ordenada por qubit en orden ascendente.

>>> from qiskit_fermions.mappers import TernaryTree, TernaryTreeEncoding
>>> enc = TernaryTreeEncoding(TernaryTree.chain(3, "Z"))
>>> enc.majorana_image(4)
[(0, 'Z'), (1, 'Z'), (2, 'X')]

El coeficiente es siempre exactamente 11 : la cadena de un tramo es un producto de Paulis en qubits distintos, por lo que es hermitiana y se eleva al cuadrado de la identidad sin fase que corregir.

Parámetros

majorana – el índice de Majorana, 2 * mode + is_prime.

Subidas

  • ValueError : si no majorana es menor que 2 * num_modes.
  • OverflowError : si majorana es negativo o no cabe en 32 bits.

total_parity

total_parity(num_qubits)

Calcula el observable de paridad fermiónica total de esta codificación.

Las « 2N+12N+1 » ramas de un árbol se emparejan en operadores de Majorana 2N2N, dejando exactamente una sobrante, y esa que sobra es la paridad total ∏j(1−2nj)\prod_j (1 - 2 n_j).

Nota

Se trata de un parámetro observable que hay que medir, no de una restricción que haya que imponer. Sus dos valores propios son físicos, por lo que no proyectan ningún estado sobre el sector +1+1 : una codificación en árbol ternario consume un qubit por modo y constituye un isomorfismo unitario sobre todo el espacio de dimensión 2N2^N, con ambos sectores de paridad representados con multiplicidad 2N−12^{N-1} y sin ningún subespacio no físico que deba descartarse mediante proyección.

La cadena no es, en general, la cadena «all ZZ ». Es la rama a la que conduce la ruta ZZ, que lleva la identidad en todos los nodos que no se encuentran en dicha ruta. En la cadena de Jordan-Wigner, se trata de la cadena completa ZZ :

>>> from qiskit_fermions.mappers import TernaryTree, TernaryTreeEncoding
>>> TernaryTreeEncoding(TernaryTree.chain(4, "Z")).total_parity(4)
<SparseObservable with 1 term on 4 qubits: (1+0j)(Z_3 Z_2 Z_1 Z_0)>

En el árbol equilibrado con cuatro modos, no es así:

>>> TernaryTreeEncoding(TernaryTree.breadth_first(4, 3)).total_parity(4)
<SparseObservable with 1 term on 4 qubits: (1+0j)(Z_3 Z_0)>

Solo el soporte depende del árbol: el coeficiente es +1+1 en cada árbol y bajo cada mapa de modos.

Parámetros

num_qubits : el número de qubits del observable resultante. Debe ser, como mínimo, el número de modos de la codificación; si el valor es mayor, se rellena con el valor de identidad.

Devuelve

una sola cadena ZZ con coeficiente +1+1.

Tipo de retorno

El observable de paridad total

Subidas

  • ValueError : si num_qubits es inferior al recuento de modos de la codificación.
  • OverflowError : si num_qubits es negativo o no cabe en 32 bits.
¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.