{"id":934,"date":"2021-03-06T21:04:23","date_gmt":"2021-03-06T20:04:23","guid":{"rendered":"https:\/\/intsight.com\/?p=934"},"modified":"2022-04-21T17:10:07","modified_gmt":"2022-04-21T15:10:07","slug":"compuertas-y-circuitos","status":"publish","type":"post","link":"https:\/\/intsight.com\/index.php\/2021\/03\/06\/compuertas-y-circuitos\/","title":{"rendered":"Compuertas y circuitos"},"content":{"rendered":"<p><span style=\"font-variant:small-caps;\">Tras presentar<\/span> el estado cu\u00e1ntico de un qubit, vimos las <a href=\"https:\/\/intsight.com\/index.php\/2021\/02\/05\/transformaciones-unitarias\/\">transformaciones unitarias<\/a> que actuaban sobre dicho estado. Ahora, que ya hemos presentado el estado de un grupo de qubits, tenemos que ver las transformaciones unitarias que nos permitir\u00e1n manejar su estado.<\/p>\n<h4>Compuertas<\/h4>\n<p>Cuando se trata de operaciones sobre qubits individuales, no es mayor problema utilizar directamente las matrices en notaci\u00f3n de componentes. El vector de estado de un qubit se representa con dos componentes complejos, por lo que las matriz son \u00absimples\u00bb matrices complejas de $2\\times2$. En cambio, es m\u00e1s pesado tener que listar los componentes de matrices con m\u00e1s dimensiones.<\/p>\n<p>La alternativa, que todo el mundo sigue, es representar las transformaciones mediante <em>compuertas cu\u00e1nticas<\/em> y combinar estas compuertas en circuitos. Por supuesto, detr\u00e1s de todo circuito hay, simple y llanamente, una matriz probablemente enorme que es la que realiza la transformaci\u00f3n necesaria antes de la medici\u00f3n. A m\u00ed, personalmente, me resulta much\u00edsimo m\u00e1s f\u00e1cil entender el funcionamiento de un algoritmo calculando las matrices asociadas pero, eso espero, con el tiempo uno llega a familiarizarse con la notaci\u00f3n de circuitos y desarrollar la intuici\u00f3n necesaria para ahorrarse unos cuantos pasos. En cualquier caso, intentar\u00e9 dar las herramientas para pasar de compuertas a matrices y, en el caso de circuitos correspondientes a algoritmos sencillos, del circuito completo a la matriz resultante.<\/p>\n<p>Para el dise\u00f1o de circuitos y algoritmos, mi recomendaci\u00f3n es utilizar <a href=\"https:\/\/qiskit.org\/\" rel=\"noopener\" target=\"_blank\">Qiskit<\/a>, de IBM. Qiskit te permite crear una cuenta gratuita, y te da acceso a dos herramientas muy \u00fatiles para crear y evaluar circuitos: mediante software gr\u00e1fico y a trav\u00e9s de Python. No soy un entusiasta de Python, pero para este tipo de tareas no duele mucho usarlo. La siguiente imagen muestra parte de la barra de herramientas del editor gr\u00e1fico, y un circuito muy sencillo con dos qubits, a los cuales se le est\u00e1 aplicando una inversi\u00f3n (la compuerta que parece una cruz) y una medici\u00f3n (la l\u00ednea inferior representa la salida de bits cl\u00e1sicos del algoritmo):<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/circuit00.png?resize=300%2C187&#038;ssl=1\" alt=\"\" width=\"300\" height=\"187\" class=\"aligncenter size-medium wp-image-938\" srcset=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/circuit00.png?resize=300%2C187&amp;ssl=1 300w, https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/circuit00.png?w=450&amp;ssl=1 450w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>El objetivo de esta entrada no es ponernos ya a dise\u00f1ar circuitos: cuando llegue el momento, es preferible mostrar el c\u00f3digo en Python. Ahora nos interesa la parte matem\u00e1tica, sobre c\u00f3mo definir transformaciones que afecten a m\u00e1s de un qubit. Utilizo Qiskit para no tener que dibujar los circuitos a mano.<\/p>\n<p>Hay alternativas a Qiskit. Las principales que conozco son Q#, una iniciativa de Microsoft, e incluso librer\u00edas de Matlab. Q# es interesante, pero en estos momentos es una peque\u00f1a tragedia hacer que funcione a la primera en Visual Studio. Y Matlab es de pago.<\/p>\n<h4>C\u00f3mo combinar matrices<\/h4>\n<p>Volvamos al circuito que he mostrado antes:<br \/>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/circuit00.png?resize=300%2C187&#038;ssl=1\" alt=\"\" width=\"300\" height=\"187\" class=\"aligncenter size-medium wp-image-938\" srcset=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/circuit00.png?resize=300%2C187&amp;ssl=1 300w, https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/circuit00.png?w=450&amp;ssl=1 450w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>Este circuito muestra dos qubits, $q_0$ y $q_1$. A cada uno de ellos se le aplica una negaci\u00f3n: la matriz $X$ que ya hemos visto, que convierte ceros en unos y viceversa, y que Qiskit representa como un c\u00edrculo con una cruz dentro. Luego se realizan las mediciones. El resultado es muy tonto: obtenemos un $11$ cl\u00e1sico:<\/p>\n<ol>\n<li>Asumimos que cada qubit se inicializa en el estado $\\vert0\\rangle$. Es decir, el sistema de dos qubits se inicializa en el estado conjunto $\\vert00\\rangle$.<\/li>\n<li>Cada inversi\u00f3n convierte su qubit al estado $\\vert1\\rangle$. El sistema queda en un estado puro $\\vert11\\rangle$.<\/li>\n<li>Por supuesto, al medir obtendremos ese estado, sin ning\u00fan tipo de incertidumbre.<\/li>\n<\/ol>\n<p>Sabemos que la matriz o compuerta $X$ tiene la siguiente representaci\u00f3n en notaci\u00f3n de componentes:<br \/>\n$$\\pmatrix{0&amp;1\\cr1&amp;0}<br \/>\n$$La pregunta nuestra es: \u00bfc\u00f3mo representamos la matriz que aplica una negaci\u00f3n por separado a cada uno de los qubits? En este caso, la intuici\u00f3n podr\u00eda ayudarnos a determinar el contenido de la matriz, pero vamos a aprovechar que es un ejercicio sencillo para poner a punto la herramienta matem\u00e1tica que necesitaremos para casos m\u00e1s complicados. Esa herramienta es la <em>multiplicaci\u00f3n tensorial de matrices<\/em> (previsible, \u00bfno?).<\/p>\n<p>Supongamos que tenemos dos matrices $A$ y $B$, y que queremos calcular el producto tensorial de las dos:<br \/>\n$$\\pmatrix{a_{11}&amp;a_{12}\\cr a_{21}&amp;a_{22}}\\otimes\\pmatrix{b_{11}&amp;b_{12}\\cr b_{21}&amp;b_{22}}<br \/>\n$$La definici\u00f3n de producto tensorial de matrices es un poco engorrosa, pero no es complicada:<br \/>\n$$\\pmatrix{<br \/>\na_{11}\\times\\pmatrix{b_{11}&amp;b_{12}\\cr b_{21}&amp;b_{22}}&amp;<br \/>\na_{12}\\times\\pmatrix{b_{11}&amp;b_{12}\\cr b_{21}&amp;b_{22}}\\cr<br \/>\na_{21}\\times\\pmatrix{b_{11}&amp;b_{12}\\cr b_{21}&amp;b_{22}}&amp;<br \/>\na_{22}\\times\\pmatrix{b_{11}&amp;b_{12}\\cr b_{21}&amp;b_{22}}<br \/>\n}$$Simplificando, nos queda esto:<br \/>\n$$\\pmatrix{<br \/>\na_{11}b_{11}&amp;a_{11}b_{12}&amp;a_{12}b_{11}&amp;a_{12}b_{12}\\cr<br \/>\na_{11}b_{21}&amp;a_{11}b_{22}&amp;a_{12}b_{21}&amp;a_{12}b_{22}\\cr<br \/>\na_{21}b_{11}&amp;a_{21}b_{12}&amp;a_{22}b_{11}&amp;a_{22}b_{12}\\cr<br \/>\na_{21}b_{21}&amp;a_{21}b_{22}&amp;a_{22}b_{21}&amp;a_{22}b_{22}<br \/>\n}$$<strong>Es muy importante dominar esta t\u00e9cnica<\/strong>. Aseg\u00farese de que comprende de d\u00f3nde sale cada celda del resultado antes de seguir adelante.<\/p>\n<p>En nuestro ejemplo, quer\u00edamos combinar dos matrices $X$:<br \/>\n$$\\pmatrix{0&amp;1\\cr1&amp;0}\\otimes\\pmatrix{0&amp;1\\cr1&amp;0}<br \/>\n$$En el paso intermedio, obtenemos esto:<br \/>\n$$\\pmatrix{<br \/>\n0\\times\\pmatrix{0&amp;1\\cr1&amp;0}&amp;<br \/>\n1\\times\\pmatrix{0&amp;1\\cr1&amp;0}\\cr<br \/>\n1\\times\\pmatrix{0&amp;1\\cr1&amp;0}&amp;<br \/>\n0\\times\\pmatrix{0&amp;1\\cr1&amp;0}<br \/>\n}$$Simplificando:<br \/>\n$$\\pmatrix{<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0\\cr<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0<br \/>\n}$$Intuitivamente, el resultado tiene buen aspecto: la matriz $X$ de dos dimensiones parece una matriz con la diagonal invertida, y esta matriz resultado tiene la misma forma. \u00bfC\u00f3mo comprobamos que es correcta? Muy sencillo. La base para dos qubits tiene cuatro vectores, que son $\\vert00\\rangle,\\vert01\\rangle,\\vert10\\rangle,\\vert11\\rangle$. Estos cuatro vectores, sin embargo, tienen una representaci\u00f3n en componentes que puede resultar confusa si no la domina todav\u00eda. Vamos a hacer los c\u00e1lculos y las representaciones expl\u00edcitos. Para el primer vector de la base:<br \/>\n$$(X\\otimes X)\\vert00\\rangle = \\pmatrix{<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0\\cr<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0<br \/>\n} \\times \\pmatrix {1\\cr0\\cr0\\cr0} = \\pmatrix {0\\cr0\\cr0\\cr1} = \\vert11\\rangle<br \/>\n$$Para el segundo vector:<br \/>\n$$(X\\otimes X)\\vert01\\rangle = \\pmatrix{<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0\\cr<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0<br \/>\n} \\times \\pmatrix {0\\cr1\\cr0\\cr0} = \\pmatrix {0\\cr0\\cr1\\cr0} = \\vert10\\rangle<br \/>\n$$Tercer vector:<br \/>\n$$(X\\otimes X)\\vert10\\rangle = \\pmatrix{<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0\\cr<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0<br \/>\n} \\times \\pmatrix {0\\cr0\\cr1\\cr0} = \\pmatrix {0\\cr1\\cr0\\cr0} = \\vert01\\rangle<br \/>\n$$Y el cuarto vector:<br \/>\n$$(X\\otimes X)\\vert11\\rangle = \\pmatrix{<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0\\cr<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0<br \/>\n} \\times \\pmatrix {0\\cr0\\cr0\\cr1} = \\pmatrix {1\\cr0\\cr0\\cr0} = \\vert00\\rangle<br \/>\n$$Perdone que haya sido tan pedante y haya escrito expl\u00edcitamente todos los detalles. La programaci\u00f3n, en general, es el reino de los detalles. En este caso, hemos podido comprobar que la matriz combinada invierte los ceros y unos en el estado cu\u00e1ntico combinado.<\/p>\n<h4>El orden de los factores<\/h4>\n<p>Sin embargo, me he dejado un detalle importante en el tintero: el orden de los qubits. En un estado como $\\vert01\\rangle$, \u00bfcu\u00e1l es el qubit m\u00e1s significativo? \u00bfEs el $0$ o el $1$? Todo depende del convenio, pero una vez elegido uno, hay que atenerse estrictamente a \u00e9l. Nuestro convenio ser\u00e1 que en $\\vert01\\rangle$ el bit m\u00e1s significativo es el de la izquierda, es decir, el $0$, y el menos significativo es el de la derecha, el $1$.<\/p>\n<p>Recuerde, adem\u00e1s, que $\\vert01\\rangle$ es realmente $\\vert0\\rangle\\otimes\\vert1\\rangle$, esto es, un producto tensorial. Esto es <strong>muy importante<\/strong> tambi\u00e9n para combinar correctamente matrices. Nuestro primer ejemplo de producto tensorial fue muy sencillo porque las dos matrices eran id\u00e9nticas, y no tuvimos que preocuparnos por su orden relativo. Vamos a suponer que nuestro circuito tiene esta otra forma:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/03\/circuit01.png?resize=300%2C178&#038;ssl=1\" alt=\"\" width=\"300\" height=\"178\" class=\"aligncenter size-medium wp-image-976\" srcset=\"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/03\/circuit01.png?resize=300%2C178&amp;ssl=1 300w, https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/03\/circuit01.png?w=321&amp;ssl=1 321w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/>Esta vez queremos invertir solamente el qubit menos significativo. Aparentemente, adem\u00e1s, s\u00f3lo tenemos una matriz, pero eso no es del todo cierto. Lo que queremos calcular ahora es la matriz combinada $I\\otimes X$, donde $I$ es la matriz identidad.<\/p>\n<p>Observe el orden: primero va la matriz identidad $I$&#8230; \u00a1porque cuando representamos el sistema de dos qubits, hemos elegido que el m\u00e1s significativo sea el de la izquierda! Y la matriz $X$ es entonces el segundo operando. Queremos entonces calcular esto:<\/p>\n<p>$$\\pmatrix{1&amp;0\\cr0&amp;1}\\otimes\\pmatrix{0&amp;1\\cr1&amp;0}<br \/>\n$$Expandiendo, seg\u00fan la definici\u00f3n de producto tensorial:<br \/>\n$$\\pmatrix{<br \/>\n1\\times\\pmatrix{0&amp;1\\cr1&amp;0}&amp;<br \/>\n0\\times\\pmatrix{0&amp;1\\cr1&amp;0}\\cr<br \/>\n0\\times\\pmatrix{0&amp;1\\cr1&amp;0}&amp;<br \/>\n1\\times\\pmatrix{0&amp;1\\cr1&amp;0}<br \/>\n}$$Y si simplificamos:<br \/>\n$$\\pmatrix{<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0\\cr<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0<br \/>\n}$$Esto, as\u00ed de repente, es chino mandar\u00edn, y la \u00fanica manera sensata de comprobar que no nos hemos equivocado es comprobar directamente las transformaciones.<br \/>\n$$(I\\otimes X)\\vert00\\rangle = \\pmatrix{<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0\\cr<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0<br \/>\n} \\times \\pmatrix {1\\cr0\\cr0\\cr0} = \\pmatrix {0\\cr1\\cr0\\cr0} = \\vert01\\rangle<br \/>\n$$<br \/>\n$$(I\\otimes X)\\vert01\\rangle = \\pmatrix{<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0\\cr<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0<br \/>\n} \\times \\pmatrix {0\\cr1\\cr0\\cr0} = \\pmatrix {1\\cr0\\cr0\\cr0} = \\vert00\\rangle<br \/>\n$$<br \/>\n$$(I\\otimes X)\\vert10\\rangle = \\pmatrix{<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0\\cr<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0<br \/>\n} \\times \\pmatrix {0\\cr0\\cr1\\cr0} = \\pmatrix {0\\cr0\\cr0\\cr1} = \\vert11\\rangle<br \/>\n$$<br \/>\n$$(I\\otimes X)\\vert11\\rangle = \\pmatrix{<br \/>\n0&amp;1&amp;0&amp;0\\cr<br \/>\n1&amp;0&amp;0&amp;0\\cr<br \/>\n0&amp;0&amp;0&amp;1\\cr<br \/>\n0&amp;0&amp;1&amp;0<br \/>\n} \\times \\pmatrix {0\\cr0\\cr0\\cr1} = \\pmatrix {0\\cr0\\cr1\\cr0} = \\vert10\\rangle<br \/>\n$$Nuestra matriz, por lo tanto, transforma $00\\rightarrow01$, $01\\rightarrow00$, $10\\rightarrow11$ y $11\\rightarrow11$. Esto es, lo que hace es cambiar el estado del bit menos significativo&#8230; que era lo que est\u00e1bamos buscando. Como ejercicio, puede calcular cu\u00e1l ser\u00eda la representaci\u00f3n en componentes de la matriz $X\\otimes I$, que debe invertir el estado del qubit m\u00e1s significativo. Y si quiere adelantarse a la siguiente entrada, pruebe fortuna con $H\\otimes H$, donde $H$ es la transformaci\u00f3n de Hadamard que ya hemos visto.<\/p>\n<h4>Advertencia<\/h4>\n<p>Todas las matrices y estados que hemos visto tienen componentes que son o $0$ o $1$. Esto puede llevar a confusi\u00f3n: ese cero es realmente un cero \u00abcomplejo\u00bb, y lo mismo se aplica al uno. No pierda de vista, aunque en estos primeros ejemplos no importe mucho, que en vez de ceros y unos, nuestras matrices y vectores pueden contener, y contendr\u00e1n, n\u00fameros complejos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tras presentar el estado cu\u00e1ntico de un qubit, vimos las transformaciones unitarias que actuaban sobre dicho estado. Ahora, que ya hemos presentado el estado de un grupo de qubits, tenemos que ver las transformaciones unitarias que nos permitir\u00e1n manejar su estado. Compuertas Cuando se trata de operaciones sobre qubits individuales, no es mayor problema utilizar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":935,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[33],"tags":[52,51,53,34],"class_list":["post-934","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-quantum","tag-circuit","tag-gates","tag-qiskit","tag-quantum"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/intsight.com\/wp-content\/uploads\/2021\/02\/qbrain.png?fit=350%2C350&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts\/934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/comments?post=934"}],"version-history":[{"count":47,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts\/934\/revisions"}],"predecessor-version":[{"id":987,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/posts\/934\/revisions\/987"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/media\/935"}],"wp:attachment":[{"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/media?parent=934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/categories?post=934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/intsight.com\/index.php\/wp-json\/wp\/v2\/tags?post=934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}