Pular para o conteúdo principal
Este projeto está em fase beta. Encontrou um bug? Abra uma issue no GitHub. Tem uma pergunta ou ideia? Pergunte no Discussions — adoraríamos receber seu feedback!
Como está a qualidade da tradução nesta página?

Ordenação de bits no Qiskit SDK

Versões dos pacotes

O código nesta página foi desenvolvido usando os seguintes requisitos. Recomendamos usar essas versões ou mais recentes.

qiskit[all]~=2.5.2

Se você tem um conjunto de nn bits (ou qubits), normalmente vai rotular cada bit de 0→n−10 \rightarrow n-1. Diferentes softwares e recursos precisam escolher como ordenar esses bits tanto na memória do computador quanto quando exibidos na tela.

Convenções do Qiskit​

Veja como o Qiskit SDK ordena os bits em diferentes cenários.

Primitivas​

Por padrão, o Qiskit segue a convenção de ordenação de bits little-endian. No entanto, o padrão de BitArray é big (endian), o que causa algumas diferenças na saída das primitivas, dependendo de a primitiva alterar ou não essa configuração. Por exemplo, as primitivas Sampler e Estimator do IBM® Quantum Compute Service retornam resultados big-endian, mas o Executor retorna resultados little-endian.

Circuitos quânticos​

A classe QuantumCircuit armazena seus qubits em uma lista (QuantumCircuit.qubits). O índice de um qubit nessa lista define o rótulo do qubit.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Qubit

qc = QuantumCircuit(2)
qc.qubits[0] # qubit "0"

Qubit(QuantumRegister(2, "q"), 0)
<Qubit register=(2, "q"), index=0>

Diagramas de circuito​

Em um diagrama de circuito, o qubit 00 é o qubit mais ao topo e o qubit n−1n-1 é o mais abaixo. Você pode alterar isso com o argumento reverse_bits de QuantumCircuit.draw (veja Alterar a ordenação no Qiskit).

qc.x(1)
qc.draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

Inteiros​

Ao interpretar bits como um número, o bit 00 é o bit menos significativo e o bit n−1n-1 é o mais significativo. Isso é útil na programação porque cada bit tem o valor 2label2^\text{label} (label sendo o índice do qubit em QuantumCircuit.qubits). Por exemplo, a execução do circuito a seguir termina com o bit 00 sendo 0 e o bit 11 sendo 1. Isso é interpretado como o inteiro decimal 2 (medido com probabilidade 1.0).

from qiskit.primitives import StatevectorSampler as Sampler

qc.measure_all()

job = Sampler().run([qc])
result = job.result()
print(f" > Counts: {result[0].data.meas.get_counts()}")
> Counts: {'10': 1024}

Strings​

Ao exibir ou interpretar uma lista de bits (ou qubits) como uma string, o bit n−1n-1 é o bit mais à esquerda e o bit 00 é o mais à direita. Isso ocorre porque geralmente escrevemos números com o dígito mais significativo à esquerda e, no Qiskit, o bit n−1n-1 é interpretado como o bit mais significativo.

Por exemplo, a célula a seguir define um Statevector a partir de uma string de estados de qubit único. Nesse caso, o qubit 00 está no estado ∣+⟩|+\rangle e o qubit 11 no estado ∣0⟩|0\rangle.

from qiskit.quantum_info import Statevector

sv = Statevector.from_label("0+")
sv.probabilities_dict()
{np.str_('00'): np.float64(0.4999999999999999),
np.str_('01'): np.float64(0.4999999999999999)}

Isso às vezes gera confusão ao interpretar uma string de bits, pois você pode esperar que o bit mais à esquerda seja o bit 00, enquanto ele geralmente representa o bit n−1n-1.

Matrizes de vetor de estado​

Ao representar um vetor de estado como uma lista de números complexos (amplitudes), o Qiskit ordena essas amplitudes de modo que a amplitude no índice xx represente o estado da base computacional ∣x⟩|x\rangle.

print(sv[1]) # amplitude of state |01>
print(sv[2]) # amplitude of state |10>
(0.7071067811865475+0j)
0j

Gates​

Cada gate no Qiskit pode interpretar uma lista de qubits à sua própria maneira, mas gates controlados geralmente seguem a convenção (control, target).

Por exemplo, a célula a seguir adiciona um gate X controlado em que o qubit 00 é o controle e o qubit 11 é o alvo.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw()
q_0: ──■──
┌─┴─┐
q_1: ┤ X ├
└───┘

Seguindo todas as convenções mencionadas anteriormente no Qiskit, este gate CX realiza a transformação ∣01⟩↔∣11⟩|01\rangle \leftrightarrow |11\rangle, portanto tem a seguinte matriz.

(1000000100100100)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ \end{pmatrix}

Alterar a ordenação no Qiskit​

Para desenhar um circuito com qubits em ordem invertida (ou seja, qubit 00 na parte inferior), use o argumento reverse_bits. Isso afeta apenas o diagrama gerado e não o circuito em si; o gate X ainda age sobre o qubit 00.

from qiskit import QuantumCircuit

qc = QuantumCircuit(2)
qc.x(0)
qc.draw(reverse_bits=True)
q_1: ─────
┌───┐
q_0: ┤ X ├
└───┘

Você pode usar o método reverse_bits para retornar um novo circuito com os rótulos dos qubits invertidos (isso não modifica o circuito original).

qc.reverse_bits().draw()
q_0: ─────
┌───┐
q_1: ┤ X ├
└───┘

Observe que neste novo circuito, o gate X age sobre o qubit 11.

Próximos passos​

Recomendações