Skip to main content
IBM Quantum Platform

Empieza a utilizar Qiskit en el aula

Para este módulo de Qiskit en las aulas, los estudiantes deben tener un entorno Python en funcionamiento con los siguientes paquetes instalados:

  • qiskit v2.1.0 o más reciente
  • qiskit-ibm-runtime v0.40.1 o más reciente
  • qiskit-aer v0.17.0 o más reciente
  • qiskit.visualization
  • numpy
  • pylatexenc

Para configurar e instalar los paquetes anteriores, consulta la guía Instalar Qiskit. Para ejecutar trabajos en ordenadores cuánticos reales, los estudiantes deberán crear una cuenta en IBM Quantum® siguiendo los pasos de la guía Configure su cuenta en IBM Cloud®.

Este módulo fue probado y utilizó 2 segundos de tiempo QPU en un procesador Heron v2. Esto es sólo una estimación. Su uso real puede variar.

# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

Introducción

En los módulos de Qiskit en el aula, tendrás la oportunidad de utilizar un ordenador cuántico para explorar diversos conceptos de campos afines a la informática cuántica, como la mecánica cuántica, la informática, la química, etc. Este módulo sirve como prerrequisito para los demás: introduce los fundamentos de la computación cuántica y cómo utilizar Qiskit para ejecutar circuitos cuánticos.

Primero le explicaremos brevemente cómo funciona un ordenador clásico y después le mostraremos cómo se adaptan estos conceptos al paradigma de la computación cuántica. Por último, te mostraremos cómo unir estos conceptos para construir y ejecutar tu primer circuito cuántico.


Ordenadores clásicos

Es probable que conozca los fundamentos del funcionamiento de los ordenadores clásicos, pero aquí destacaremos algunas de las características clave para poder establecer una comparación con los ordenadores cuánticos.

Las unidades básicas de información: bits

Los ordenadores clásicos procesan información clásica, y la unidad fundamental de la información clásica es el bit. Un solo bit puede almacenar la respuesta a una pregunta "sí/no". Solemos representar los dos estados binarios de un bit como "0" y "1".

Revisión de números binarios

Combinar bits permite almacenar más información. Por ejemplo, si quieres almacenar un número del 0 al 15, podrías hacerlo con cuatro bits de la siguiente manera:

0 = 00004 = 01008 = 100012 = 1100
1 = 00015 = 01019 = 100113 = 1101
2 = 00106 = 011010 = 101014 = 1110
3 = 00117 = 011111 = 101115 = 1111

En general, para pasar de un número binario de NN bits a un número familiar, base-10, se multiplica el bit menos significativo (más a la derecha) por 20=12^0 = 1, el siguiente bit a la izquierda por 21=22^1 = 2, luego el siguiente por 22=42^2 = 4, y así sucesivamente, hasta llegar al más significativo (bit más a la izquierda), que se multiplica 2N12^{N-1}.

Esto significa que NN bits pueden estar en uno de los 2N2^N estados posibles.

Comprueba tu comprensión

¿Cuántos bits necesitarías para representar el número 86? Escribe la cadena de bits que codifica este número en binario.

  • Recuerde que NN bits le permite representar los números 00 a 2N12^N - 1, por lo que utilizando seis bits llegaríamos hasta 261=632^6 - 1 = 63. Eso no es suficiente. Añadimos un bit más para llegar a 271=1272^7 - 1 = 127. Ahora descompongamos 86 en potencias de 2:

    86=64+16+4+2=26×1+25×0+24×1+23×0+22×1+21×1+20×0=1010110\begin{aligned} 86 &= 64 + 16 + 4 + 2 \\ &= 2^6 \times 1 + 2^5 \times 0 + 2^4 \times 1 + 2^3 \times 0 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 0 \\ &= 1010110 \end{aligned}

Operaciones fundamentales: puertas

Ahora bien, un ordenador necesita poder hacer algo con los bits para, bueno, computar. Las puertas binarias son las operaciones que forman los bloques de construcción fundamentales de todos los algoritmos y códigos más complicados.

Puerta de un solo bit:

NO

Cuando sólo tienes un bit, sólo hay una forma de transformar su estado: cambiar el estado de 0 a 1 o de 1 a 0. A esto lo llamamos la puerta "NO". El efecto de esta puerta -y del resto de puertas que veremos a continuación- puede representarse en una "tabla de verdad", con columnas para los estados de entrada y salida de los qubits. La tabla de verdad de la puerta NOT es:

Entrada
Resultado
01
10

Puertas multibit:

Y

AND es una puerta de dos bits que toma dos bits de entrada y emite un único bit. La salida es 1 si los dos bits de entrada son 1 y 0 en caso contrario:

Entrada
Resultado
000
010
100
51

O

OR es otra puerta de dos bits con un único bit de salida. Sale 1 si cualquiera de los bits es 1:

Entrada
Resultado
000
011
101
51

XO

XOR significa "OR exclusivo" y es como la puerta OR, pero da como resultado 1 si sólo uno de los bits de entrada es 1. La salida es 0 si ambos son 1 o ambos son 0:

Entrada
Resultado
000
011
101
50

Medidas:

Normalmente, cuando se aprende informática clásica, no se presta mucha atención al proceso de lectura del estado de los bits. Esto se debe a que no es muy complejo desde una perspectiva conceptual. Puedes medir los bits en cualquier momento antes, durante o después de un cálculo, y no afecta al resultado. Este no es el caso de la computación cuántica, como veremos a continuación.

Circuitos:

Combinando las puertas anteriores, puedes hacer cualquier tipo de operación que quieras en un ordenador. Veamos un ejemplo sencillo: Utilizando las puertas AND y XOR, puedes construir el circuito de media escalera, que calcula la suma de dos bits. Esto se representa en un diagrama de circuito lógico, donde los hilos representan los bits y las puertas que operan sobre los bits se muestran como símbolos en los hilos correspondientes:

Esquema clásico del circuito de media escalera. Una puerta XOR genera el bit de salida Sum y una puerta AND genera el bit de salida Carry.

Así, los dos bits se copian y pasan por una puerta AND y una puerta XOR. El resultado de la puerta XOR es el "bit de suma" (S), que permanece en el lugar de los unos del número binario, y el resultado de la puerta AND es el "bit de acarreo" (C), que es el valor del siguiente dígito más significativo del número binario. Aquí está la tabla de verdad:

AA
BB
Suma ( ABA \oplus B )
Carry ( ABA \wedge B )
0000
0110
1010
1101

Comprueba tu comprensión

Comprueba que la tabla de verdad anterior da la solución correcta para un circuito sumador. Es decir, para cada una de las cuatro opciones de A y B, verifica que A+B=S+2×CA+B=S+2 \times C.

  • 0+0=0+0=0 0+1=1+0=1 1+0=1+0=1 1+1=0+2=2 \begin{aligned} 0+0 &= 0+0 = 0 ~\checkmark \\ 0+1 &= 1+0 = 1 ~\checkmark \\ 1+0 &= 1+0 = 1 ~\checkmark \\ 1+1 &= 0+2 = 2 ~\checkmark \\ \end{aligned}

Ordenadores cuánticos

Bits \rightarrow qubits

Al igual que los bits son las unidades fundamentales de la información clásica, los bits cuánticos, o "qubits", son las unidades fundamentales de la información cuántica. Al igual que el bit clásico, el estado de un qubit puede ser 0 o 1, que normalmente denotamos como 0\vert 0\rangle y 1\vert 1\rangle. Pero a diferencia del bit clásico, un bit cuántico también puede estar en una superposición de los estados 0\vert 0\rangle y 1\vert 1\rangle al mismo tiempo. En general, un qubit puede estar en cualquier estado ψ\vert \psi\rangle de la forma:

ψ=c00+c11\vert \psi\rangle = c_0 \vert 0\rangle + c_1 \vert 1\rangle

donde c0c_0 y c1c_1 son amplitudes complejas con c02+c12=1\vert c_0 \vert ^2+\vert c_1\vert ^2=1.

La fase cuántica

Dado que c0c_0 y c1c_1 son complejos, cada uno de ellos puede escribirse como ci=cieiϕic_i = \vert c_i\vert e^{i\phi_i}, donde ϕi\phi_i se denomina fase. Si multiplicamos todo el estado por el mismo factor de fase global, nada cambia físicamente: es lo que se denomina fase global, y no tiene consecuencias observables.

Por esta razón, es convencional "factorizar" eiϕ0e^{i\phi_0}, dando:

ψ=c00+c1eiϕ1\vert \psi\rangle = \vert c_0\vert \vert 0\rangle + \vert c_1\vert e^{i\phi}\vert 1\rangle

donde ϕ=ϕ1ϕ0\phi = \phi_1-\phi_0 es la fase relativa del estado cuántico, que tiene consecuencias observables.

Esta fase desempeña un papel muy importante en la computación cuántica, y explorarás sus diversas consecuencias en los siguientes módulos de Qiskit en el Aula.

Múltiples qubits

Mientras que el estado de múltiples bits podría expresarse simplemente como una cadena de 0s y 1s, el estado de múltiples qubits se complica un poco más debido a los principios de superposición y entrelazamiento.

Recordemos que los bits de NN pueden estar en uno de los 2N2^N posibles estados que van desde los números binarios 000...000 a 111...111. Pero ahora, gracias al principio de superposición, los qubits de NN pueden estar en superposición de todos estos estados a la vez

Esto puede expresarse como

ψN=i=02N1cii\psi_N = \sum_{i=0}^{2^N-1} c_i \vert i\rangle

donde, como en el caso clásico, el estado i\vert i\rangle corresponde al estado en el que cada qubit se encuentra en la combinación correcta de 0s y 1s para producir el número binario ii. Son los llamados "estados base computacionales" del sistema cuántico. Por ejemplo, un estado de tres qubits puede escribirse como una superposición de sus ocho estados base computacionales:

ψ3=c0000+c1001+c2010+c3011+c4100+c5101+c6110+c7111\psi_3 = c_0 \vert 000\rangle + c_1 \vert 001\rangle + c_2 \vert 010\rangle + c_3 \vert 011\rangle + c_4 \vert 100\rangle + c_5 \vert 101\rangle + c_6 \vert 110\rangle + c_7 \vert 111\rangle

Cada qubit del sistema se denota con un índice que va de 00 a N1N-1. La convención es leer los estados de los qubits de derecha a izquierda, de modo que el estado del qubit 00 es el más a la derecha y el estado del qubit N1N-1 es el más a la izquierda. Esto se conoce como notación "little-endian", y puede parecer contraintuitivo al principio, ya que estamos acostumbrados a leer de izquierda a derecha.

Comprueba tu comprensión

A primera vista, puede parecer contradictorio ordenar los qubits de derecha a izquierda, como en la notación little-endian, pero en realidad es algo muy lógico Explique por qué. (Recuerde nuestra discusión anterior sobre la conversión de números binarios a base-10 )

  • Si ordenamos los qubits de derecha a izquierda, de forma que el qubit 0 sea el más a la derecha y el qubit N-1 el más a la izquierda, es lógico asociar el qubit 00 con el bit menos significativo, que se multiplica por 202^0 y el qubit N1N-1 con el bit más significativo, que se multiplica por 2N12^{N-1}.

Entrelazamiento

Como ya hemos dicho, otra característica clave de los qubits es que pueden entrelazarse entre sí. Tomemos un ejemplo de un estado de dos qubits, donde c0=c3=12c_0 = c_3 = \frac{1}{\sqrt{2}} y c1=c2=0c_1 = c_2 = 0 :

ψ=12(00+11)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 00\rangle + \vert 11\rangle)

Así, el estado del qubit 0 puede ser 0\vert 0\rangle o 1\vert 1\rangle con igual probabilidad, y lo mismo con el estado del qubit 1. Pero estas probabilidades ya no son independientes entre sí. Si encontramos que el estado del qubit 0 es 0\vert 0\rangle, entonces sabemos que el qubit 1 también estará en 0\vert 0\rangle. Esto es cierto sin importar la distancia entre uno y otro, por lo que el acto de medir un estado enredado se denomina a veces "espeluznante acción a distancia"

El enredo también puede adoptar otras formas. Por ejemplo, el Estado

ψ=12(01+10)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 01\rangle + \vert 10\rangle)

produce resultados opuestos cada vez: si se mide un qubit 0\vert 0\rangle, se garantiza que el otro se encuentra en el estado 1\vert 1\rangle.

Comprueba tu comprensión

¿Está el estado ψ=11\vert \psi\rangle = \vert 11\rangle enredado? ¿Por qué sí o por qué no?

  • No está enredado. Aunque los resultados son siempre los mismos cuando se miden ambos qubits, esto se debe únicamente a que cada qubit está siempre fijo en el estado 1\vert 1\rangle. En realidad, el resultado de la medición de un qubit no depende del otro, sino que ambos están siempre en 1\vert 1\rangle.

    En general, si se puede describir el estado de cada qubit por separado y luego multiplicarlos juntos así:

    ψ=ψ1ψ0\vert \psi\rangle = \vert \psi_1\rangle \vert \psi_0\rangle

    Entonces se conoce como "estado producto" y no está enredado.

Notación vectorial

A menudo resulta útil utilizar vectores y matrices para ver cómo se transforma el estado cuántico bajo diferentes operaciones. En esta representación, nuestros estados cuánticos serán vectores, y nuestras puertas cuánticas (de las que hablaremos en la siguiente sección) serán matrices que transforman los vectores.

Para un único qubit, se elige la forma vectorial de los estados: 0=(10)\vert 0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)\vert 1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix} De este modo, un estado arbitrario ψ=a0+b1\vert \psi\rangle = a\vert 0\rangle+b\vert 1\rangle puede escribirse como ψ=(ab)\vert \psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

Para un estado general, nn -qubit, necesitaremos un vector 2n2^n -dimensional, con estados base ordenados como es de esperar, en valor binario ascendente:

0000=(1000),0001=1110=(0010),1111=(0001)\vert 0 \dots 000\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ \vdots \\ 0\end{pmatrix}, \vert 0 \dots 001 \rangle = \vert 1 \dots 110\rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 1 \dots 111 \rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 0\\ 1\end{pmatrix}

Con esta elección de notación vectorial en mente, podemos introducir nuestras puertas cuánticas necesarias, sus efectos sobre los estados cuánticos y sus formas matriciales.

Comprueba tu comprensión

Existen cuatro estados base computacionales para un sistema de dos qubits. Escribe cada una de ellas en notaciones ket y vectoriales.

  • 00=(1000),01=(0100),,10=(0010),11=(0001)\vert 00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix}, \vert 01 \rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, \dots, \vert 10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 11 \rangle = \begin{pmatrix}0 \\ 0 \\ 0\\ 1\end{pmatrix}

Puertas cuánticas « \rightarrow »

Al igual que las puertas clásicas como NOT, AND, OR y XOR pueden combinarse para construir circuitos clásicos arbitrarios, las puertas cuánticas desempeñan el mismo papel en la computación cuántica. Como los qubits tienen características mecánicas cuánticas adicionales, las puertas cuánticas son correspondientemente más ricas. Aunque todavía podemos describir su acción sobre la base de los estados 0|0\rangle y 1|1\rangle con una tabla de verdad, esto no captura toda la imagen. Para las puertas cuánticas, suele ser más natural utilizar una representación matricial, ya que también actúan sobre superposiciones de estados base.

A continuación presentaremos las puertas cuánticas más comunes y cómo transforman los qubits con los que interactúan. Cuando proceda, las relacionaremos con las puertas clásicas conocidas.

Puertas de un solo qubit

XX puerta : Es el equivalente cuántico de una operación NOT. Su tabla de verdad es idéntica a la de la puerta NOT clásica:

Entrada
Resultado
0\vert 0\rangle1\vert 1\rangle
1\vert 1\rangle0\vert 0\rangle

Y la representación matricial:

X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

En Qiskit, crear un circuito con una puerta XX tiene este aspecto:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output:

Output of the previous code cell

En este diagrama de circuito tan sencillo, el qubit está representado por un cable, la línea horizontal negra, y la puerta aparece como un recuadro en ese cable.

Puerta de Hadamard: Crea un estado de superposición. Tabla de verdad:

Entrada
Resultado
0\vert 0\rangle12(0+1)\frac{1}{\sqrt{2}}\left(\vert 0\rangle+\vert 1\rangle\right)
1\vert 1\rangle12(01)\frac{1}{\sqrt{2}}\left(\vert 0\rangle-\vert 1\rangle\right)

Representación matricial: H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

Un circuito con una puerta Hadamard se realiza de la siguiente manera:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output:

Output of the previous code cell

ZZ puerta : Añade un desfase de Δϕ=π\Delta \phi = \pi al estado 1|1\rangle :

Entrada
Resultado
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangle1-\vert 1\rangle

Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

En Qiskit, crear un circuito con una puerta ZZ tiene este aspecto:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output:

Output of the previous code cell

TT puerta : Añade un desfase de Δϕ=π/4\Delta \phi = \pi/4 al estado 1|1\rangle :

Entrada
Resultado
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangleeiπ/41e^{i\pi/4}\vert 1\rangle

T=(100eiπ/4)T=\begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}

En Qiskit, crear un circuito con una puerta TT tiene este aspecto:

qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")

Output:

Output of the previous code cell

Puertas multi-qubit

Las puertas de dos qubits pueden parecerse a las puertas clásicas de dos bits, pero con una salvedad importante: todas las puertas cuánticas deben ser reversibles. En términos de álgebra lineal, esto significa que se representan mediante matrices unitarias. Así, dos qubits de entrada siempre se corresponden con dos qubits de salida, y la operación puede, en principio, deshacerse. Esto contrasta con las puertas clásicas que hemos visto antes, como AND u OR, que pierden información y son irreversibles: dada una salida, no se puede determinar de forma única la entrada.

Puerta CNOT (Controlled-NOT): Los dos qubits de entrada se denominan qubits "control" y "objetivo". El qubit de control permanece inalterado, pero su estado dicta lo que ocurre con el qubit objetivo. Si el qubit de control está en el estado 1\vert 1\rangle, entonces se aplica una puerta XX a ese objetivo; si el estado del qubit de control es 0\vert 0\rangle, entonces no se realiza ningún cambio. En la notación siguiente, supongamos que el qubit AA (el qubit situado más a la derecha) es el control, y el qubit BB (el qubit situado más a la izquierda) es el objetivo. A continuación, la notación utilizada es CNOT(qcontrol,qtarget)BA.CNOT(q_{control},q_{target})\vert BA\rangle.

CNOT(A,B)BAinput=BAoutputCNOT(A,B)\vert BA\rangle_{input} = \vert BA\rangle_{output}

Entrada
Resultado
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle11\vert 11\rangle
10\vert 10\rangle10\vert 10\rangle
11\vert 11\rangle01\vert 01\rangle

Así, la matriz que representa esta acción es:

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output:

Output of the previous code cell

Este es el primer diagrama de circuito que vemos con dos qubits, que están representados por los dos cables. La puerta CNOT se implementa entre los dos qubits, con q0q_0 como control y q1q_1 como objetivo.

Comprueba tu comprensión

La mayoría de las puertas tienen la misma forma de matriz en Qiskit que en cualquier otro sitio. Pero la puerta CNOT actúa sobre dos qubits, por lo que de repente las convenciones de ordenación de los qubits se convierten en un problema. Los textos que ordenan qubits q0,q1,...\vert q_0,q_1,...\rangle mostrarán una forma de matriz diferente para sus puertas CNOT. Verificar por multiplicación explícita de matrices que la matriz CNOT anterior tiene la acción correcta sobre el estado 01.\vert 01\rangle.

  • CNOT01=(1000000100100100)(0100)=(0001)=11CNOT\vert 01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = \vert 11\rangle

Puerta SWAP: Esta puerta intercambia los estados de dos qubits. Tabla de verdad:

Entrada
Resultado
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle10\vert 10\rangle
10\vert 10\rangle01\vert 01\rangle
11\vert 11\rangle11\vert 11\rangle

Así, la matriz que representa esta acción es:

SWAP=(1000001001000001)SWAP=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix}

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")

Output:

Output of the previous code cell

En realidad, la puerta SWAP puede construirse a partir de tres CNOT. Para ver cómo, podemos decompose() la puerta con Qiskit:

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")

Output:

Output of the previous code cell

Aquí vemos por primera vez cómo se muestran múltiples puertas en un diagrama de circuito. Lo leemos de izquierda a derecha, por lo que la puerta situada más a la izquierda se aplica primero.

Comprueba tu comprensión

Compruebe que la combinación de CNOTs anterior da como resultado una puerta SWAP. Puedes hacerlo con la multiplicación de matrices o con cualquier otro método.

  • Con multiplicación de matrices:

    (1000000100100100)(1000010000010010)(1000000100100100)=(1000001001000001)=SWAP \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix} = SWAP ~\checkmark

    Utilizar una tabla de verdad para ver cómo cambian los estados con cada CNOT. En la última columna, los estados deben ser equivalentes a la columna "salida" de la tabla verdadero-falso SWAP:

    Entrada
    CNOT(A,B)
    CNOT(B,A)
    CNOT(A,B)
    00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle \checkmark
    01\vert 01\rangle11\vert 11\rangle10\vert 10\rangle10\vert 10\rangle \checkmark
    10\vert 10\rangle10\vert 10\rangle11\vert 11\rangle01\vert 01\rangle \checkmark
    11\vert 11\rangle01\vert 01\rangle01\vert 01\rangle11\vert 11\rangle \checkmark

Puerta de Toffoli (o "controlada-controlada-NOT" (CCNOT)): Se trata de una puerta de tres qubits. Puede que el nombre "controlado-controlado-NOT" ya le indique cómo funciona: hay dos qubits de control y un qubit objetivo, y el estado del qubit objetivo se invierte sólo si ambos qubits de control están en el estado 1\vert 1\rangle. Mantenemos la convención de ordenación que utilizamos con el CNOT:

CCNOT(ControlA,ControlB,TargetC)CBACCNOT(Control A, Control B, Target C)\vert CBA\rangle

Así que la tabla de verdad es:

Entrada
Resultado
000\vert 000\rangle000\vert 000\rangle
001\vert 001\rangle001\vert 001\rangle
010\vert 010\rangle010\vert 010\rangle
011\vert 011\rangle111\vert 111\rangle
100\vert 100\rangle100\vert 100\rangle
101\vert 101\rangle101\vert 101\rangle
110\vert 110\rangle110\vert 110\rangle
111\vert 111\rangle011\vert 011\rangle

Y la matriz que representa esta acción es:

CCNOT=(1000000001000000001000000000000100001000000001000000001000010000)CCNOT=\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\end{pmatrix}
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")

Output:

Output of the previous code cell

La puerta de Toffoli también puede descomponerse en CNOT, junto con otras puertas. Sin embargo, es significativamente más complicada que la descomposición de la puerta SWAP, por lo que se dejará como ejercicio opcional al final del módulo explorar y verificar esta descomposición.


Mediciones

Las mediciones desempeñan un papel especial en la computación cuántica, que no tiene análogo en la computación clásica. Mientras que en la computación clásica se pueden comprobar los bits en cualquier momento del algoritmo, en la computación cuántica hay que ser muy selectivo a la hora de mirar los qubits, ya que la medición colapsa su estado y destruye la superposición que confiere a los qubits su complejidad computacional.

En particular, dado un estado cuántico de NN -bit ψ=i=02N1cii\vert \psi\rangle = \sum_{i=0}^{2^N-1} c_i \vert i\rangle, una medición colapsará el estado a una de las funciones base i\vert i\rangle con una probabilidad igual a ci2\vert c_i\vert ^2.

Pero este efecto destructivo de una medida no siempre es un obstáculo. De hecho, es un recurso clave en determinados algoritmos y protocolos, como la teletransportación cuántica y la distribución cuántica de claves.

En Qiskit, cuando se realiza una medición, se envía a un registro clásico donde se almacena como un bit clásico. La creación de un circuito con una medida tiene este aspecto:

qc = QuantumCircuit(
    1, 1
)  # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")

Output:

Output of the previous code cell

Circuitos

Ahora que ya sabemos cómo funcionan los qubits, las puertas y las mediciones, ¡vamos a crear y ejecutar nuestro propio circuito cuántico! Para ello, tendremos que presentarte un útil flujo de trabajo llamado patrones Qiskit.

Marco de patrones Qiskit

El marco de patrones Qiskit es un procedimiento general para abordar y resolver problemas con un ordenador cuántico. Consta de cuatro pasos:

  1. Mapeando nuestro problema a circuitos y operadores cuánticos
  2. Optimización del circuito para el hardware de destino
  3. Ejecución en el hardware de destino
  4. Tratamiento posterior de los resultados

Para ilustrar estos pasos, implementaremos una versión cuántica del circuito de media escalera comentado anteriormente.

1. Cartografía

El circuito sumador clásico utiliza una puerta XOR y una puerta AND para calcular los bits de suma y acarreo, respectivamente. Podemos adaptar estas puertas al contexto cuántico para hacer el sumador medio cuántico. En primer lugar, recordando que las puertas cuánticas son reversibles, no podemos simplemente sobrescribir las entradas. En su lugar, introducimos dos qubits auxiliares inicializados en 0\vert 0\rangle para almacenar las salidas de suma y acarreo. Así, nuestro estado cuántico completo estará formado por los qubits AA y BB, y los qubits suma y acarreo, que etiquetaremos SS y CC :

ψ=CSBA\vert \psi\rangle = \vert C S B A\rangle

Ahora necesitamos puertas cuánticas que hagan lo mismo que las puertas XOR y AND en el circuito clásico.

SUMA:

Para el XOR, aplicamos dos CNOTs, cada uno con qubits de control AA y BB y qubit objetivo SS para ambos. Si AA y BB son diferentes, una de las puertas CNOT cambiará SS al estado 1\vert 1\rangle. Si AA y BB son ambos 0\vert 0\rangle, entonces no le pasa nada a SS y permanece en el estado 0\vert 0\rangle. Si AA y BB son ambos 1\vert 1\rangle, entonces el estado de SS cambiará dos veces, devolviéndolo al estado 0\vert 0\rangle.

Llevar:

Para el bit de acarreo, necesitamos algo que funcione como la clásica puerta AND.

Comprueba tu comprensión

Repasa las puertas de las que hemos hablado para ver si adivinas qué puerta cuántica utilizaremos en lugar de la puerta AND clásica:

  • ¡Es la puerta Toffoli! Recuerde, la puerta Toffoli, o controlada-controlada-no, cambia el estado objetivo si y sólo si el qubit de control 0 Y el qubit de control 1 son ambos 1\vert 1\rangle. Por lo tanto, si el qubit objetivo comienza en el estado 0\vert 0\rangle, entonces tiene la misma acción que la puerta AND.

Así que ya tenemos todos los ingredientes que necesitamos para hacer el circuito cuántico:

# qubits: a, b, sum, carry
qc = QuantumCircuit(4)

# Choose values for A and B:
a = 0
b = 0

# Prepare A and B qubits according to selected values:
if a:
    qc.x(0)
if b:
    qc.x(1)

# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)

# AND (carry) into qubit 3
qc.ccx(0, 1, 3)  # a AND b

# measure
qc.measure_all()


qc.draw("mpl")

Output:

Output of the previous code cell

Arriba está el diagrama del circuito de media escalera cuántica. Como se ha mencionado anteriormente, los hilos representan qubits 00 a 33 ordenados de arriba a abajo, y el registro de bits clásico es el hilo inferior de doble línea. Luego, leyendo de izquierda a derecha, vemos cómo se aplican las puertas a cada qubit viendo dónde aparecen las casillas en los cables correspondientes. Por último, al final se muestran las mediciones. Las mediciones colapsan los estados de los qubits en valores definidos 00 o 11, y los resultados se envían a un registro clásico.

Una sutileza: aunque el esquema del circuito está dibujado de izquierda a derecha, al escribir la expresión matricial correspondiente debemos leerlo de derecha a izquierda. Esto se debe a que en la multiplicación de matrices, el operador más cercano al vector de estado actúa primero. Así, por ejemplo, el circuito anterior (ignorando las medidas) se escribiría como:

CCNOT(q0,q1,q3)CNOT(q1,q2)CNOT(q0,q2)q3q2q1q0CCNOT(q_0,q_1,q_3)CNOT(q_1, q_2)CNOT(q_0,q_2)\vert q_3 q_2 q_1 q_0\rangle

2. Optimización:

A continuación, tenemos que optimizar el circuito para que funcione en el hardware cuántico. Esta optimización se consigue mediante el transpilador, que traduce el circuito abstracto mostrado anteriormente en instrucciones que el ordenador cuántico entenderá. Asigna los qubits lógicos anteriores a qubits físicos reales en el procesador y reescribe las puertas en términos de su propio conjunto nativo de puertas que han sido optimizadas para funcionar en el ordenador cuántico. Por último, el transpilador también implementa algo llamado "supresión y mitigación de errores" para intentar minimizar el efecto de los errores en el resultado. Esto no es tan importante para nuestro circuito tan simple, pero si continúas en tu viaje por la computación cuántica para ejecutar circuitos más complicados, pronto verás el valor de la supresión y mitigación de errores. Si quieres saber más sobre esto, consulta el curso de Olivia Lane, Quantum Computing in Practice.

En primer lugar, cargamos los paquetes necesarios para comunicarnos con los ordenadores cuánticos de IBM® y seleccionamos un backend en el que ejecutarlo. Podemos elegir el backend menos ocupado o seleccionar un backend específico cuyas propiedades conozcamos.

A continuación encontrará un código para guardar sus credenciales la primera vez que las utilice. Asegúrate de borrar esta información del cuaderno después de guardarlo en tu entorno, para que tus credenciales no se compartan accidentalmente cuando compartas el cuaderno. Consulte Configurar su cuenta IBM Cloud e Inicializar el servicio en un entorno no fiable para obtener más orientación.

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Qiskit Runtime service

# Syntax for first saving your token.  Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)

Output:

ibm_fez

Ahora, utilizamos el transpilador para optimizar el circuito. Podemos elegir el nivel de optimización de 0 (sin optimización) a 3 (máxima optimización). Para ver lo que implica cada nivel, visite la guía de niveles de optimización del transpilador Set. El circuito resultante tendrá un aspecto significativamente diferente del circuito lógico que hicimos en nuestro paso de mapeo.

# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

qc_isa.draw("mpl")

Output:

Output of the previous code cell

Un "muestreador" es una primitiva diseñada para muestrear los posibles estados resultantes de un circuito cuántico y recopilar estadísticas sobre qué estados podrían medirse y con qué probabilidad. Aquí importamos el muestrario Qiskit Runtime :

# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

sampler = Sampler(mode=backend)

Si ha agotado el tiempo asignado a los ordenadores cuánticos reales o si no dispone de conexión a Internet, puede que prefiera utilizar un simulador. Para ello, ejecute la celda siguiente y descomente la línea asociada en el paso "Ejecutar".

# Load the backend sampler
from qiskit.primitives import BackendSamplerV2

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)

3. Ejecución

Después de preparar el circuito, ¡ya podemos ejecutarlo en el ordenador cuántico!

job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()

4. Postprocesamiento

Ahora ya podemos ver los resultados Visualizaremos un histograma de las 100 muestras del circuito.

from qiskit.visualization import plot_histogram

print("counts = ", counts)
plot_histogram(counts)

Output:

counts =  {'0000': 90, '0100': 4, '1100': 3, '0010': 3}
Output of the previous code cell

El histograma anterior muestra los resultados de las mediciones de los cuatro qubits al final del circuito. Un ordenador cuántico ideal con ruido cero habría medido los qubits para que tuvieran los mismos valores cada vez, pero en realidad, el ruido hará que algunas de las ejecuciones produzcan errores.

Comprueba tu comprensión

Utilizando la cadena de bits con el mayor número de conteos como sus valores para AA, BB, SS, y CC, verifique que el circuito sumador cuántico funcionó.

  • Tenemos que comprobar que A+B=S+2×CA+B = S+2 \times C. Recuerda que el orden de la cadena de bits sigue la notación little-endian, por lo que se lee CSBA.

    En el histograma anterior, vemos que la cadena de bits 0000 es la dominante.

    0+0=0+0×2=0 0 + 0 = 0 + 0 \times 2 = 0 ~\checkmark

Vuelve atrás y cambia los valores de AA y BB por A=1A=1 y B=1B=1 y repite los pasos de los patrones Qiskit para volver a ejecutar el circuito. Comprueba que el circuito sumador vuelve a funcionar.

  • Debería obtener un histograma en el que la cadena de bits dominante fuera 1011:

    1+1=0+1×2=2 1 + 1 = 0 + 1 \times 2 = 2 ~\checkmark

Una de las características añadidas de la semiescala cuántica sobre la semiescala clásica es que puede funcionar con entradas cuánticas. Es decir, puede "sumar" los qubits AA y BB aunque estén en estados de superposición. En la sección de Preguntas de Desafío, se te pedirá que prepares los qubits en superposiciones y veas lo que ocurre


Conclusión

Este módulo ha sido diseñado para proporcionarle una sólida comprensión de los principios básicos de la computación cuántica comparándola con la computación clásica. Hemos visto el circuito clásico de media escalera y luego te hemos mostrado cómo adaptar el circuito para que funcione con qubits en un ordenador cuántico. Ya estás listo para explorar los demás módulos de Qiskit en el aula

Conceptos fundamentales:

  • A diferencia de los bits clásicos, que sólo pueden tomar los valores 0 y 1, los qubits también pueden estar en estados de superposición tanto de 0 como de 1.
  • Múltiples qubits pueden estar en superposición sobre las cadenas de bits clásicamente permitidas, denominadas estados de base computacional.
  • Se pueden entrelazar varios qubits de modo que el estado de uno dependa del estado del otro.
  • La convención Qiskit es utilizar la notación little-endian, que coloca el qubit menos significativo, q0q_0, en la posición más a la derecha y el qubit más significativo, qNq_N, más a la izquierda.
  • Las puertas cuánticas son operaciones reversibles que se representan mediante matrices unitarias que actúan sobre los vectores de estado cuántico. En esta notación, la matriz más cercana al vector (que está más a la derecha) actúa primero.
  • Las mediciones colapsan un estado de superposición cuántica en uno de sus estados permitidos clásicamente, con probabilidad igual al cuadrado de la amplitud del estado base computacional correspondiente en la superposición.
  • Los circuitos cuánticos suelen representarse mediante diagramas de circuitos cuánticos, en los que los qubits se representan como hilos horizontales y las puertas cuánticas aparecen a lo largo de estos hilos de izquierda a derecha.
  • Para ejecutar un circuito cuántico, utilizamos los cuatro pasos del flujo de trabajo de los patrones Qiskit : Mapear, Optimizar, Ejecutar, Post-procesar.

Preguntas

Preguntas de verdadero/falso

  1. En un ordenador clásico, un bit sólo puede contener el valor 0 ó 1.

  2. El entrelazamiento significa que el estado de un qubit es independiente del estado de otro.

  3. Las puertas cuánticas suelen ser operaciones irreversibles.

  4. La convención Qiskit coloca el qubit menos significativo, q0q_0, en la posición más a la izquierda.

  5. La medición de un estado cuántico siempre da exactamente el mismo resultado si se repite muchas veces.

  6. La puerta de Hadamard crea superposición en un único qubit.

  7. Los circuitos cuánticos pueden incluir operaciones de medición que colapsen el estado de superposición en uno de los estados permitidos clásicamente.

  8. El número de estados clásicos posibles para NN bits es 2N2N.

  9. Las probabilidades de resultado de las mediciones cuánticas vienen dadas por las amplitudes al cuadrado de los estados base clásicamente medibles.

Preguntas de respuesta corta

  1. ¿Cuáles son las principales diferencias entre un bit y un qubit?

  2. ¿Qué le ocurre a un estado cuántico cuando se mide?

  3. ¿Por qué utilizamos la notación little-endian en Qiskit?

  4. ¿Cuáles son los cuatro pasos del flujo de trabajo de los patrones Qiskit?

Preguntas de desafío:

  1. En el módulo, sólo utilizamos el sumador para añadir estados permitidos clásicamente para AA y BB. ¡Pero también podemos preparar AA y BB en superposiciones! Cambia el código para preparar cada qubit en una superposición igual de 0 y 1, luego ejecuta el nuevo circuito y obtén un nuevo histograma. ¿Qué ves? Explica lo que está ocurriendo.

  2. Descomposición de la puerta de Toffoli. Utilice decompose() para mostrar cómo se descompone la puerta de Toffoli en puertas de uno y dos qubits, y luego verifique esta construcción con la multiplicación de matrices. Tenga en cuenta que, aunque los diagramas de circuitos se leen de izquierda a derecha, las matrices se aplican a los estados cuánticos de derecha a izquierda

¿Le ha resultado útil esta página?
Informe de un error, de una errata o solicite contenido en GitHub.