<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Microsoft on kenji.blog</title><link>http://kenji.blog/es/tags/microsoft/</link><description>Recent content in Microsoft on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 00:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/es/tags/microsoft/index.xml" rel="self" type="application/rss+xml"/><item><title>Probando el lenguaje de programación para computadoras cuánticas 'Q#'</title><link>http://kenji.blog/es/p/qsharp-quantum-programming-language-intro/</link><pubDate>Sat, 12 Sep 2026 00:00:00 +0900</pubDate><guid>http://kenji.blog/es/p/qsharp-quantum-programming-language-intro/</guid><description>&lt;img src="http://kenji.blog/p/qsharp-quantum-programming-language-intro/img/eyecatch.jpg" alt="Featured image of post Probando el lenguaje de programación para computadoras cuánticas 'Q#'" />&lt;h2 id="1-introducción-el-amanecer-de-la-computación-cuántica-y-un-nuevo-paradigma-de-programación">1. Introducción: El amanecer de la computación cuántica y un nuevo paradigma de programación
&lt;/h2>&lt;p>En los últimos años, la innovación tecnológica en hardware y software dentro del campo de la computación cuántica ha sido notable. Mientras que las computadoras clásicas (las PC, teléfonos inteligentes y supercomputadoras que utilizamos a diario hoy en día) procesan información con combinaciones definidas de bits en estado &amp;ldquo;0&amp;rdquo; o &amp;ldquo;1&amp;rdquo;, las computadoras cuánticas utilizan directamente fenómenos físicos exclusivos de la mecánica cuántica como base para el procesamiento de información, tales como la &amp;ldquo;Superposición&amp;rdquo; (Superposition) y el &amp;ldquo;Entrelazamiento cuántico&amp;rdquo; (Entanglement). Esto ha demostrado la posibilidad de lograr una velocidad de cálculo inalcanzable para una computadora clásica, incluso si tardara la edad del universo, para una clase específica de problemas; es decir, alcanzar la &amp;ldquo;Supremacía cuántica&amp;rdquo; (Quantum Supremacy) o la &amp;ldquo;Ventaja cuántica&amp;rdquo; (Quantum Advantage). Por ejemplo, se espera una reducción dramática en la complejidad computacional en problemas como la factorización de números enormes (algoritmo de Shor), búsquedas rápidas en bases de datos (algoritmo de Grover), simulación de química cuántica (algoritmo VQE), problemas de optimización combinatoria, e incluso en ciertos procesos de aprendizaje automático (Quantum Machine Learning).&lt;/p>
&lt;p>Sin embargo, para aprovechar este asombroso potencial de las computadoras cuánticas como aplicaciones reales, no basta solo con los avances en hardware físico (como los qubits superconductores o trampas de iones). Es indispensable contar con un &amp;ldquo;lenguaje de programación cuántica&amp;rdquo; para diseñar circuitos cuánticos con precisión y escribir algoritmos cuánticos sin errores y de manera eficiente, junto con un entorno de desarrollo, ejecución y depuración sólido que lo respalde. Los lenguajes de programación clásicos (como C++, Python, Java, etc.) son excelentes para abstraer el funcionamiento de la arquitectura de la CPU clásica, pero no están diseñados para describir de forma natural la manipulación de estados cuánticos, que son no deterministas y poseen amplitudes complejas.&lt;/p>
&lt;p>En este artículo, de entre los numerosos entornos de programación cuántica, nos enfocaremos en el &amp;ldquo;Quantum Development Kit (QDK)&amp;rdquo;, un kit de desarrollo cuántico impulsado fuertemente por Microsoft y desarrollado como código abierto, y en su núcleo: el lenguaje de programación dedicado &amp;ldquo;Q#&amp;rdquo;.&lt;/p>
&lt;p>Q# fue diseñado desde cero como un Lenguaje Específico de Dominio (Domain Specific Language: DSL) especializado en la escritura de algoritmos cuánticos, absorbiendo los mejores aspectos de C#, F# y Python. Cuenta con características poderosas que integran de forma fluida el flujo de control clásico (como sentencias if o bucles for) con operaciones cuánticas (aplicación de compuertas y mediciones). En este artículo, partiremos de los modelos matemáticos básicos de la computación cuántica y explicaremos exhaustiva y detalladamente las características lingüísticas de Q#, su filosofía de diseño en comparación con herramientas como Qiskit de Python, la construcción y medición del &amp;ldquo;Estado de Bell (Bell State: estado entrelazado)&amp;rdquo; mediante código real, e incluso los métodos de integración con lenguajes clásicos (Python o C#). Para cuando termines de leer este artículo, comprenderás los fundamentos de la programación cuántica y estarás listo para comenzar a escribir código en Q# en tu propio entorno.&lt;/p>
&lt;h2 id="2-fundamentos-matemáticos-de-la-computación-cuántica-estados-superposición-y-entrelazamiento">2. Fundamentos matemáticos de la computación cuántica: Estados, superposición y entrelazamiento
&lt;/h2>&lt;p>Para comprender a fondo la sintaxis y las funciones de Q# y poder escribir programas cuánticos efectivos, es necesario primero repasar los conocimientos matemáticos básicos (especialmente el álgebra lineal) que se encuentran detrás de los estados cuánticos y las operaciones de compuertas cuánticas. Aquí revisaremos los modelos matemáticos fundamentales e indispensables para la programación cuántica.&lt;/p>
&lt;h3 id="21-qubits-bits-cuánticos-y-el-estado-de-superposición">2.1 Qubits (Bits cuánticos) y el estado de superposición
&lt;/h3>&lt;p>Mientras que un bit clásico solo puede tomar el estado de $0$ o $1$, un qubit (bit cuántico) se representa como una combinación lineal (Linear Combination) de los estados $|0\rangle$ y $|1\rangle$, es decir, una &amp;ldquo;superposición&amp;rdquo;. Este estado se describe utilizando la notación bra-ket (notación de Dirac) y los coeficientes complejos $\alpha$ y $\beta$ de la siguiente manera:&lt;/p>
$$ |\psi\rangle = \alpha|0\rangle + \beta|1\rangle $$
&lt;p>Aquí, $\alpha$ y $\beta$ son números complejos (Complex Numbers) llamados amplitudes de probabilidad (Probability Amplitude). Al medir este qubit, la probabilidad de observar el estado $|0\rangle$ es $|\alpha|^2$ y la probabilidad de observar el estado $|1\rangle$ es $|\beta|^2$. Como restricción física, la suma de las probabilidades de observar todos los estados posibles debe ser siempre igual a $1$, por lo que se debe cumplir la siguiente condición de normalización (Normalization Condition):&lt;/p>
$$ |\alpha|^2 + |\beta|^2 = 1 $$
&lt;p>El estado de un qubit a menudo se visualiza como un punto en la superficie de una esfera unitaria en un espacio tridimensional llamada &amp;ldquo;Esfera de Bloch&amp;rdquo; (Bloch Sphere). El polo norte corresponde a $|0\rangle$ y el polo sur a $|1\rangle$, y los puntos en el ecuador representan estados en los que $|0\rangle$ y $|1\rangle$ están superpuestos con igual probabilidad (por ejemplo, $|+\rangle = \frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)$ con fase 0, o $|i\rangle = \frac{1}{\sqrt{2}}(|0\rangle + i|1\rangle)$ con fase $\pi/2$). Las operaciones de compuertas cuánticas pueden entenderse geométricamente como rotaciones en esta esfera de Bloch.&lt;/p>
&lt;h3 id="22-múltiples-qubits-producto-tensorial-y-entrelazamiento-cuántico">2.2 Múltiples qubits, producto tensorial y entrelazamiento cuántico
&lt;/h3>&lt;p>El verdadero poder de la computación cuántica se manifiesta al combinar múltiples qubits. El estado de un sistema compuesto por múltiples qubits se describe mediante el &amp;ldquo;producto tensorial&amp;rdquo; (Tensor Product) de los espacios de estado de los qubits individuales. Por ejemplo, el estado de todo un sistema compuesto por dos qubits es el siguiente:&lt;/p>
$$ |\psi\rangle = \alpha_{00}|00\rangle + \alpha_{01}|01\rangle + \alpha_{10}|10\rangle + \alpha_{11}|11\rangle $$
&lt;p>Aquí también se cumple la condición de normalización $\sum_{i,j} |\alpha_{ij}|^2 = 1$. El punto importante es que, para describir completamente un sistema de n qubits, se necesitan $2^n$ amplitudes complejas. Por ejemplo, para un sistema de solo 50 qubits, representar su estado requiere unos $2^{50} \approx 10^{15}$ números complejos, lo cual supera con creces la capacidad de memoria de las supercomputadoras más rápidas del mundo actual. Esta es una de las razones por las que las computadoras cuánticas poseen una ventaja exponencial sobre las computadoras clásicas.&lt;/p>
&lt;p>El &amp;ldquo;entrelazamiento cuántico&amp;rdquo; (Entanglement) se refiere a aquellos estados de múltiples qubits que no pueden descomponerse simplemente (factorizarse) como el producto tensorial de los estados de los qubits individuales. Uno de los estados entrelazados más famosos e importantes es el siguiente &amp;ldquo;Estado de Bell&amp;rdquo; (Bell State):&lt;/p>
$$ |\Phi^+\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle) $$
&lt;p>En este estado, en el instante en que se mide un qubit y se obtiene $0$ (o $1$), el estado del otro qubit queda determinado instantáneamente como $0$ (o $1$), independientemente de la distancia. Esta correlación no local, que Einstein llamó &amp;ldquo;espeluznante acción a distancia&amp;rdquo;, se convierte en un recurso fundamental para la teletransportación cuántica, la codificación superdensa, la comunicación cuántica criptográfica, e incluso la ejecución eficiente de muchos algoritmos cuánticos. En una sección posterior, construiremos este estado de Bell utilizando Q#.&lt;/p>
&lt;h3 id="23-operaciones-de-compuertas-cuánticas-y-matrices-unitarias">2.3 Operaciones de compuertas cuánticas y matrices unitarias
&lt;/h3>&lt;p>Las operaciones que cambian los estados cuánticos (equivalentes a las compuertas AND, OR, NOT en los circuitos lógicos clásicos) se denominan compuertas cuánticas. Matemáticamente, una compuerta cuántica se representa como una matriz de números complejos y actúa como una multiplicación de matriz sobre el vector del estado cuántico. Según los axiomas de la mecánica cuántica, estas matrices deben ser siempre matrices unitarias (Unitary Matrix, una matriz que cumple $U^\dagger U = I$, donde $U^\dagger$ es la matriz adjunta e $I$ es la matriz identidad). Debido a esto, todas las operaciones cuánticas, excepto las mediciones, son reversibles (Reversible).&lt;/p>
&lt;p>Compuertas representativas de un solo qubit:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Compuerta Pauli-X (Compuerta NOT)&lt;/strong>: Invierte $|0\rangle$ a $|1\rangle$, y $|1\rangle$ a $|0\rangle$.
$$ X = \begin{pmatrix} 0 &amp; 1 \\ 1 &amp; 0 \end{pmatrix} $$&lt;/li>
&lt;li>&lt;strong>Compuerta Pauli-Z (Compuerta de cambio de fase)&lt;/strong>: Deja $|0\rangle$ intacto e invierte el signo de $|1\rangle$ (añade $\pi$ a la fase relativa).
$$ Z = \begin{pmatrix} 1 &amp; 0 \\ 0 &amp; -1 \end{pmatrix} $$&lt;/li>
&lt;li>&lt;strong>Compuerta de Hadamard (Compuerta H)&lt;/strong>: Convierte un estado determinista en un estado de superposición.
$$ H = \frac{1}{\sqrt{2}} \begin{pmatrix} 1 &amp; 1 \\ 1 &amp; -1 \end{pmatrix} $$&lt;/li>
&lt;/ul>
&lt;p>Compuertas representativas de dos qubits:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Compuerta CNOT (Compuerta NOT controlada)&lt;/strong>: Aplica una compuerta X (operación NOT) al qubit objetivo (Target Qubit) solo cuando el qubit de control (Control Qubit) es $|1\rangle$.
$$ CNOT = \begin{pmatrix} 1 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 1 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 1 \\ 0 &amp; 0 &amp; 1 &amp; 0 \end{pmatrix} $$&lt;/li>
&lt;/ul>
&lt;p>Los algoritmos cuánticos pueden considerarse como el diseño de un proceso que combina estas matrices unitarias básicas para lograr el cálculo deseado.&lt;/p>
&lt;h2 id="3-qué-es-microsoft-quantum-development-kit-qdk">3. ¿Qué es Microsoft Quantum Development Kit (QDK)?
&lt;/h2>&lt;p>El Quantum Development Kit (QDK) proporcionado por Microsoft es un conjunto integral de herramientas para apoyar el desarrollo de software de computación cuántica. Da soporte a todo el ciclo de vida del desarrollo, desde el diseño, depuración y optimización de algoritmos cuánticos, hasta su ejecución en simuladores o en hardware real.&lt;/p>
&lt;p>El QDK incluye los siguientes elementos principales:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Compilador Q# y entorno de ejecución&lt;/strong>: Analiza altamente y optimiza el código escrito en lenguaje Q# y lo convierte en un formato ejecutable (como QIR) en simuladores o hardware cuántico real (a través de Azure Quantum). El compilador Q# realiza un análisis estático específico para la computación cuántica, como la comprobación de la pureza de las funciones y la gestión del ciclo de vida de los qubits.&lt;/li>
&lt;li>&lt;strong>Simuladores cuánticos&lt;/strong>: Incluye un simulador de estado completo (Full State Simulator) que simula la evolución de los estados cuánticos en la máquina local del desarrollador. Esto permite probar y depurar rápidamente algoritmos a pequeña escala de decenas de qubits. Además, proporciona un estimador de recursos (Resource Estimator) para calcular los requisitos de recursos de circuitos a gran escala (de miles a millones de qubits).&lt;/li>
&lt;li>&lt;strong>Bibliotecas completas&lt;/strong>: La biblioteca estándar de Q# (Standard Library) proporciona varios bloques de construcción avanzados, que van desde las compuertas cuánticas básicas (H, X, Y, Z, CNOT, etc.) y operaciones aritméticas complejas (como sumadores cuánticos), hasta la amplificación de la amplitud (Amplitude Amplification) y algoritmos de estimación de la fase cuántica (Quantum Phase Estimation). Esto permite a los desarrolladores evitar reinventar la rueda.&lt;/li>
&lt;li>&lt;strong>Integración con Entornos de Desarrollo Integrado (IDE)&lt;/strong>: Se proporcionan extensiones para Visual Studio y Visual Studio Code, permitiendo el uso de funciones esenciales para el desarrollo de software moderno, como el resaltado de sintaxis, el autocompletado de código (IntelliSense), potentes herramientas de depuración y la integración con marcos de pruebas.&lt;/li>
&lt;/ol>
&lt;p>A continuación se muestra un diagrama Mermaid que ilustra el flujo de trabajo desde que se escribe un programa Q# hasta que se ejecuta en el hardware.&lt;/p>
&lt;div class="mermaid">graph TD
A["Código fuente Q# (.qs)"] --> B["Compilador Q#"]
B --> C["Representación Intermedia Cuántica (QIR)"]
C --> D["Simulador cuántico local"]
C --> E["Servicio Azure Quantum"]
E --> F["Hardware IonQ"]
E --> G["Hardware Quantinuum"]
E --> H["Hardware Rigetti"]
D --> I["Resultado / Datos de salida"]
F --> I
G --> I
H --> I
style A fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px;
style B fill:#fff3e0,stroke:#ff9800,stroke-width:2px;
style C fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px;&lt;/div>
&lt;p>Un aspecto extremadamente destacado de esta arquitectura es que abstrae completamente las diferencias en las arquitecturas de hardware subyacentes (qubits superconductores, trampas de iones, qubits topológicos, cuantos de luz, etc.) al pasar por una representación intermedia basada en LLVM llamada QIR (Quantum Intermediate Representation). Los desarrolladores pueden centrarse en el diseño puramente lógico de los algoritmos sin tener que preocuparse por los detalles físicos del hardware (topologías o conjuntos de compuertas nativas específicas de cada hardware). Los pasos del compilador después de la capa QIR realizan una transpilación de compuertas optimizada automáticamente para el hardware objetivo.&lt;/p>
&lt;h2 id="4-q-vs-pythonqiskit-por-qué-necesitamos-un-nuevo-lenguaje">4. Q# vs Python/Qiskit: ¿Por qué necesitamos un nuevo lenguaje?
&lt;/h2>&lt;p>Al aprender programación cuántica, la mayoría de las personas entran en contacto primero con &amp;ldquo;Qiskit&amp;rdquo;, un framework basado en Python desarrollado por IBM, debido a su facilidad de uso y la popularidad de Python. Aunque Qiskit es una herramienta muy poderosa y ampliamente utilizada, su filosofía de diseño (paradigma) difiere fundamentalmente de la de Q# de Microsoft.&lt;/p>
&lt;h3 id="el-enfoque-de-qiskit-construcción-de-objetos-de-circuitos-con-python">El enfoque de Qiskit (Construcción de objetos de circuitos con Python)
&lt;/h3>&lt;p>Qiskit es esencialmente una &amp;ldquo;biblioteca API de Python para construir circuitos cuánticos&amp;rdquo;. Cuando un desarrollador ejecuta un script de Python, una secuencia de compuertas cuánticas (objeto de circuito) se ensambla gradualmente en la memoria. Después de añadir todas las compuertas, ese enorme objeto de circuito finalmente se envía (Submit) al backend (un simulador local o un dispositivo real en la nube) para su ejecución.
Este enfoque de metaprogramación tiene la gran ventaja de que es extremadamente fácil integrarse con el ecosistema de Python existente (bibliotecas de aprendizaje automático como NumPy, SciPy, PyTorch, y herramientas de visualización). Sin embargo, cuando se trata de expresar circuitos dinámicos (Dynamic Circuits) con flujos de control complejos que mezclan lo clásico y lo cuántico, por ejemplo: &amp;ldquo;medir un qubit y, solo si el resultado fue 1, aplicar una operación unitaria compleja específica a otro grupo de qubits, y luego realizar un bucle while&amp;rdquo;, no se pueden utilizar las sentencias if o for nativas de Python (porque se evalúan en el momento de la &amp;ldquo;construcción del circuito&amp;rdquo;). Se hace necesario utilizar instrucciones de control especiales propias de Qiskit, lo que hace que el código a menudo se vuelva muy complejo y poco intuitivo.&lt;/p>
&lt;h3 id="el-enfoque-de-q-lenguaje-específico-de-dominio-de-primer-nivel-cuántico">El enfoque de Q# (Lenguaje Específico de Dominio de primer nivel cuántico)
&lt;/h3>&lt;p>Por otro lado, Q# es un lenguaje compilado independiente diseñado desde cero para tratar la computación cuántica en sí misma como un ciudadano de primera clase (First-class citizen). Dentro de Q#, la asignación de qubits, las operaciones de compuertas y las mediciones se pueden escribir de forma natural y fluida en una misma base de código, sintiéndose exactamente igual que manipular variables clásicas o escribir declaraciones if y bucles.
El compilador Q# analiza estáticamente todo el código, determina qué partes deben ejecutarse en un dispositivo de computación clásico (CPU anfitriona o electrónica de control) y cuáles deben ejecutarse en un coprocesador cuántico (QPU), realizando optimizaciones avanzadas. Esto permite una mayor modularidad, legibilidad, facilidad de mantenimiento y seguridad de tipos (Type Safety) al implementar algoritmos cuánticos grandes y complejos. Q# no es un lenguaje para &amp;ldquo;escribir circuitos&amp;rdquo;, sino para &amp;ldquo;escribir algoritmos&amp;rdquo;.&lt;/p>
&lt;h2 id="5-profundizando-en-la-sintaxis-básica-y-los-conceptos-característicos-de-q">5. Profundizando en la sintaxis básica y los conceptos característicos de Q#
&lt;/h2>&lt;p>La sintaxis de Q# tiene un diseño muy pulido que parece combinar la estructura de bloques de C# con llaves &lt;code>{}&lt;/code>, elementos de programación funcional de F# y una potente inferencia de tipos. Aquí explicaremos en detalle los conceptos y palabras clave más importantes para comprender profundamente Q#.&lt;/p>
&lt;h3 id="51-la-estricta-distinción-entre-operation-y-function">5.1 La estricta distinción entre &lt;code>operation&lt;/code> y &lt;code>function&lt;/code>
&lt;/h3>&lt;p>En Q#, se hace una distinción rigurosa entre dos tipos para definir rutinas (bloques de procesamiento): &lt;code>operation&lt;/code> y &lt;code>function&lt;/code>. Esto proviene del concepto de &amp;ldquo;pureza&amp;rdquo; (Purity) en la programación funcional.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>function&lt;/code>&lt;/strong>: Es una función pura que solo realiza cálculos clásicos deterministas (Deterministic). Si se dan los mismos parámetros de entrada, siempre devolverá el mismo resultado de salida, sin importar cuántas veces se ejecute. Dentro de una &lt;code>function&lt;/code>, las operaciones cuánticas (que conllevan efectos secundarios) como la asignación de qubits, la aplicación de compuertas o las mediciones darán lugar a un error de compilación. Se utiliza para cálculos matemáticos o transformaciones de datos.&lt;/li>
&lt;li>&lt;strong>&lt;code>operation&lt;/code>&lt;/strong>: Es una rutina no determinista (Non-deterministic) que incluye computación cuántica. Al contener operaciones y mediciones en qubits, incluso con la misma entrada, el resultado puede cambiar debido a la naturaleza probabilística de la mecánica cuántica (como el colapso de la función de onda debido a la medición). Todas las partes centrales de un algoritmo cuántico se definen como &lt;code>operation&lt;/code>.&lt;/li>
&lt;/ul>
&lt;h3 id="52-el-tipo-qubit-y-la-gestión-del-ciclo-de-vida-con-la-palabra-clave-use">5.2 El tipo &lt;code>Qubit&lt;/code> y la gestión del ciclo de vida con la palabra clave &lt;code>use&lt;/code>
&lt;/h3>&lt;p>En Q#, un qubit se trata como un objeto &amp;ldquo;opaco&amp;rdquo; (Opaque) de tipo &lt;code>Qubit&lt;/code>. Se prohíbe intencionalmente que los desarrolladores lean o modifiquen directamente las amplitudes de probabilidad de su estado interno (por ejemplo, los valores de $\alpha$ y $\beta$) dentro del programa (esto es coherente con el &amp;ldquo;problema de la medición&amp;rdquo; en los sistemas cuánticos físicos reales). La única forma de interactuar con los qubits es llamando a las operaciones de compuertas cuánticas o funciones de medición proporcionadas.&lt;/p>
&lt;p>Para asignar (alocar) un nuevo qubit dentro de un programa, se utiliza la palabra clave &lt;code>use&lt;/code> (en versiones anteriores de Q# se llamaba &lt;code>using&lt;/code>). El bloque &lt;code>use&lt;/code> define claramente el alcance y el ciclo de vida del qubit.
Una regla importante es que, al salir de un bloque &lt;code>use&lt;/code>, todos los qubits asignados dentro de él deben haber vuelto por completo a su estado inicial $|0\rangle$ (de lo contrario, se producirá una excepción en tiempo de ejecución). Este es un poderoso mecanismo de seguridad de Q# para garantizar la reutilización de los qubits y prevenir fugas de memoria.&lt;/p>
&lt;h3 id="53-medición-m-y-la-conveniente-mresetz">5.3 Medición &lt;code>M&lt;/code> y la conveniente &lt;code>MResetZ&lt;/code>
&lt;/h3>&lt;p>La operación de medición (Measurement) para convertir el estado cuántico en información clásica (0 o 1) se realiza mediante la operación básica &lt;code>M&lt;/code>. El resultado de la medición en la base Z (base estándar) se devuelve como un tipo de enumeración &lt;code>Result&lt;/code> (con valores &lt;code>Zero&lt;/code> o &lt;code>One&lt;/code>).
Sin embargo, como se mencionó anteriormente, al liberar un qubit, se requiere que esté en el estado $|0\rangle$. Si simplemente se realiza una medición &lt;code>M&lt;/code> y el resultado fue &lt;code>One&lt;/code>, el estado del qubit ha colapsado a $|1\rangle$. Por lo tanto, en el código práctico, se usa con mucha frecuencia la conveniente operación estándar llamada &lt;code>MResetZ&lt;/code>, que resetea el estado del qubit de forma segura a $|0\rangle$ justo después de realizar la medición.&lt;/p>
&lt;h3 id="54-inmutabilidad-de-las-variables-immutability-y-mutable">5.4 Inmutabilidad de las variables (Immutability) y &lt;code>mutable&lt;/code>
&lt;/h3>&lt;p>En Q#, que está fuertemente influenciado por la programación funcional, todas las variables son inmutables (Immutable) por defecto. Una vez que se asocia un valor a una variable utilizando la palabra clave &lt;code>let&lt;/code>, su valor no se puede cambiar después. Esto reduce los efectos secundarios no deseados en el procesamiento paralelo y los algoritmos cuánticos.
Si se necesita declarar una variable cuyo valor debe actualizarse, como un contador de bucle o un cálculo acumulativo, se utiliza explícitamente la palabra clave &lt;code>mutable&lt;/code> y, para actualizar el valor, se utiliza la palabra clave &lt;code>set&lt;/code>.&lt;/p>
&lt;h2 id="6-práctica-crear-y-medir-un-estado-de-bell-entrelazamiento-cuántico-con-q">6. Práctica: Crear y medir un Estado de Bell (Entrelazamiento cuántico) con Q#
&lt;/h2>&lt;p>Ahora que hemos reunido el conocimiento necesario, utilicemos Q# para crear el &amp;ldquo;Estado de Bell&amp;rdquo; (Bell State) que explicamos en la sección de matemáticas y escribamos un programa para medirlo. Este es un paso muy importante que podría considerarse el &amp;ldquo;Hola Mundo&amp;rdquo; de la programación cuántica.&lt;/p>
&lt;h3 id="diseño-y-explicación-del-circuito-cuántico">Diseño y explicación del circuito cuántico
&lt;/h3>&lt;p>El procedimiento estándar de un circuito cuántico para crear el estado de Bell $\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$ es el siguiente:&lt;/p>
&lt;ol>
&lt;li>Se preparan dos qubits $q_0$ y $q_1$ en el estado inicial $|00\rangle$.&lt;/li>
&lt;li>Se aplica una compuerta de Hadamard (compuerta $H$) a $q_0$. Esto deja a $q_0$ en un estado de superposición de $|0\rangle$ y $|1\rangle$ con igual probabilidad: $\frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)$. En este punto, el estado de todo el sistema es $\frac{1}{\sqrt{2}}(|0\rangle + |1\rangle) \otimes |0\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |10\rangle)$.&lt;/li>
&lt;li>Se aplica una compuerta CNOT (NOT controlada) usando $q_0$ como el bit de control (Control) y $q_1$ como el bit objetivo (Target). Esto invierte $q_1$ solo cuando $q_0$ es $|1\rangle$. Como resultado, el estado $|00\rangle$ permanece como $|00\rangle$, pero el estado $|10\rangle$ cambia a $|11\rangle$, y el estado final de todo el sistema se convierte en $\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$. Esto completa la creación del estado entrelazado con una correlación perfecta.&lt;/li>
&lt;/ol>
&lt;h3 id="código-de-implementación-en-q">Código de implementación en Q#
&lt;/h3>&lt;p>El siguiente código es un ejemplo práctico de implementación que genera un estado de Bell usando Q# y repite el experimento de medición un número especificado de veces para obtener sus estadísticas (distribución de probabilidad).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;span class="lnt">75
&lt;/span>&lt;span class="lnt">76
&lt;/span>&lt;span class="lnt">77
&lt;/span>&lt;span class="lnt">78
&lt;/span>&lt;span class="lnt">79
&lt;/span>&lt;span class="lnt">80
&lt;/span>&lt;span class="lnt">81
&lt;/span>&lt;span class="lnt">82
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span class="line">&lt;span class="cl">&lt;span class="n">namespace&lt;/span> &lt;span class="n">Quantum&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">BellState&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Importamos&lt;/span> &lt;span class="n">los&lt;/span> &lt;span class="n">espacios&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">nombres&lt;/span> &lt;span class="n">necesarios&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">open&lt;/span> &lt;span class="n">Microsoft&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Quantum&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Intrinsic&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">open&lt;/span> &lt;span class="n">Microsoft&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Quantum&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Canon&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">open&lt;/span> &lt;span class="n">Microsoft&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Quantum&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Measurement&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">open&lt;/span> &lt;span class="n">Microsoft&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Quantum&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Diagnostics&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="c1"># Summary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="n">Genera&lt;/span> &lt;span class="n">un&lt;/span> &lt;span class="err">ú&lt;/span>&lt;span class="n">nico&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">Bell&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">mide&lt;/span> &lt;span class="n">dos&lt;/span> &lt;span class="n">qubits&lt;/span> &lt;span class="n">en&lt;/span> &lt;span class="n">la&lt;/span> &lt;span class="n">base&lt;/span> &lt;span class="n">Z&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="c1"># Output&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Result&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Result&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">Resultados&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">medición&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">qubit1&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">qubit2&lt;/span>&lt;span class="o">.&lt;/span> &lt;span class="n">Si&lt;/span> &lt;span class="n">es&lt;/span> &lt;span class="n">un&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">Bell&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">siempre&lt;/span> &lt;span class="n">coincidirán&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">operation&lt;/span> &lt;span class="n">GenerateAndMeasureBellState&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Result&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Result&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Asignamos&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="n">qubits&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">el&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">inicial&lt;/span> &lt;span class="n">es&lt;/span> &lt;span class="n">automáticamente&lt;/span> &lt;span class="o">|&lt;/span>&lt;span class="mi">00&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">use&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">q1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Qubit&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">Qubit&lt;/span>&lt;span class="p">());&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Aplicamos&lt;/span> &lt;span class="n">la&lt;/span> &lt;span class="n">compuerta&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">Hadamard&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="n">q1&lt;/span> &lt;span class="n">para&lt;/span> &lt;span class="n">crear&lt;/span> &lt;span class="n">un&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">superposición&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Aplicamos&lt;/span> &lt;span class="n">una&lt;/span> &lt;span class="n">compuerta&lt;/span> &lt;span class="n">CNOT&lt;/span> &lt;span class="n">usando&lt;/span> &lt;span class="n">q1&lt;/span> &lt;span class="n">como&lt;/span> &lt;span class="n">control&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">q2&lt;/span> &lt;span class="n">como&lt;/span> &lt;span class="n">objetivo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Esto&lt;/span> &lt;span class="n">genera&lt;/span> &lt;span class="n">entrelazamiento&lt;/span> &lt;span class="n">cuántico&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">entanglement&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">entre&lt;/span> &lt;span class="n">q1&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">q2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">CNOT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">q2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Para&lt;/span> &lt;span class="n">depurar&lt;/span> &lt;span class="n">durante&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">desarrollo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">podemos&lt;/span> &lt;span class="n">volcar&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">vector&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">en&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">simulador&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">DumpMachine&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="n">Descomentar&lt;/span> &lt;span class="n">si&lt;/span> &lt;span class="n">es&lt;/span> &lt;span class="n">necesario&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Realizamos&lt;/span> &lt;span class="n">la&lt;/span> &lt;span class="n">medición&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">al&lt;/span> &lt;span class="n">mismo&lt;/span> &lt;span class="n">tiempo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">reseteamos&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">forma&lt;/span> &lt;span class="n">segura&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">|&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">let&lt;/span> &lt;span class="n">res1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">MResetZ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">let&lt;/span> &lt;span class="n">res2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">MResetZ&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Devolvemos&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">par&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">resultados&lt;/span> &lt;span class="n">medidos&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">res1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">res2&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="c1"># Summary&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="n">Rutina&lt;/span> &lt;span class="n">principal&lt;/span> &lt;span class="n">que&lt;/span> &lt;span class="n">ejecuta&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">experimento&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">generación&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">medición&lt;/span> &lt;span class="n">del&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">Bell&lt;/span> &lt;span class="n">repetidas&lt;/span> &lt;span class="n">veces&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">recopila&lt;/span> &lt;span class="n">las&lt;/span> &lt;span class="n">estadísticas&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">los&lt;/span> &lt;span class="n">resultados&lt;/span>&lt;span class="o">.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="c1"># Input&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="c1">## count&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="n">Número&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">veces&lt;/span> &lt;span class="n">que&lt;/span> &lt;span class="n">se&lt;/span> &lt;span class="n">repetirá&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">experimento&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">por&lt;/span> &lt;span class="n">ejemplo&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">1000&lt;/span> &lt;span class="n">veces&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="c1"># Output&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">///&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">Número&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">veces&lt;/span> &lt;span class="n">que&lt;/span> &lt;span class="n">se&lt;/span> &lt;span class="n">observó&lt;/span> &lt;span class="n">cada&lt;/span> &lt;span class="n">caso&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="mi">00&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">respectivamente&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="err">@&lt;/span>&lt;span class="n">EntryPoint&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">operation&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">Int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">Int&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Inicializamos&lt;/span> &lt;span class="n">variables&lt;/span> &lt;span class="n">mutables&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">modificables&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="n">para&lt;/span> &lt;span class="n">contar&lt;/span> &lt;span class="n">las&lt;/span> &lt;span class="n">ocurrencias&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mutable&lt;/span> &lt;span class="n">num00&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mutable&lt;/span> &lt;span class="n">num01&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mutable&lt;/span> &lt;span class="n">num10&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mutable&lt;/span> &lt;span class="n">num11&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Ejecutamos&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">bucle&lt;/span> &lt;span class="n">del&lt;/span> &lt;span class="n">experimento&lt;/span> &lt;span class="n">la&lt;/span> &lt;span class="n">cantidad&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">veces&lt;/span> &lt;span class="n">especificada&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">_&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="mf">1.&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">count&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Generamos&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">estado&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">Bell&lt;/span> &lt;span class="n">y&lt;/span> &lt;span class="n">recibimos&lt;/span> &lt;span class="n">los&lt;/span> &lt;span class="n">resultados&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">la&lt;/span> &lt;span class="n">medición&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">let&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">r1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">r2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">GenerateAndMeasureBellState&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Incrementamos&lt;/span> &lt;span class="n">los&lt;/span> &lt;span class="n">contadores&lt;/span> &lt;span class="n">según&lt;/span> &lt;span class="n">el&lt;/span> &lt;span class="n">patrón&lt;/span> &lt;span class="n">de&lt;/span> &lt;span class="n">resultados&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">r1&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Zero&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">r2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Zero&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set&lt;/span> &lt;span class="n">num00&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">elif&lt;/span> &lt;span class="n">r1&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Zero&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">r2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">One&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set&lt;/span> &lt;span class="n">num01&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">elif&lt;/span> &lt;span class="n">r1&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">One&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">r2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">Zero&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set&lt;/span> &lt;span class="n">num10&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="o">//&lt;/span> &lt;span class="n">Caso&lt;/span> &lt;span class="n">r1&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">One&lt;/span> &lt;span class="ow">and&lt;/span> &lt;span class="n">r2&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="n">One&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">set&lt;/span> &lt;span class="n">num11&lt;/span> &lt;span class="o">+=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">//&lt;/span> &lt;span class="n">Mostramos&lt;/span> &lt;span class="n">las&lt;/span> &lt;span class="n">estadísticas&lt;/span> &lt;span class="n">recopiladas&lt;/span> &lt;span class="n">como&lt;/span> &lt;span class="n">un&lt;/span> &lt;span class="n">mensaje&lt;/span> &lt;span class="n">en&lt;/span> &lt;span class="n">la&lt;/span> &lt;span class="n">consola&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="s2">&amp;#34;--- Resultados del Experimento ---&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="s2">&amp;#34;Ejecuciones totales: {count}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="s2">&amp;#34;00 observado: {num00}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="s2">&amp;#34;01 observado: {num01}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="s2">&amp;#34;10 observado: {num10}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Message&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="s2">&amp;#34;11 observado: {num11}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">num00&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num01&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num10&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">num11&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="explicación-del-código-y-verificación-de-funcionamiento">Explicación del código y verificación de funcionamiento
&lt;/h3>&lt;ul>
&lt;li>&lt;code>namespace&lt;/code>: Al igual que en Java o C#, es la declaración del espacio de nombres para organizar lógicamente el programa y evitar conflictos de nombres.&lt;/li>
&lt;li>&lt;code>open&lt;/code>: Importa las bibliotecas (módulos) necesarias. &lt;code>Microsoft.Quantum.Intrinsic&lt;/code> contiene las compuertas cuánticas básicas como H, X, Y, Z, CNOT, etc., y &lt;code>Microsoft.Quantum.Measurement&lt;/code> incluye funciones útiles para la medición, como &lt;code>MResetZ&lt;/code>.&lt;/li>
&lt;li>&lt;code>use (q1, q2) = (Qubit(), Qubit());&lt;/code>: Se están asignando (alocando) dinámicamente dos qubits.&lt;/li>
&lt;li>&lt;code>H(q1); CNOT(q1, q2);&lt;/code>: Estas dos líneas son exactamente el núcleo que genera el entrelazamiento cuántico. Se puede escribir de forma muy sencilla e intuitiva.&lt;/li>
&lt;li>&lt;code>let res1 = MResetZ(q1);&lt;/code>: Como se mencionó antes, &lt;code>MResetZ&lt;/code> vincula el resultado de la medición a la variable y simultáneamente fuerza el restablecimiento del qubit al estado $|0\rangle$. Esto permite liberar los qubits de forma segura al finalizar el bloque &lt;code>use&lt;/code>.&lt;/li>
&lt;li>&lt;code>@EntryPoint()&lt;/code>: Al añadir este atributo, indicamos al compilador que esta operación es el punto de inicio de ejecución del programa (similar a la función &lt;code>main&lt;/code> en el lenguaje C).&lt;/li>
&lt;/ul>
&lt;p>En teoría, el estado generado es el estado de Bell $\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$, por lo que, si ejecutamos este programa suficientes veces (por ejemplo, 10,000 veces), deberíamos observar &lt;code>00&lt;/code> y &lt;code>11&lt;/code> aproximadamente un 50% de las veces cada uno (alrededor de 5,000 veces), mientras que &lt;code>01&lt;/code> y &lt;code>10&lt;/code> se observarán 0 veces (no se observarán en absoluto si no hay errores teóricos). Esta es la prueba de que los dos qubits tienen una fuerte correlación (están entrelazados).&lt;/p>
&lt;h2 id="7-integración-fluida-con-lenguajes-anfitriones-python--c">7. Integración fluida con lenguajes anfitriones (Python / C#)
&lt;/h2>&lt;p>Como vimos en el ejemplo anterior, Q# puede ejecutarse por sí solo indicando el punto de entrada &lt;code>@EntryPoint()&lt;/code> (Aplicación independiente de Q#). Sin embargo, en casos de uso de investigación y desarrollo empresarial real, a menudo se usa en estrecha colaboración con procesos clásicos, como una interfaz gráfica (GUI) frontend, la obtención de datos desde enormes bases de datos, o bucles de optimización en aprendizaje automático (como la actualización de parámetros en VQE). Debido a esto, Q# ofrece una interoperabilidad (Interoperability) refinada para que pueda ser invocado directamente desde lenguajes anfitriones como Python o C# (.NET) de una manera extremadamente fácil.&lt;/p>
&lt;h3 id="71-ejemplo-de-invocación-desde-python-para-científicos-de-datos">7.1 Ejemplo de invocación desde Python: Para científicos de datos
&lt;/h3>&lt;p>Para llamar a Q# desde Python, que tiene una cuota de mercado abrumadora en ciencia de datos, aprendizaje automático e investigación física, se utiliza el paquete de Python &lt;code>qsharp&lt;/code>. También tiene una alta afinidad con Jupyter Notebook, siendo ideal para combinar con desarrollo interactivo y visualización de datos.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. Importar el módulo necesario para integrar Q#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">qsharp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. Importar operaciones de Q# directamente como si fueran funciones de Python&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># (El compilador realiza el enlace (binding) y la compilación en segundo plano de forma automática)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">Quantum.BellState&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. Invocar la ejecución desde un script de Python (usando el simulador)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">count&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Starting quantum simulation for &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> iterations...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Al llamar al método simulate(), se ejecuta en el simulador local&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">simulate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">count&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Se recibe la tupla de resultados, que Python formatea y muestra&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">--- Simulation Results ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|00&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected ~500)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|01&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected 0)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|10&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected 0)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;|11&amp;gt; : &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> (Expected ~500)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dado que el compilador y el intérprete de Q# generan enlaces dinámicos de forma transparente en segundo plano a través de una API en C, desde el código Python un algoritmo cuántico se trata como una simple función de caja negra, lo que hace extremadamente sencillo construir algoritmos híbridos clásico-cuánticos.&lt;/p>
&lt;h3 id="72-ejemplo-de-invocación-desde-c-para-el-desarrollo-empresarial">7.2 Ejemplo de invocación desde C#: Para el desarrollo empresarial
&lt;/h3>&lt;p>Se puede integrar código de Q# exactamente de la misma forma utilizando C#, lo cual es muy potente en sistemas backend a gran escala o en el desarrollo de aplicaciones empresariales. Al ubicar un proyecto de Q# (.csproj) en la misma solución que un proyecto de C# y establecer referencias entre ellos, se genera automáticamente una clase envoltura (wrapper) para C# al momento de la compilación.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">System.Threading.Tasks&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.Quantum.Simulation.Simulators&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Espacio de nombres del simulador cuántico&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Quantum.BellState&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Espacio de nombres definido en Q#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">namespace&lt;/span> &lt;span class="nn">QuantumRunner&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">class&lt;/span> &lt;span class="nc">Program&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">static&lt;/span> &lt;span class="kd">async&lt;/span> &lt;span class="n">Task&lt;/span> &lt;span class="n">Main&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">[]&lt;/span> &lt;span class="n">args&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Instanciar el simulador cuántico de estado completo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Como implementa IDisposable, gestionamos correctamente los recursos con &amp;#39;using&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">using&lt;/span> &lt;span class="nn">var&lt;/span> &lt;span class="n">sim&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">QuantumSimulator&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">long&lt;/span> &lt;span class="n">count&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">1000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;Running {count} iterations of Bell State generation...&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Se ejecuta asíncronamente la operación de Q#. El método Run se genera automáticamente.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Le pasamos &amp;#39;sim&amp;#39; como destino de ejecución y &amp;#39;count&amp;#39; como argumento.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kt">var&lt;/span> &lt;span class="n">result&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">RunBellStateExperiment&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sim&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">count&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Los resultados se devuelven como una ValueTuple en C#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|00&amp;gt;: {result.Item1}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|01&amp;gt;: {result.Item2}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|10&amp;gt;: {result.Item3}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">$&amp;#34;|11&amp;gt;: {result.Item4}&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Aquí se utiliza la clase local &lt;code>QuantumSimulator&lt;/code> para propósitos de desarrollo, pero al momento de transicionar al entorno de producción, la parte donde se crea la instancia de este simulador simplemente se reemplaza con un objeto de proveedor de hardware en la nube que apunte al espacio de trabajo de Azure Quantum (por ejemplo, los objetos de máquina de IonQ o Quantinuum). Sin modificar en lo más mínimo la lógica de negocio ni el código del lado de Q#, es posible ejecutar el algoritmo en un hardware cuántico real en la nube. ¡Esa es la verdadera esencia de QDK!&lt;/p>
&lt;h2 id="8-temas-avanzados-características-que-encarnan-la-filosofía-de-diseño-de-q">8. Temas avanzados: Características que encarnan la filosofía de diseño de Q#
&lt;/h2>&lt;p>Hemos visto el uso básico de Q#, pero ahora profundicemos un poco más en las funcionalidades avanzadas y la filosofía de diseño de Q#. Estas características son los elementos que hacen de Q# algo más que un simple &amp;ldquo;reemplazo de Python&amp;rdquo;: un verdadero lenguaje específico de dominio cuántico.&lt;/p>
&lt;h3 id="81-generación-automática-de-operaciones-inversas-adjoint-y-operaciones-controladas-controlled">8.1 Generación automática de operaciones inversas (Adjoint) y operaciones controladas (Controlled)
&lt;/h3>&lt;p>Una de las grandes características de la computación cuántica es la &amp;ldquo;reversibilidad&amp;rdquo; (Reversibility) derivada de la unitariedad (Unitarity). Todas las operaciones fundamentales, a excepción de las mediciones, son matrices unitarias, por lo tanto, siempre existe una matriz inversa (operación inversa) que permite deshacerlas. Q# proporciona potentes modificadores funcionales llamados &lt;code>Adjoint&lt;/code> (adjunto/operación inversa) y &lt;code>Controlled&lt;/code> (operación controlada) que respaldan esto como una característica de primera clase a nivel de lenguaje.&lt;/p>
&lt;p>Para una operación cuántica dada &lt;code>Op&lt;/code>, el desarrollador no tiene que calcular la matriz de la operación inversa o invertir el orden de las compuertas a mano para implementarla. Con solo añadir ciertas palabras clave a la firma de la función, el compilador Q# generará automáticamente &lt;code>Adjoint Op&lt;/code>. Además, también es posible generar automáticamente la operación condicional &lt;code>Controlled Op&lt;/code>, que ejecuta &lt;code>Op&lt;/code> solo si todos los qubits del grupo especificado están en estado $|1\rangle$.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">// Al añadir &amp;#39;is Adj + Ctl&amp;#39;, indicamos al compilador que genere automáticamente las operaciones inversas y controladas
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operation MyComplexSubroutine(qubits: Qubit[]) : Unit is Adj + Ctl {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Aquí se escribe una secuencia de compuertas cuánticas muy complejas
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Ejemplo: combinaciones de H, T, CNOT y desplazamientos de fase arbitrarios, etc.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">// Ejemplo desde el lado que invoca la función
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">operation UseMyOp(controlQubit: Qubit, targetQubits: Qubit[]) : Unit {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Invocación normal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> MyComplexSubroutine(targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Ejecución de la operación inversa: Revierte completamente al estado original (muy útil para &amp;#34;descomputación&amp;#34;)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Adjoint MyComplexSubroutine(targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Ejecución de la operación controlada: Solo ejecuta la subrutina compleja si &amp;#39;controlQubit&amp;#39; es |1&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Controlled MyComplexSubroutine([controlQubit], targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> // Además, ¡también es posible combinar esto, por ejemplo con la inversa de la operación controlada!
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Controlled Adjoint MyComplexSubroutine([controlQubit], targetQubits);
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Gracias a esta función, la implementación de subrutinas complejas, como la implementación del oráculo en el algoritmo de búsqueda de Grover o el algoritmo de factorización de Shor, y sus correspondientes operaciones inversas (para deshacer el entrelazamiento innecesario, también conocido como &amp;ldquo;descomputación&amp;rdquo;: Uncomputation), se simplifica drásticamente y se reduce enormemente el margen para introducir errores humanos o fallos. Esta es una de las mayores ventajas que Q#, como lenguaje descriptivo de algoritmos, tiene frente a otras herramientas como Qiskit (un modelo de construcción de circuitos).&lt;/p>
&lt;h3 id="82-estimación-de-recursos-resource-estimation-y-la-preparación-para-el-futuro">8.2 Estimación de recursos (Resource Estimation) y la preparación para el futuro
&lt;/h3>&lt;p>Las computadoras cuánticas actuales se encuentran en una fase de desarrollo conocida como &amp;ldquo;NISQ&amp;rdquo; (Noisy Intermediate-Scale Quantum), donde la cantidad de qubits disponibles es escasa (de decenas a cientos) y las tasas de error son altas. Sin embargo, mirando hacia el futuro y hacia la era de las computadoras cuánticas tolerantes a fallos (FTQC: Fault-Tolerant Quantum Computer), al ejecutar un nuevo algoritmo, será extremadamente importante prever de forma precisa: &amp;ldquo;¿Cuántos qubits lógicos se necesitan realmente?&amp;rdquo;, &amp;ldquo;¿Cuántas veces se usarán compuertas como T o Toffoli, que tienen un costo altísimo en términos de corrección de errores?&amp;rdquo; o &amp;ldquo;¿Cuánto durará el tiempo de ejecución?&amp;rdquo;.&lt;/p>
&lt;p>El QDK incluye el &amp;ldquo;Estimador de recursos&amp;rdquo; (Resource Estimator) como uno de los objetivos del entorno de ejecución. Al usar esto, en lugar de ejecutar el código en un hardware real o en un simulador de estado completo intensivo, el programa puede analizar las rutas lógicas del código para calcular y reportar instantáneamente los recursos requeridos para algoritmos a gran escala. Gracias a esto, los investigadores y diseñadores de algoritmos pueden iterar rápidamente sobre las optimizaciones, no solo a nivel de la complejidad computacional teórica, sino a nivel de la cantidad específica de compuertas requeridas, incluso para los algoritmos del futuro que requerirán miles o millones de qubits.&lt;/p>
&lt;h2 id="9-conclusión-expectativas-para-la-próxima-generación-de-ingenieros-de-software">9. Conclusión: Expectativas para la próxima generación de ingenieros de software
&lt;/h2>&lt;p>La computación cuántica está migrando rápidamente de ser un puro concepto teórico confinado a las mentes de físicos como Einstein, Schrödinger y Feynman, a ser ahora un campo de implementación práctica de la ingeniería accesible para cualquier persona en el mundo a través del navegador o la línea de comandos, gracias a la infraestructura en la nube (Azure Quantum, AWS Braket, IBM Quantum, etc.). La velocidad a la que evoluciona el hardware es asombrosa, y muchos expertos predicen que el día en que se demuestre una ventaja cuántica &amp;ldquo;útil&amp;rdquo; está a solo unos pocos años de distancia.&lt;/p>
&lt;p>El lenguaje Q# de Microsoft, presentado en este artículo, ha introducido maravillosamente las mejores prácticas (tipado fuerte, elementos de programación funcional, modularidad, encapsulación y potentes herramientas de asistencia de IDE) desarrolladas durante décadas en el mundo de la programación clásica al área completamente nueva de la programación cuántica. Al aprender Q# y durante el proceso de implementar algoritmos cuánticos, podemos obtener perspectivas profundas sobre la raíz misma de las ciencias de la computación y la física: preguntas como &amp;ldquo;¿Qué es un estado?&amp;rdquo;, &amp;ldquo;¿Qué significa medir?&amp;rdquo; o &amp;ldquo;¿Cómo se propaga la información a través del espacio?&amp;rdquo;. Esto va mucho más allá de simplemente adquirir nuevas habilidades; es una experiencia que conlleva un tremendo estímulo intelectual.&lt;/p>
&lt;p>En un futuro cercano, de la misma manera que los ingenieros de aprendizaje automático actuales aprovechan las capacidades de cálculo paralelo de las GPUs con normalidad usando PyTorch o TensorFlow, la nueva generación de &amp;ldquo;ingenieros de software cuántico&amp;rdquo; extraerá la capacidad computacional trascendental de las QPU (Quantum Processing Unit) utilizando herramientas como Q# o Qiskit para enfrentar desafíos de la humanidad a gran escala. Veremos el descubrimiento de nuevos materiales mediante las ciencias de materiales, simulaciones moleculares aplicadas a la creación de fármacos, modelados sobre el cambio climático y la optimización de riesgos financieros, entre otros.&lt;/p>
&lt;p>Para todos los desarrolladores de software que hoy se dedican principalmente a crear aplicaciones web clásicas, aplicaciones móviles o al análisis de datos, los invito a entrar al mundo de la programación cuántica con esta gran oportunidad. Es normal sentirse confundido al principio debido a los fenómenos contraintuitivos propios de la mecánica cuántica (superposición, entrelazamiento y comportamientos probabilísticos). Sin embargo, el refinado lenguaje dedicado Q# y la robusta cadena de herramientas QDK proporcionarán un respaldo certero y potente a lo largo de tu curva de aprendizaje.&lt;/p>
&lt;h2 id="10-referencias-y-enlaces-para-aprender-más-en-profundidad">10. Referencias y enlaces para aprender más en profundidad
&lt;/h2>&lt;p>A continuación te presentamos algunos de los mejores recursos para continuar tu viaje por la programación cuántica.&lt;/p>
&lt;ul>
&lt;li>&lt;a class="link" href="https://learn.microsoft.com/azure/quantum/" target="_blank" rel="noopener"
>Documentación oficial de Microsoft Azure Quantum&lt;/a> : Portal de documentación completo para el QDK y Azure Quantum.&lt;/li>
&lt;li>&lt;a class="link" href="https://learn.microsoft.com/azure/quantum/user-guide/" target="_blank" rel="noopener"
>Guía de usuario y referencia de Q#&lt;/a> : Referencia completa de la sintaxis, el sistema de tipos y la biblioteca estándar de Q#.&lt;/li>
&lt;li>&lt;a class="link" href="https://quantum.microsoft.com/en-us/experience/quantum-katas" target="_blank" rel="noopener"
>Quantum Katas&lt;/a> : Un conjunto de tutoriales de código abierto que ofrece Microsoft. Con un enfoque basado en Desarrollo Dirigido por Pruebas (TDD), es un excelente recurso para auto-estudiar de forma interactiva los conceptos básicos de computación cuántica (compuertas, mediciones y construcción de algoritmos) mientras escribes tu propio código en Q#.&lt;/li>
&lt;li>&lt;a class="link" href="https://github.com/microsoft/qsharp-compiler" target="_blank" rel="noopener"
>Repositorio en GitHub de Q#&lt;/a> : El compilador del lenguaje Q# y su biblioteca estándar se desarrollan activamente bajo código abierto. Es de lectura obligada para cualquiera que esté interesado en cómo funcionan internamente los compiladores.&lt;/li>
&lt;/ul>
&lt;p>El futuro de la computación cuántica apenas ha comenzado y está lleno de infinitas posibilidades. ¡Espero que asumas el desafío de programar con Q# con una mentalidad abierta a disfrutar de este nuevo paradigma de programación!&lt;/p></description></item></channel></rss>