QubitSparsePauliList
class qiskit.quantum_info.QubitSparsePauliList(data, /, num_qubits=None)
Bases: object
Una lista de operadores Pauli sin fase almacenados en un formato de qubit disperso.
Representación
Cada operador de Pauli individual de la lista es un producto tensorial de operadores de Pauli de un solo qubit de la forma , para . La representación interna de a QubitSparsePauliList almacena sólo los operadores de Pauli de un solo qubit no idénticos. Esto hace que sea significativamente más eficiente representar listas de operadores Pauli con pesos bajos en un gran número de qubits. Por ejemplo, la lista de operadores :math`n`-qubit , donde representa El operador en el qubit e identidad en todos los demás, puede almacenarse en QubitSparsePauliList con una cantidad de memoria lineal en el número de qubits.
Indexación
QubitSparsePauliList se comporta como una secuencia Python (la forma estándar, no la expandida collections.abc.Sequence). Los elementos de la lista se pueden indexar por enteros, así como iterar a través de ellos. Ya sea mediante indexación o iteración, los elementos de la lista se devuelven como QubitSparsePauli instancias.
Construcción
QubitSparsePauliList define varios constructores. El constructor por defecto intentará delegar en uno de los constructores más específicos, basándose en el tipo de la entrada. Siempre puedes utilizar los constructores específicos para tener más control sobre la construcción.
Método | Resumen |
|---|---|
from_label() | Convertir una etiqueta de cadena densa en un elemento único QubitSparsePauliList. |
from_list() | Construir a partir de una lista de etiquetas de cadenas densas. |
from_sparse_list() | Elementos dados como una lista de tuplas de etiquetas de cadenas dispersas y los qubits a los que se aplican. |
from_pauli() | Convierte un elemento Pauli en un elemento simple QubitSparsePauliList. |
from_qubit_sparse_paulis() | Construir a partir de una lista de QubitSparsePaulis. |
__new__
__new__(data, /, num_qubits=None)
El constructor por defecto de QubitSparsePauliList.
Esto delega en uno de los métodos constructores de conversión explícitos, basándose en el tipo del argumento data . Si se suministra num_qubits y el constructor implicado por el tipo de data no acepta un número, el entero dado debe coincidir con la entrada.
Parámetros
- data - Tipo de datos de la entrada. Puede ser otro
QubitSparsePauliListen cuyo caso se copia la entrada, o puede ser una lista en un formato válido parafrom_list()ofrom_sparse_list(). - num_qubits (int|None) – Número opcional de qubits para la lista. Para la mayoría de las entradas de datos, esto se puede deducir y no es necesario pasarlo. Sólo es necesario para las listas vacías o el formato sparse-list. Si se da innecesariamente, debe coincidir con los datos introducidos.
Además de los constructores basados en la conversión, el método empty() puede utilizarse para construir una lista vacía de Paulis de qubits dispersos que actúen sobre un número determinado de qubits.
Conversiones
Un archivo existente QubitSparsePauliList puede convertirse a otros formatos.
Método | Resumen |
|---|---|
to_sparse_list() | Exprese el observable en formato de lista dispersa con elementos (paulis, indices). |
Atributos
num_qubits
Número de qubits sobre los que actúan los operadores de la lista.
Esto no puede deducirse de ninguna otra forma o valor, ya que las identidades no se almacenan explícitamente.
num_terms
El número de elementos de la lista.
Métodos
apply_layout
apply_layout(layout, num_qubits=None)
Aplique un diseño de transpilador a esta lista Pauli dispersa de qubits.
Esto permite reasignar los índices de los qubits, por ejemplo, si la lista se define en términos de etiquetas de qubits virtuales.
Parámetros
- layout (TranspileLayout |list[int] | None) – La disposición a aplicar. La mayoría de los usos de esta función deben pasar el
QuantumCircuit.layoutcampo de un circuito transpilado para hardware. Además, puede pasar una lista de nuevos índices de qubits. Si se da explícitamenteNone, no se aplica ninguna reasignación (pero aún se puede utilizarnum_qubitspara expandir los qubits de la lista). - num_qubits (int | None) – El número de qubits a los que expandir los elementos de la lista. Si no se proporciona, la salida será tan ancha como la entrada
TranspileLayouto la misma anchura que la entrada silayoutse proporciona de otra forma.
Devuelve
Un nuevo QubitSparsePauli con el diseño proporcionado aplicado.
clear
clear()
Borra todos los elementos de la lista, haciéndola de nuevo igual a la lista vacía.
Esto no modifica la capacidad de las asignaciones internas, por lo que es posible que las operaciones posteriores de suma o resta derivadas de la composición no requieran una reasignación.
Ejemplos
>>> pauli_list = QubitSparsePauliList.from_list(["IXXXYY", "ZZYZII"])
>>> pauli_list.clear()
>>> assert pauli_list == QubitSparsePauliList.empty(pauli_list.num_qubits)copy
copy()
Consigue una copia de esta lista de qubit sparse Pauli.
Ejemplos
>>> qubit_sparse_pauli_list = QubitSparsePauliList.from_list(["IXZXYYZZ", "ZXIXYYZZ"])
>>> assert qubit_sparse_pauli_list == qubit_sparse_pauli_list.copy()
>>> assert qubit_sparse_pauli_list is not qubit_sparse_pauli_list.copy()empty
static empty(num_qubits)
Obtiene la lista vacía para un número dado de qubits.
La lista vacía no contiene elementos, y es el elemento de identidad para unir dos QubitSparsePauliList instancias.
Ejemplos
Obtener la lista vacía en 100 qubits:
>>> QubitSparsePauliList.empty(100)
<QubitSparsePauliList with 0 elements on 100 qubits: []>from_label
static from_label(label, /)
Construye una lista con un solo término a partir de una etiqueta de cadena densa.
La etiqueta debe ser una secuencia del alfabeto 'IXYZ'. La etiqueta se interpreta de forma análoga a una cadena de bits. En otras palabras, la letra más a la derecha está asociada al qubit 0, y así sucesivamente. Esto es lo mismo que las etiquetas para Pauli y SparsePauliOp.
Parámetros
label (str) – la etiqueta densa.
Ejemplos
>>> QubitSparsePauliList.from_label("IIIIXZI")
<QubitSparsePauliList with 1 element on 7 qubits: [X_2 Z_1]>
>>> label = "IYXZI"
>>> pauli = Pauli(label)
>>> assert QubitSparsePauliList.from_label(label) == QubitSparsePauliList.from_pauli(pauli)Una generalización de este método que construye una lista a partir de múltiples etiquetas.
from_list
static from_list(iter, /, *, num_qubits=None)
Construir una lista Pauli de qubits dispersos a partir de una lista de etiquetas densas.
Esto es análogo a SparsePauliOp.from_list(). En este formulario denso, debe suministrar todas las identidades explícitamente en cada etiqueta.
La etiqueta debe ser una secuencia del alfabeto 'IXYZ'. La etiqueta se interpreta de forma análoga a una cadena de bits. En otras palabras, la letra más a la derecha está asociada al qubit 0, y así sucesivamente. Esto es lo mismo que las etiquetas para Pauli y SparsePauliOp.
Parámetros
- iter (list[str]) – Lista de etiquetas de cadenas densas.
- num_qubits (int | None) – No es necesario especificarlo si se está seguro de que
iterno es una secuencia vacía, ya que puede deducirse de las longitudes de las etiquetas. Siiterpuede estar vacío, debe especificar este argumento para desambiguar sobre cuántos qubits actúan los operadores. Si se indica yiterno está vacío, el valor debe coincidir con la longitud de las etiquetas.
Ejemplos
Construir una lista Pauli dispersa de qubits a partir de una lista de etiquetas:
>>> QubitSparsePauliList.from_list([
... "IIIXX",
... "IIYYI",
... "IXXII",
... "ZZIII",
... ])
<QubitSparsePauliList with 4 elements on 5 qubits:
[X_1 X_0, Y_2 Y_1, X_3 X_2, Z_4 Z_3]>Utilice num_qubits para desambiguar entradas potencialmente vacías:
>>> QubitSparsePauliList.from_list([], num_qubits=10)
<QubitSparsePauliList with 0 elements on 10 qubits: []>Este método es equivalente a las llamadas a from_sparse_list() con el campo explícito qubit-arguments establecido en enteros decrecientes:
>>> labels = ["XYXZ", "YYZZ", "XYXZ"]
>>> from_list = QubitSparsePauliList.from_list(labels)
>>> from_sparse_list = QubitSparsePauliList.from_sparse_list([
... (label, (3, 2, 1, 0))
... for label in labels
... ])
>>> assert from_list == from_sparse_listConstruye la lista a partir de etiquetas sin identidades explícitas, pero con los qubits a los que se aplica cada término de operador single-qubit enumerados explícitamente.
from_pauli
static from_pauli(pauli, /)
Construir un QubitSparsePauliList a partir de una única Pauli instancia.
La lista de salida tendrá un único término. Obsérvese que la fase se suprime.
Parámetros
pauli (Pauli) – el único Pauli para convertir.
Ejemplos
>>> label = "IYXZI"
>>> pauli = Pauli(label)
>>> QubitSparsePauliList.from_pauli(pauli)
<QubitSparsePauliList with 1 element on 5 qubits: [Y_3 X_2 Z_1]>
>>> assert QubitSparsePauliList.from_label(label) == QubitSparsePauliList.from_pauli(pauli)from_qubit_sparse_paulis
static from_qubit_sparse_paulis(obj, /, num_qubits=None)
Construir un QubitSparsePauliList a partir de instancias QubitSparsePauli individuales.
Todos los términos deben tener el mismo número de qubits. Si se proporciona, el argumento num_qubits debe coincidir con los términos.
Parámetros
- obj (Iterable[QubitSparsePauli]) – Iterable de términos individuales a partir de los cuales construir la lista.
- num_qubits (int | None) – El número de qubits sobre los que deben actuar los elementos de la lista. Normalmente se deduce de la entrada, pero puede indicarse explícitamente para manejar el caso de un iterable vacío.
Devuelve
La lista correspondiente.
from_sparse_list
static from_sparse_list(iter, /, num_qubits)
Construye una lista Pauli dispersa de qubits a partir de una lista de etiquetas y los qubits a los que se aplica cada elemento.
Esto es análogo a SparsePauliOp.from_sparse_list().
Los campos "labels" e "indices" de las tuplas se asocian comprimiéndolos. Por ejemplo, esto significa que una llamada a from_list() puede convertirse a la forma utilizada por este método estableciendo el campo "índices" de cada triple en (num_qubits-1, ..., 1, 0).
Parámetros
- iter (list[tuple[str, Sequence[int]]]) – tuplas de etiquetas y los qubits a los que se aplica cada término single-qubit.
- num_qubits (int) – el número de qubits sobre los que actúan los operadores de la lista.
Ejemplos
Construye una lista sencilla:
>>> QubitSparsePauliList.from_sparse_list(
... [("ZX", (1, 4)), ("YY", (0, 3))],
... num_qubits=5,
... )
<QubitSparsePauliList with 2 elements on 5 qubits: [X_4 Z_1, Y_3 Y_0]>Este método puede replicar el comportamiento de from_list()si el campo qubit-arguments de la tupla se establece en enteros decrecientes:
>>> labels = ["XYXZ", "YYZZ", "XYXZ"]
>>> from_list = QubitSparsePauliList.from_list(labels)
>>> from_sparse_list = QubitSparsePauliList.from_sparse_list([
... (label, (3, 2, 1, 0))
... for label in labels
... ])
>>> assert from_list == from_sparse_listEl reverso de este método.
to_dense_array
to_dense_array()
Expresa la lista en un formato de matriz densa.
Cada entrada es un u8 siguiendo la Pauli representación, mientras que las filas indexan distintos Paulis y las columnas distintos qubits.
Ejemplos
>>> paulis = QubitSparsePauliList.from_sparse_list(
... [("ZX", (1, 4)), ("YY", (0, 3)), ("XX", (0, 1))],
... num_qubits=5,
... )
>>> paulis.to_dense_array()to_pauli_list
to_pauli_list()
Devuelve a PauliList que representa la misma lista sin fases de Paulis.
to_sparse_list
to_sparse_list()
Expresa la lista en términos de un formato de lista dispersa.
Esto puede verse como una contraoperación de QubitSparsePauliList.from_sparse_list()sin embargo, no se garantiza que el orden de los términos sea el mismo después de un viaje de ida y vuelta a una lista dispersa.
Ejemplos
>>> qubit_sparse_list = QubitSparsePauliList.from_list(["IIXIZ", "IIZIX"])
>>> reconstructed = QubitSparsePauliList.from_sparse_list(qubit_sparse_list.to_sparse_list(), qubit_sparse_list.num_qubits)El constructor que puede interpretar estas listas.