Articulo de referencia

Q Sharp

{{Cite web|url=https://arstechnica.com/gadgets/2017/12/microsofts-q-quantum-programming-language-out-now-in-preview/|title=Microsoft's Q# quantum programming language out now in...

Q# (pronunciado Q sharp ) es un lenguaje de programación específico de dominio utilizado para expresar algoritmos cuánticos . [ 3 ] Inicialmente fue lanzado al público por Microsoft como parte del Kit de Desarrollo Cuántico. [ 4 ]

Q# funciona en conjunto con lenguajes clásicos como C#, Python y F#, y está diseñado para permitir el uso de conceptos de programación tradicionales en computación cuántica, incluyendo funciones con variables y bifurcaciones, así como un entorno de desarrollo con resaltado de sintaxis y un depurador cuántico. [ 1 ] [ 5 ] [ 6 ]

Historia

Históricamente, Microsoft Research tuvo dos equipos interesados ​​en la computación cuántica: el equipo QuArC con sede en Redmond, Washington, [ 7 ] dirigido por Krysta Svore , que exploró la construcción de circuitos cuánticos, y Station Q inicialmente ubicada en Santa Bárbara y dirigida por Michael Freedman , que exploró la computación cuántica topológica . [ 8 ] [ 9 ]

Durante una conferencia magistral de Microsoft Ignite el 26 de septiembre de 2017, Microsoft anunció que lanzaría un nuevo lenguaje de programación específicamente orientado a las computadoras cuánticas. [ 10 ] El 11 de diciembre de 2017, Microsoft lanzó Q# como parte del Kit de Desarrollo Cuántico. [ 4 ]

En Build 2019 , Microsoft anunció que liberaría el código fuente del Quantum Development Kit, incluidos sus compiladores y simuladores Q#. [ 11 ]

Para dar soporte a Q#, Microsoft desarrolló la Representación Intermedia Cuántica (QIR) en 2023 como una interfaz común entre los lenguajes de programación y los procesadores cuánticos de destino. La compañía también anunció una extensión del compilador que genera QIR a partir de Q#. [ 12 ]

Bettina Heim solía liderar el esfuerzo de desarrollo del lenguaje Q#. [ 13 ] [ 14 ]

Uso

Q# está disponible como una extensión descargable por separado para Visual Studio , [ 15 ] pero también se puede ejecutar como una herramienta independiente desde la línea de comandos o Visual Studio Code. Q# se introdujo en Windows y está disponible en macOS y Linux. [ 16 ]

El kit de desarrollo cuántico incluye un simulador cuántico capaz de ejecutar Q# y simular 30 cúbits lógicos. [ 17 ] [ 18 ]

Para invocar el simulador cuántico, se utiliza otro lenguaje de programación .NET , generalmente C# , que proporciona los datos de entrada (clásicos) para el simulador y lee los datos de salida (clásicos) del simulador. [ 19 ]

Características

Una característica fundamental de Q# es la capacidad de crear y utilizar cúbits para algoritmos. En consecuencia, algunas de las características más destacadas de Q# son la capacidad de entrelazar y superponer cúbits mediante compuertas NOT controladas y compuertas Hadamard , respectivamente, así como compuertas Toffoli , compuertas X, Y, Z de Pauli y muchas más que se utilizan para diversas operaciones (véase compuertas lógicas cuánticas ).

Se espera que la pila de hardware que eventualmente se integrará con Q# implemente los cúbits como cúbits topológicos . El simulador cuántico que se incluye actualmente con el Kit de Desarrollo Cuántico es capaz de procesar hasta 32 cúbits en una máquina de usuario y hasta 40 cúbits en Azure . [ 20 ]

Documentación y recursos

Actualmente, los recursos disponibles para Q# son escasos, pero la documentación oficial está publicada en Microsoft Developer Network: Q# . El repositorio de Microsoft Quantum en GitHub también contiene una amplia colección de programas de ejemplo que implementan diversos algoritmos cuánticos y sus pruebas.

Microsoft también organizó un concurso de programación cuántica en Codeforces , llamado Microsoft Q# Coding Contest - Codeforces , y proporcionó material relacionado para ayudar a responder las preguntas de las publicaciones del blog, además de las soluciones detalladas en los tutoriales.

Microsoft ofrece en GitHub un conjunto de ejercicios de aprendizaje para ayudar a aprender Q#: microsoft/QuantumKatas, con enlaces a recursos y respuestas a los problemas.

Sintaxis

Q# está sintácticamente relacionado con C# y F#, pero también presenta algunas diferencias significativas.

Similitudes con C#

  • Usos namespacepara el aislamiento de código
  • Todas las declaraciones terminan con una;
  • Las llaves se utilizan para las declaraciones de alcance.
  • Los comentarios de una sola línea se realizan utilizando//
  • Los tipos de datos variables como IntDoubleStringy Boolson similares, aunque se escriben con mayúscula inicial (e Int es de 64 bits) [ 21 ].
  • Los cúbits se asignan y se liberan dentro de un usingbloque.
  • Las funciones lambda se definen utilizando el operador.=>
  • Los resultados se devuelven utilizando la returnpalabra clave.

Similitudes con F#

  • Las variables se declaran usando leto mutable[ 3 ]
  • Funciones de primer orden
  • Módulos que se importan usando la openpalabra clave
  • El tipo de dato se declara después del nombre de la variable.
  • El operador de la gama..
  • for … inbucles
  • Cada operación/función tiene un valor de retorno, en lugar de void. En lugar de , se devuelve voiduna tupla vacía.()
  • Definición de tipos de datos de registro (usando la newtypepalabra clave, en lugar de type).

Diferencias

  • Las funciones se declaran utilizando la functionpalabra clave
  • Las operaciones en la computadora cuántica se declaran utilizando la operationpalabra clave
  • Falta de comentarios multilínea
  • Afirma en lugar de lanzar excepciones
  • La documentación está escrita en Markdown en lugar de utilizar etiquetas de documentación basadas en XML.

Ejemplo

El siguiente código fuente es un multiplexor del repositorio oficial de la biblioteca Q# de Microsoft.

// Copyright (c) Microsoft Corporation. // Licenciado bajo la Licencia MIT.espacio de nombres Microsoft . Quantum . Canon { abrir Microsoft.Quantum.Intrinsic ; abrir Microsoft.Quantum.Arithmetic ; abrir Microsoft.Quantum.Arrays ; abrir Microsoft.Quantum.Diagnostics ; abrir Microsoft.Quantum.Math ;/// # Resumen /// Aplica una operación unitaria controlada por multiplicación $U$ que aplica una /// operación unitaria $V_j$ cuando es controlada por el estado numérico de n qubits $\ket{j}$. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Entrada /// ## unitaryGenerator /// Una tupla donde el primer elemento `Int` es el número de operaciones unitarias $N$, /// y el segundo elemento `(Int -> ('T => () is Adj + Ctl))` /// es una función que toma un entero $j$ en $[0,N-1]$ y produce la operación unitaria /// $V_j$. /// /// ## índice /// Registro de control de $n$ qubits que codifica los estados numéricos $\ket{j}$ en /// formato little-endian. /// /// ## objetivo /// Registro genérico de cúbito sobre el que actúa $V_j$. /// /// # Observaciones /// Los `coeficientes` se rellenarán con elementos identidad si /// se especifican menos de $2^n$. Esta implementación utiliza /// $n-1$ cúbitos auxiliares. /// /// # Referencias /// - [ *Andrew M. Childs, Dmitri Maslov, Yunseong Nam, Neil J. Ross, Yuan Su*, /// arXiv:1711.10980](https://arxiv.org/abs/1711.10980) operation MultiplexOperationsFromGenerator < ' T >( unitaryGenerator : ( Int , ( Int -> ( ' T => Unit is Adj + Ctl ))), index : LittleEndian , target : ' T ) : Unit is Ctl + Adj { let ( nUnitaries , unitaryFunction ) = unitaryGenerator ; let unitaryGeneratorWithOffset = ( nUnitaries , 0 , unitaryFunction ); if Length ( index !) == 0 { fail "MultiplexOperations falló. El número de qubits del índice debe ser mayor que 0." ; } si nUnitaries > 0 { let auxiliary = [] ; Adjoint MultiplexOperationsFromGeneratorImpl ( unitaryGeneratorWithOffset , auxiliary , index , target); } }/// # Resumen /// Paso de implementación de `MultiplexOperationsFromGenerator`. /// # Ver también /// - Operación interna de Microsoft.Quantum.Canon.MultiplexOperationsFromGenerator MultiplexOperationsFromGeneratorImpl < ' T >( unitaryGenerator : ( Int , Int , ( Int -> ( ' T => Unit is Adj + Ctl ))), auxiliary : Qubit [] , index : LittleEndian , target : ' T ) : Unit { body (...) { let nIndex = Length ( index !); let nStates = 2 ^ nIndex ;let ( nUnitaries , unitaryOffset , unitaryFunction ) = unitaryGenerator ;let nUnitariesLeft = MinI ( nUnitaries , nStates / 2 ); let nUnitariesRight = MinI ( nUnitaries , nStates );let leftUnitaries = ( nUnitariesLeft , unitaryOffset , unitaryFunction ); let rightUnitaries = ( nUnitariesRight - nUnitariesLeft , unitaryOffset + nUnitariesLeft , unitaryFunction );let newControls = LittleEndian ( Most ( index !));Si nUnitarios > 0 { si Longitud ( auxiliar ) == 1 y nÍndice == 0 { // Caso de terminación( Adjunto controlado ( unitaryFunction ( unitaryOffset )))( auxiliar , objetivo ); } elif Length ( auxiliar ) == 0 y nIndex >= 1 { // Caso de inicio let newauxiliary = Tail ( índice !); if nUnitariesRight > 0 { MultiplexOperationsFromGeneratorImpl ( rightUnitaries , [ newauxiliary ], newControls , objetivo ); } within { X ( newauxiliary ); } apply { MultiplexOperationsFromGeneratorImpl ( leftUnitaries , [ newauxiliary ], newControls , objetivo ); } } else { // Recursión que reduce nIndex en 1 y establece Length(auxiliary) en 1. let controls = [ Tail ( índice !)] + auxiliary ; use newauxiliary = Qubit () ; use andauxiliary = Qubit [ MaxI ( 0 , Length ( controles ) - 2 )]; dentro de { ApplyAndChain ( andauxiliary , controls , newauxiliary ); } aplicar { si nUnitariesRight > 0 { MultiplexOperationsFromGeneratorImpl ( rightUnitaries , [ newauxiliary ], newControls , target ); } dentro de { ( Controlled X )( auxiliary , newauxiliary ); } aplicar { MultiplexOperationsFromGeneratorImpl ( leftUnitaries , [ newauxiliary ], newControls , target ); }} } } } adjunto automático ; controlado ( controlRegister , ...) { MultiplexOperationsFromGeneratorImpl ( unitaryGenerator , auxiliar + controlRegister , índice , objetivo ); } adjunto controlado automático ; }/// # Resumen /// Aplica una operación unitaria controlada por multiplicación $U$ que aplica una /// operación unitaria $V_j$ cuando es controlada por el estado numérico de n qubits $\ket{j}$. /// /// $U = \sum^{N-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Entrada /// ## unitaryGenerator /// Una tupla donde el primer elemento `Int` es el número de operaciones unitarias $N$, /// y el segundo elemento `(Int -> ('T => () is Adj + Ctl))` /// es una función que toma un entero $j$ en $[0,N-1]$ y produce la operación unitaria /// $V_j$. /// /// ## índice /// Registro de control de $n$ qubits que codifica los estados numéricos $\ket{j}$ en /// formato little-endian. /// /// ## objetivo /// Registro genérico de cúbito sobre el que actúa $V_j$. /// /// # Observaciones /// Los `coeficientes` se rellenarán con elementos identidad si /// se especifican menos de $2^n$. Esta versión se implementa /// directamente mediante un bucle a través de operadores unitarios controlados por n. operación MultiplexOperationsBruteForceFromGenerator < ' T >( unitaryGenerator : ( Int , ( Int -> ( ' T => Unit is Adj + Ctl ))), index : LittleEndian , target : ' T ) : Unit is Adj + Ctl { let nIndex = Length ( index !); let nStates = 2 ^ nIndex ; let ( nUnitaries , unitaryFunction ) = unitaryGenerator ; para idxOp en 0 .. MinI ( nStates , nUnitaries ) - 1 { ( ControlledOnInt ( idxOp , unitaryFunction ( idxOp )))( index !, target ); } }/// # Resumen /// Devuelve una operación unitaria controlada por multiplicación $U$ que aplica una /// operación unitaria $V_j$ cuando es controlada por el estado numérico de n qubits $\ket{j}$. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Entrada /// ## unitaryGenerator /// Una tupla donde el primer elemento `Int` es el número de operaciones unitarias $N$, /// y el segundo elemento `(Int -> ('T => () is Adj + Ctl))` /// es una función que toma un entero $j$ en $[0,N-1]$ y produce la operación unitaria /// $V_j$. /// /// # Salida /// Una operación unitaria controlada por multiplicación $U$ que aplica operaciones unitarias /// descritas por `unitaryGenerator`. /// /// # Ver también /// - Microsoft.Quantum.Canon.MultiplexOperationsFromGenerator function MultiplexerFromGenerator ( unitaryGenerator : ( Int , ( Int -> ( Qubit [] => Unit is Adj + Ctl )))) : (( LittleEndian , Qubit [] ) => Unit is Adj + Ctl ) { return MultiplexOperationsFromGenerator ( unitaryGenerator , _, _); }/// # Resumen /// Devuelve una operación unitaria controlada por multiplicación $U$ que aplica una /// operación unitaria $V_j$ cuando es controlada por el estado numérico de n qubits $\ket{j}$. /// /// $U = \sum^{2^n-1}_{j=0}\ket{j}\bra{j}\otimes V_j$. /// /// # Entrada /// ## unitaryGenerator /// Una tupla donde el primer elemento `Int` es el número de operaciones unitarias $N$, /// y el segundo elemento `(Int -> ('T => () is Adj + Ctl))` /// es una función que toma un entero $j$ en $[0,N-1]$ y produce la operación unitaria /// $V_j$. /// /// # Salida /// Una operación unitaria controlada por multiplicación $U$ que aplica operaciones unitarias /// descritas por `unitaryGenerator`. /// /// # Ver también /// - Microsoft.Quantum.Canon.MultiplexOperationsBruteForceFromGenerator function MultiplexerBruteForceFromGenerator ( unitaryGenerator : ( Int , ( Int -> ( Qubit [] => Unit is Adj + Ctl )))) : (( LittleEndian , Qubit [] ) => Unit is Adj + Ctl ) { return MultiplexOperationsBruteForceFromGenerator ( unitaryGenerator , _, _); }/// # Resumen /// Calcula una cadena de puertas AND /// /// # Descripción /// Los cúbits auxiliares para calcular resultados temporales deben especificarse explícitamente. /// La longitud de ese registro es `Length(ctrlRegister) - 2`, si hay al menos /// dos controles, de lo contrario la longitud es 0. internal operation ApplyAndChain ( auxRegister : Qubit [] , ctrlRegister : Qubit [] , target : Qubit ) : Unit is Adj { if Length ( ctrlRegister ) == 0 { X ( target ); } elif Length ( ctrlRegister ) == 1 { CNOT ( Head ( ctrlRegister ), target ); } else { EqualityFactI ( Length ( auxRegister ), Length ( ctrlRegister )); let controls1 = ctrlRegister [ 0 .. 0 ] + auxRegister ; let controls2 = Rest ( ctrlRegister ); let targets = auxRegister + [ target ]; ApplyToEachA ( ApplyAnd , Zipped3 ( controls1 , controls2 , targets )); } } }

Referencias

  1. 1 2 "El lenguaje de programación cuántica Q# de Microsoft ya está disponible en versión preliminar" . Ars Technica . 12 de diciembre de 2017. Consultado el 4 de septiembre de 2024 .
  2. "Introducción a Q#" (PDF) . Universidad de Washington .
  3. 1 2 QuantumWriter. "El lenguaje de programación Q#" . docs.microsoft.com . Consultado el 11 de diciembre de 2017 .
  4. 1 2 "Anuncio del kit de desarrollo cuántico de Microsoft" . Consultado el 11 de diciembre de 2017 .
  5. "Microsoft apuesta por la próxima ola de computación con un kit de herramientas de computación cuántica" . Ars Technica . 25 de septiembre de 2017. Consultado el 4 de septiembre de 2024 .
  6. "Las computadoras cuánticas apenas existen; aquí les explicamos por qué estamos escribiendo lenguajes para ellas de todos modos" . MIT Technology Review . 22 de diciembre de 2017. Consultado el 4 de septiembre de 2024 .
  7. "Resolviendo el problema cuántico de muchos cuerpos con redes neuronales artificiales" . Microsoft Azure Quantum . 15 de febrero de 2017.
  8. Blog de Scott Aaronson , 2013, 'Microsoft: De QDOS a QMA en menos de 35 años', https://scottaaronson.blog/?p=1471
  9. "¿Qué son el lenguaje de programación Q# y QDK? - Azure Quantum" . learn.microsoft.com . 12 de enero de 2024.
  10. "Microsoft anuncia un lenguaje de programación para computación cuántica" . Consultado el 14 de diciembre de 2017 .
  11. "Microsoft está liberando el código fuente de su kit de desarrollo cuántico" . Archivado del original el 23 de enero de 2021. Consultado el 12 de diciembre de 2020 .
  12. Krill, Paul (29 de septiembre de 2020). "Microsoft recurre a LLVM para la computación cuántica" . InfoWorld . Consultado el 4 de septiembre de 2024 .
  13. "Las mujeres de QuArC" . 30 de marzo de 2019.
  14. "Introducción a Q# - Introducción al desarrollo de software cuántico" . stem.mitre.org .
  15. QuantumWriter. "Configuración del entorno de desarrollo Q#" . docs.microsoft.com . Consultado el 14 de diciembre de 2017 .
  16. Coppock, Mark (26 de febrero de 2018). "El lenguaje de computación cuántica de Microsoft ya está disponible para MacOS" . Digital Trends . Consultado el 4 de septiembre de 2024 .
  17. Akdogan, Erman (23 de octubre de 2022). "La computación cuántica llega a las finanzas y las criptomonedas" . Medium .
  18. Melanson, Mike (16 de diciembre de 2017). "Esta semana en programación: Obtén Quantum con Q Sharp" . The New Stack . Recuperado el 4 de septiembre de 2024 .
  19. "Esta semana en programación: ¡Adéntrate en la computación cuántica con Q Sharp!" . The New Stack . 16 de diciembre de 2017.
  20. "Microsoft presenta un kit de desarrollo de computación cuántica" . CIO . Archivado del original el 30/10/2022 . Consultado el 30/10/2022 .
  21. "Tipos en Q# - Microsoft Quantum" . docs.microsoft.com . 27 de julio de 2022.
  • Sitio web oficial
  • qsharp-language en GitHub (ahora obsoleto)
  • qsharp en GitHub (repositorio QDK moderno)