Sari la conținutul principal
Acest proiect este în versiune beta. Ai găsit o eroare? Deschide un issue pe GitHub. Ai o întrebare sau o idee? Întreabă în Discussions — ne-ar plăcea să aflăm părerea ta!
Cum este calitatea traducerii pe această pagină?

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

Dacă ai un set de nn biți (sau qubiți), de obicei vei eticheta fiecare bit 0→n−10 \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.

Primitive​

În mod implicit, Qiskit urmează convenția de ordonare a biților little-endian. Totuși, valoarea implicită pentru BitArray este big (endian), ceea ce provoacă unele diferențe în ieșirea primitivelor, în funcție de dacă primitiva modifică această setare. De exemplu, primitivele Sampler și Estimator din IBM® Quantum Compute Service returnează rezultate big-endian, dar Executor returnează rezultate little-endian.

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

Diagrame de circuit​

Într-o diagramă de circuit, qubitul 00 este qubitul din partea de sus, iar qubitul n−1n-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 n−1n-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, execuția următorului circuit se încheie cu bitul 00 egal cu 0 și bitul 11 egal cu 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 n−1n-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 n−1n-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)}

Acest lucru creează uneori confuzie 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 n−1n-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 poartă din Qiskit poate interpreta o listă de qubiți în felul său, dar porțile controlate urmează de obicei convenția (control, target).

De exemplu, următoarea celulă adaugă o poartă 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, această poartă CX efectuează transformarea ∣01⟩↔∣11⟩|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 partea de jos), folosește argumentul reverse_bits. Aceasta afectează doar diagrama generată și nu afectează circuitul; poarta 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 că în acest nou circuit, poarta X acționează pe qubitul 11.

Pași următori​

Recomandări