Sintetizar operaciones unitarias
Versiones de paquetes
El código de esta página fue desarrollado con los siguientes requisitos. Recomendamos usar estas versiones o más recientes.
qiskit[all]~=2.3.0
Una operación unitaria describe un cambio que preserva la norma en un sistema cuántico. Para qubits, este cambio está descrito por una matriz compleja de dimensión cuyo adjunto es igual a su inversa, es decir, .
Sintetizar operaciones unitarias específicas en un conjunto de puertas cuánticas es una tarea fundamental que se utiliza, por ejemplo, en el diseño y la aplicación de algoritmos cuánticos o en la compilación de circuitos cuánticos.
Si bien la síntesis eficiente es posible para ciertas clases de unitarias —como las compuestas por puertas de Clifford o las que tienen estructura de producto tensorial—, la mayoría de las unitarias no pertenecen a estas categorías. Para matrices unitarias generales, la síntesis es una tarea compleja cuyos costos computacionales crecen exponencialmente con el número de qubits. Por lo tanto, si conoces una descomposición eficiente para la unitaria que deseas implementar, probablemente será mejor que una síntesis general.
Si no hay ninguna descomposición disponible, el SDK de Qiskit te proporciona las herramientas para encontrar una. Sin embargo, ten en cuenta que esto generalmente produce circuitos profundos que pueden no ser adecuados para ejecutarse en computadoras cuánticas ruidosas.
# 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>
Re-síntesis para optimización de circuitos
A veces es beneficioso re-sintetizar una larga serie de puertas de uno y dos qubits si se puede reducir su longitud. Por ejemplo, el siguiente circuito utiliza tres puertas de dos qubits.
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")
Sin embargo, tras re-sintetizar con el siguiente código, solo necesita una única puerta CX. (Aquí usamos el método QuantumCircuit.decompose() para visualizar mejor las puertas utilizadas en la re-síntesis de la unitaria.)
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,-π) ├
└──────────────────┘└───┘└───────────────────┘
La función transpile de Qiskit realiza automáticamente esta re-síntesis para un nivel de optimización suficientemente alto.
Próximos pasos
- Consulta un ejemplo de descomposición de circuitos en el tutorial Algoritmo de Grover.
- Para más información sobre el transpilador de Qiskit, visita la sección de Transpilación.