Přeskočit na hlavní obsah

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 nn Qubitů je tato změna popsána 2n×2n2^n \times 2^n rozměrnou komplexní maticí UU, jejíž adjungovaná matice se rovná inverzní, tedy UU=1U^\dagger U = \mathbb{1}.

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.

poznámka

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")

Output of the previous code cell

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

Doporučení