Sari la conținutul principal

Ordonarea biților în SDK-ul Qiskit

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unora mai noi.

qiskit[all]~=2.3.0

Dacă ai un set de nn biți (sau qubiți), de obicei vei eticheta fiecare bit 0n10 \rightarrow n-1. Diferitele programe software și resurse trebuie să aleagă cum ordonează acești biți atât în memoria calculatorului, cât și atunci când sunt afișați pe ecran.

Convențiile Qiskit

Iată cum ordonează SDK-ul Qiskit biții în diferite scenarii.

Circuit-uri cuantice

Clasa QuantumCircuit își stochează qubiții într-o listă (QuantumCircuit.qubits). Indexul unui qubit în această listă definește eticheta qubitului.

# 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>

Diagrame de Circuit

Într-o diagramă de Circuit, qubitul 00 este qubitul din partea de sus, iar qubitul n1n-1 este cel din partea de jos. Poți schimba acest lucru cu argumentul reverse_bits al QuantumCircuit.draw (vezi Schimbarea ordonării în Qiskit).

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

Numere întregi

Când interpretăm biții ca un număr, bitul 00 este bitul cel mai puțin semnificativ, iar bitul n1n-1 este cel mai semnificativ. Acest lucru este util la programare, deoarece fiecare bit are valoarea 2label2^\text{label} (eticheta fiind indexul qubitului în QuantumCircuit.qubits). De exemplu, următorul Circuit se termină cu bitul 00 fiind 0 și bitul 11 fiind 1. Aceasta este interpretată ca numărul întreg zecimal 2 (măsurat cu probabilitatea 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}

Șiruri de caractere

Când afișăm sau interpretăm o listă de biți (sau qubiți) ca un șir de caractere, bitul n1n-1 este bitul din stânga, iar bitul 00 este bitul din dreapta. Aceasta deoarece de obicei scriem numerele cu cifra cea mai semnificativă în stânga, iar în Qiskit, bitul n1n-1 este interpretat ca bitul cel mai semnificativ.

De exemplu, următoarea celulă definește un Statevector dintr-un șir de stări cu un singur qubit. În acest caz, qubitul 00 se află în starea +|+\rangle, iar qubitul 11 în starea 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)}

Aceasta poate cauza confuzie uneori la interpretarea unui șir de biți, deoarece s-ar putea să te aștepți ca bitul din stânga să fie bitul 00, în timp ce de obicei reprezintă bitul n1n-1.

Matrice Statevector

Când se reprezintă un statevector ca o listă de numere complexe (amplitudini), Qiskit ordonează aceste amplitudini astfel încât amplitudinea de la indexul xx reprezintă starea bazei computaționale x|x\rangle.

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

Gate-uri

Fiecare Gate din Qiskit poate interpreta o listă de qubiți în felul său, dar Gate-urile controlate urmează de obicei convenția (control, target).

De exemplu, următoarea celulă adaugă un Gate controlled-X unde qubitul 00 este controlul și qubitul 11 este ținta.

from qiskit import QuantumCircuit

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

Urmând toate convențiile Qiskit menționate anterior, acest Gate CX efectuează transformarea 0111|01\rangle \leftrightarrow |11\rangle, deci are următoarea matrice.

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

Schimbarea ordonării în Qiskit

Pentru a desena un Circuit cu qubiții în ordine inversă (adică qubitul 00 în jos), folosește argumentul reverse_bits. Aceasta afectează doar diagrama generată și nu afectează Circuit-ul; Gate-ul X acționează în continuare pe qubitul 00.

from qiskit import QuantumCircuit

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

Poți folosi metoda reverse_bits pentru a returna un nou Circuit cu etichetele qubiților inversate (aceasta nu modifică Circuit-ul original).

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

Rețineți că în acest nou Circuit, Gate-ul X acționează pe qubitul 11.

Pași următori

Recomandări