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.3.0
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 šumivých kvantových počítačích.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
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 0x7fedb83e7a90>
Přesynté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 přesynté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 přesynté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: 6.2071
┌───────────────┐ ┌────────────────┐
q_0: ─┤ U(π/2,π/2,-π) ├────■────┤ U(π/2,-π,-π/2) ├─
┌┴───────────────┴─┐┌─┴─┐┌─┴────────────────┴┐
q_1: ┤ U(1.7229,π/2,-π) ├┤ X ├┤ U(π/2,0.15207,-π) ├
└─ ─────────────────┘└───┘└───────────────────┘
Qiskitova funkce transpile tuto přesynté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.