Saltar al contenido principal

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 nn qubits, este cambio está descrito por una matriz compleja UU de dimensión 2n×2n2^n \times 2^n cuyo adjunto es igual a su inversa, es decir, UU=1U^\dagger U = \mathbb{1}.

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.

nota

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

Output of the previous code cell

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

Recomendaciones