Přeskočit na hlavní obsah

Řazení bitů v Qiskit SDK

Verze balíčků

Kód na této stránce byl vyvinut s použitím níže uvedených závislostí. Doporučujeme použít tyto nebo novější verze.

qiskit[all]~=2.3.0

Pokud máš sadu nn bitů (nebo qubitů), každý bit obvykle označíš číslem 0n10 \rightarrow n-1. Různé softwary a zdroje musí zvolit, jak tyto bity uspořádat jak v paměti počítače, tak při zobrazení na obrazovce.

Konvence Qisku

Takto Qiskit SDK řadí bity v různých situacích.

Quantum circuits

Třída QuantumCircuit ukládá své qubity do seznamu (QuantumCircuit.qubits). Index qubitu v tomto seznamu určuje označení qubitu.

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

Schémata Circuit

Ve schématu Circuit je qubit 00 nejvýše a qubit n1n-1 nejníže. Toto chování lze změnit argumentem reverse_bits metody QuantumCircuit.draw (viz Změna řazení v Qiskitu).

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

Celá čísla

Při interpretaci bitů jako čísla je bit 00 nejméně významný a bit n1n-1 nejvýznamnější. To se při programování hodí, protože každý bit má hodnotu 2label2^\text{label} (label je index qubitu v QuantumCircuit.qubits). Například následující spuštění Circuit skončí tak, že bit 00 je 0 a bit $1je1. To se interpretuje jako desetinné celé číslo 2(naměřeno s pravděpodobností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}

Řetězce

Při zobrazení nebo interpretaci seznamu bitů (nebo qubitů) jako řetězce je bit n1n-1 zcela vlevo a bit 00 zcela vpravo. Je to proto, že čísla zapisujeme obvykle s nejvýznamnější cifrou vlevo, a v Qiskitu je bit n1n-1 považován za nejvýznamnější.

Například následující buňka definuje Statevector z řetězce stavů jednoho qubitu. V tomto případě je qubit 00 ve stavu +|+\rangle a qubit 11 ve stavu 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)}

To někdy způsobuje zmatek při interpretaci řetězce bitů, protože bys mohl(a) očekávat, že krajní levý bit je bit 00, zatímco obvykle představuje bit n1n-1.

Matice Statevector

Při reprezentaci stavového vektoru jako seznam komplexních čísel (amplitud) Qiskit řadí tyto amplitudy tak, že amplituda na indexu xx reprezentuje výpočetní bázový stav x|x\rangle.

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

Gates

Každý Gate v Qiskitu může interpretovat seznam qubitů po svém, ale řízené Gate obvykle dodržují konvenci (control, target).

Například následující buňka přidává řízený Gate X, kde qubit 00 je řídící a qubit 11 je cílový.

from qiskit import QuantumCircuit

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

Na základě všech výše zmíněných konvencí v Qiskitu provede tento CX-Gate transformaci 0111|01\rangle \leftrightarrow |11\rangle, takže má následující matici.

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

Změna řazení v Qiskitu

Chceš-li nakreslit Circuit s qubity v obráceném pořadí (tj. qubit 00 dole), použij argument reverse_bits. Toto ovlivní pouze vygenerované schéma a nijak nezmění samotný Circuit; Gate X stále působí na qubit 00.

from qiskit import QuantumCircuit

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

Metodou reverse_bits můžeš získat nový Circuit s obráceným označením qubitů (původní Circuit se nezmění).

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

Všimni si, že v tomto novém Circuit působí Gate X na qubit 11.

Další kroky

Doporučení