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 biți (sau qubiți), de obicei vei eticheta fiecare bit . 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 este qubitul din partea de sus, iar qubitul 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 este bitul cel mai puțin semnificativ, iar
bitul este cel mai semnificativ. Acest lucru este util la programare, deoarece fiecare bit are
valoarea (eticheta fiind indexul qubitului în
QuantumCircuit.qubits). De exemplu, următorul Circuit se termină
cu bitul fiind 0 și bitul 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 este bitul din stânga, iar bitul este bitul din dreapta. Aceasta deoarece de obicei scriem numerele cu cifra cea mai semnificativă în stânga, iar în Qiskit, bitul 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 se află în starea , iar
qubitul în starea .
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 , în timp ce de obicei reprezintă bitul .
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 reprezintă starea bazei computaționale .
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 este controlul și qubitul 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 , deci are următoarea matrice.
Schimbarea ordonării în Qiskit
Pentru a desena un Circuit cu qubiții în ordine inversă (adică qubitul î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 .
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 .
Pași următori
- Vezi un exemplu de utilizare a Circuit-urilor în tutorialul Algoritmul lui Grover.
- Explorează referința QuantumCircuit API.