Ř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.6.1
Pokud máš sadu bitů (nebo qubitů), každý bit obvykle označíš číslem . Různé programy a zdroje musí zvolit, jak tyto bity uspořádat jak v paměti počítače, tak při zobrazení na obrazovce.
Konvence Qiskitu
Takto Qiskit SDK řadí bity v různých situacích.
Primitiva
Qiskit ve výchozím nastavení dodržuje konvenci řazení bitů little-endian. Výchozí hodnota u BitArray je však big (endian), což způsobuje některé rozdíly ve výstupu primitiv podle toho, zda primitivum toto nastavení mění. Například primitiva Sampler a Estimator ve službě IBM® Quantum Compute Service vracejí výsledky v big-endian, zatímco Executor vrací výsledky v little-endian.
Kvantové obvody
Třída QuantumCircuit ukládá své qubity do seznamu
(QuantumCircuit.qubits). Index qubitu v tomto seznamu určuje
označení qubitu.
# 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>
Schémata Circuit
Ve schématu Circuit je qubit nejvýše a qubit 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 nejméně významným bitem a
bit nejvýznamnějším. To je užitečné při programování, protože každý bit má
hodnotu (label je index qubitu v
QuantumCircuit.qubits). Například následující spuštění obvodu končí
tak, že bit je 0 a bit je 1. To se interpretuje jako
desítkové celé číslo 2 (naměřené 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 zcela vlevo a bit zcela vpravo. Je to proto, že čísla zapisujeme obvykle s nejvýznamnější cifrou vlevo, a v Qiskitu je bit 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 ve stavu a
qubit ve stavu .
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 , zatímco obvykle představuje bit .
Matice Statevector
Při reprezentaci stavového vektoru jako seznamu komplexních čísel (amplitud) Qiskit řadí tyto amplitudy tak, že amplituda na indexu reprezentuje výpočetní bázový stav .
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 je řídící a qubit 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 , takže má následující matici.
Změna řazení v Qiskitu
Chceš-li nakreslit Circuit s qubity v obráceném pořadí (tj. qubit 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 .
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 .
Další kroky
- Podívej se na příklad použití Circuit v tutoriálu Groverův algoritmus.
- Prozkoumej referenci QuantumCircuit API.