Syntéza unitárních operací
Verze balíčků
Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme použít tyto verze nebo novější.
qiskit[all]~=2.5.2
Unitární operace popisuje změnu kvantového systému zachovávající normu. Pro Qubitů je tato změna popsána rozměrnou komplexní maticí , jejíž adjungovaná matice se rovná inverzní, tedy .
Syntéza konkrétních unitárních operací do sady kvantových Gate je základní úkol využívaný například při návrhu a aplikaci kvantových algoritmů nebo při kompilaci kvantových Circuit.
Zatímco pro určité třídy unitárních operací – jako jsou ty složené z Cliffordových Gate nebo mající strukturu tenzorového součinu – je efektivní syntéza možná, většina unitárních operací do těchto kategorií nespadá. Pro obecné unitární matice je syntéza složitý úkol, jehož výpočetní náklady rostou exponenciálně s počtem Qubitů. Proto pokud znáš efektivní rozklad pro unitární operaci, kterou chceš implementovat, bude pravděpodobně lepší než obecná syntéza.
Pokud žádný rozklad není k dispozici, Qiskit SDK ti poskytuje nástroje pro jeho nalezení. Vezmi však v úvahu, že to obecně generuje hluboké Circuit, které mohou být nevhodné pro spuštění na zašuměných kvantových počítačích.
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "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")
import numpy as np
from qiskit import QuantumCircuit
U = 0.5 * np.array(
[[1, 1, 1, 1], [-1, 1, -1, 1], [-1, -1, 1, 1], [-1, 1, 1, -1]]
)
circuit = QuantumCircuit(2)
circuit.unitary(U, circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet at 0x1058da0b0>
Opětovná syntéza pro optimalizaci Circuit
Někdy je výhodné znovu syntetizovat dlouhou sérii jednoQubitových a dvouQubitových Gate, pokud lze délku zkrátit. Například následující Circuit používá tři dvouQubitové Gate.
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qreg_q = QuantumRegister(2, "q")
creg_c = ClassicalRegister(4, "c")
circuit = QuantumCircuit(qreg_q, creg_c)
circuit.h(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.sx(qreg_q[1])
circuit.cz(qreg_q[0], qreg_q[1])
circuit.x(qreg_q[1])
circuit.x(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.h(qreg_q[0])
circuit.draw("mpl")
Po opětovné syntéze pomocí následujícího kódu však stačí jediná CX Gate. (Zde používáme metodu QuantumCircuit.decompose() pro lepší vizualizaci Gate použitých k opětovné syntéze unitární operace.)
from qiskit.quantum_info import Operator
# compute unitary matrix of circuit
U = Operator(circuit)
# re-synthesize
better_circuit = QuantumCircuit(2)
better_circuit.unitary(U, range(2))
better_circuit.decompose().draw()
global phase: 15π/8
┌───────────────┐ ┌────────────────┐
q_0: ┤ U(π/2,π/2,-π) ├───■──┤ U(π/2,-π,-π/2) ├
├───────────────┴┐┌─┴─┐├───────────────┬┘
q_1: ┤ U(3π/4,π/2,-π) ├┤ X ├┤ U(π/2,π/4,-π) ├─
└────────────────┘└───┘└───────────────┘
Qiskitova funkce transpile tuto opětovnou syntézu provádí automaticky při dostatečně vysoké úrovni optimalizace.
Další kroky
- Podívej se na příklad rozkladu Circuit v tutoriálu Groverův algoritmus.
- Více informací o Qiskit Transpileru najdeš v sekci Transpile.