Pular para o conteúdo principal

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.3.0

Se você tem um conjunto de nn bits (ou qubits), normalmente vai rotular cada bit de 0n10 \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.

Circuits 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 — required packages for this notebook
!pip install -q qiskit
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 n1n-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 n1n-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 n1n-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 n1n-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 n1n-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 controlled-X onde 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 0111|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 Circuit 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