La programación cuántica es el proceso de diseñar o ensamblar secuencias de instrucciones, llamadas circuitos cuánticos, utilizando puertas, interruptores y operadores para manipular un sistema cuántico para obtener un resultado deseado de un experimento determinado. Los algoritmos de circuitos cuánticos se pueden implementar en circuitos integrados, ejecutar con instrumentación o escribir en un lenguaje de programación para su uso con una computadora cuántica o un procesador cuántico.
En los sistemas basados en procesadores cuánticos, los lenguajes de programación cuántica ayudan a expresar algoritmos cuánticos mediante construcciones de alto nivel. [1] El campo está profundamente arraigado en la filosofía de código abierto y, como resultado, la mayor parte del software cuántico analizado en este artículo está disponible de forma gratuita como software de código abierto . [2]
Las computadoras cuánticas, como las basadas en el protocolo KLM , un modelo de computación cuántica óptica lineal (LOQC), utilizan algoritmos (circuitos) cuánticos implementados con electrónica, circuitos integrados, instrumentación, sensores y/o por otros medios físicos. [ no verificado en el cuerpo ]
Otros circuitos diseñados para la experimentación relacionada con sistemas cuánticos pueden estar basados en instrumentación y sensores. [ no verificado en el cuerpo ]
Los conjuntos de instrucciones cuánticas se utilizan para convertir algoritmos de nivel superior en instrucciones físicas que se pueden ejecutar en procesadores cuánticos. A veces, estas instrucciones son específicas de una plataforma de hardware determinada, por ejemplo, trampas de iones o cúbits superconductores .
Blackbird [3] [4] es un conjunto de instrucciones cuánticas y una representación intermedia que utilizan Xanadu Quantum Technologies y Strawberry Fields. Está diseñado para representar programas cuánticos de variable continua que pueden ejecutarse en hardware cuántico fotónico.
cQASM, [5] también conocido como QASM común, es un lenguaje ensamblador cuántico independiente del hardware que garantiza la interoperabilidad entre todas las herramientas de compilación y simulación cuántica. Fue introducido por el Laboratorio QCA en TUDelft .
OpenQASM [6] es la representación intermedia introducida por IBM para su uso con Qiskit y IBM Q Experience .
Quil es una arquitectura de conjunto de instrucciones para computación cuántica que introdujo por primera vez un modelo de memoria cuántica/clásica compartida. Fue introducida por Robert Smith, Michael Curtis y William Zeng en A Practical Quantum Instruction Set Architecture . [7] Muchos algoritmos cuánticos (incluidos los de teletransporte cuántico , corrección de errores cuánticos , simulación [8] [9] y algoritmos de optimización [10] ) requieren una arquitectura de memoria compartida.
Los kits de desarrollo de software cuántico proporcionan colecciones de herramientas para crear y manipular programas cuánticos. [11] También proporcionan los medios para simular los programas cuánticos o prepararlos para ejecutarse utilizando dispositivos cuánticos basados en la nube y dispositivos cuánticos autoalojados.
Los siguientes kits de desarrollo de software se pueden utilizar para ejecutar circuitos cuánticos en prototipos de dispositivos cuánticos, así como en simuladores.
Un proyecto de código abierto desarrollado por Google , que utiliza el lenguaje de programación Python para crear y manipular circuitos cuánticos. Los programas escritos en Cirq se pueden ejecutar en IonQ , Pasqal, [12] Rigetti y Alpine Quantum Technologies. [13]
Un IDE cuántico basado en la nube desarrollado por Classiq utiliza un lenguaje cuántico de alto nivel, Qmod, para generar circuitos cuánticos escalables y eficientes con un motor de síntesis que reconoce el hardware y que se puede implementar en una amplia gama de QPU. La plataforma incluye una gran biblioteca de algoritmos cuánticos.
Proyecto de código abierto desarrollado por Rigetti que utiliza el lenguaje de programación Python para crear y manipular circuitos cuánticos. Los resultados se obtienen utilizando simuladores o prototipos de dispositivos cuánticos proporcionados por Rigetti. Además de la capacidad de crear programas utilizando operaciones cuánticas básicas, el paquete Grove incluye algoritmos de nivel superior. [14] Forest se basa en el conjunto de instrucciones Quil .
MindQuantum es un marco de computación cuántica basado en MindSpore , centrado en la implementación de algoritmos NISQ . [15] [16] [17]
Un conjunto de herramientas de código abierto desarrollado por D-Wave. Escrito principalmente en el lenguaje de programación Python, permite a los usuarios formular problemas en los formatos de modelo de Ising y optimización binaria cuadrática sin restricciones (QUBO). Los resultados se pueden obtener enviándolos a una computadora cuántica en línea en Leap, el entorno de aplicación cuántica en tiempo real de D-Wave, máquinas propiedad del cliente o muestreadores clásicos. [ cita requerida ]
Una biblioteca de Python de código abierto desarrollada por Xanadu Quantum Technologies para la programación diferenciable de computadoras cuánticas. [18] [19] [20] [21] PennyLane brinda a los usuarios la capacidad de crear modelos utilizando TensorFlow , NumPy o PyTorch , y conectarlos con backends de computadoras cuánticas disponibles en IBMQ , Google Quantum , Rigetti , Quantinuum [22] y Alpine Quantum Technologies. [13] [23]
Proyecto de código abierto creado por Quandela Python . Las simulaciones se ejecutan en la propia computadora del usuario o en la nube . Perceval también se utiliza para conectarse al procesador fotónico cuántico basado en la nube de Quandela . [24] [25]
para diseñar circuitos fotónicos cuánticos y desarrollar algoritmos cuánticos, basado enUn proyecto de código abierto desarrollado en el Instituto de Física Teórica de la ETH , que utiliza el lenguaje de programación Python para crear y manipular circuitos cuánticos. [26] Los resultados se obtienen utilizando un simulador o enviando trabajos a dispositivos cuánticos de IBM.
Una API de pila completa de código abierto para simulación cuántica, control y calibración de hardware cuántico desarrollada por múltiples laboratorios de investigación, incluidos QRC , CQT e INFN . Qibo es un marco modular que incluye múltiples backends para simulación cuántica y control de hardware. [27] [28] Este proyecto tiene como objetivo proporcionar un marco de control de hardware cuántico independiente de la plataforma con controladores para múltiples instrumentos [29] y herramientas para calibración, caracterización y validación cuánticas. [30] Este marco se centra en dispositivos cuánticos autoalojados al simplificar el desarrollo de software requerido en los laboratorios.
Un proyecto de código abierto desarrollado por IBM . [31] Los circuitos cuánticos se crean y manipulan utilizando Python . Los resultados se obtienen utilizando simuladores que se ejecutan en el propio dispositivo del usuario, simuladores proporcionados por IBM o dispositivos cuánticos prototipo proporcionados por IBM. Además de la capacidad de crear programas utilizando operaciones cuánticas básicas, hay herramientas de nivel superior para algoritmos y evaluación comparativa disponibles dentro de paquetes especializados. [32] Qiskit se basa en el estándar OpenQASM para representar circuitos cuánticos. También admite el control de nivel de pulso de sistemas cuánticos a través del estándar QiskitPulse. [33]
Qrisp [34] es un proyecto de código abierto coordinado por la Fundación Eclipse [35] y desarrollado en programación Python por Fraunhofer FOKUS [36]. Qrisp es un lenguaje de programación de alto nivel para crear y compilar algoritmos cuánticos. Su modelo de programación estructurada permite un desarrollo y mantenimiento escalables. La sintaxis expresiva se basa en variables en lugar de qubits, con QuantumVariable como clase central y funciones en lugar de puertas. Herramientas adicionales, como un simulador de alto rendimiento y un descomputado automático, complementan el amplio marco. Además, es independiente de la plataforma, ya que ofrece una compilación alternativa de funciones elementales hasta el nivel de circuito, basada en conjuntos de puertas específicos del dispositivo.
Un proyecto desarrollado por Microsoft [37] como parte de .NET Framework . Los programas cuánticos se pueden escribir y ejecutar dentro de Visual Studio y VSCode utilizando el lenguaje de programación cuántica Q#. Los programas desarrollados en QDK se pueden ejecutar en Azure Quantum de Microsoft [38] y en computadoras cuánticas de Quantinuum [22] , IonQ y Pasqal [12] .
Una biblioteca de Python de código abierto desarrollada por Xanadu Quantum Technologies para diseñar, simular y optimizar circuitos ópticos cuánticos de variable continua (CV) . [39] [40] Se proporcionan tres simuladores: uno en la base de Fock , uno que utiliza la formulación gaussiana de la óptica cuántica, [41] y uno que utiliza la biblioteca de aprendizaje automático TensorFlow . Strawberry Fields también es la biblioteca para ejecutar programas en el hardware fotónico cuántico de Xanadu. [42] [43]
Un entorno de programación cuántica y un compilador optimizador desarrollado por Cambridge Quantum Computing que apunta a simuladores y varios back-ends de hardware cuántico, lanzado en diciembre de 2018. [44]
Hay dos grupos principales de lenguajes de programación cuántica: lenguajes de programación cuántica imperativos y lenguajes de programación cuántica funcional .
Los representantes más destacados de los lenguajes imperativos son QCL, [45] LanQ [46] y Q|SI>. [47]
Ket [48] es un lenguaje integrado de código abierto diseñado para facilitar la programación cuántica, aprovechando la sintaxis y la simplicidad familiares de Python. Funciona como un componente integral de la plataforma de programación cuántica Ket [49] , integrándose sin problemas con una biblioteca de ejecución de Rust y un simulador cuántico. El proyecto, mantenido por Quantuloop, enfatiza la accesibilidad y versatilidad para investigadores y desarrolladores. El siguiente ejemplo demuestra la implementación de un estado de Bell utilizando Ket:
de importación de ket * a , b = quant ( 2 ) # Asignar dos bits cuánticosH ( a ) # Poner el qubit `a` en una superposicióncnot ( a , b ) # Entrelaza los dos qubits en el estado de Bellm_a = medida ( a ) # Mide el qubit `a`, colapsando también el qubit `b`m_b = medida ( b ) # Mide el qubit `b`# Afirmar que la medida de ambos qubits siempre será igualafirmar m_a . valor == m_b . valor
La lógica de programas cuánticos (LQP) es una lógica cuántica dinámica, capaz de expresar características importantes de mediciones cuánticas y evoluciones unitarias de estados multipartitos, y proporciona caracterizaciones lógicas de varias formas de entrelazamiento. La lógica se ha utilizado para especificar y verificar la corrección de varios protocolos en computación cuántica. [50] [51]
El lenguaje Q es el segundo lenguaje de programación cuántica imperativo implementado. [52] El lenguaje Q se implementó como una extensión del lenguaje de programación C++. Proporciona clases para operaciones cuánticas básicas como QHadamard, QFourier, QNot y QSwap, que se derivan de la clase base Qop. Se pueden definir nuevos operadores utilizando el mecanismo de clases de C++.
La memoria cuántica está representada por la clase Qreg.
Qreg x1 ; // Registro cuántico de 1 qubit con valor inicial 0 Qreg x2 ( 2 , 0 ); // Registro cuántico de 2 qubit con valor inicial 0
El proceso de cálculo se ejecuta mediante un simulador proporcionado. Los entornos ruidosos se pueden simular mediante parámetros del simulador.
Un lenguaje desarrollado por Microsoft para ser utilizado con el Quantum Development Kit. [53]
El lenguaje de computación cuántica (QCL) es uno de los primeros lenguajes de programación cuántica implementados . [54] La característica más importante de QCL es el soporte para operadores y funciones definidos por el usuario. Su sintaxis se asemeja a la sintaxis del lenguaje de programación C y sus tipos de datos clásicos son similares a los tipos de datos primitivos en C. Se puede combinar código clásico y código cuántico en el mismo programa.
El lenguaje de comandos protegido cuántico (qGCL) fue definido por P. Zuliani en su tesis doctoral. Está basado en el lenguaje de comandos protegido creado por Edsger Dijkstra .
Puede describirse como un lenguaje de especificación de programas cuánticos.
Quantum Macro Assembler (QMASM) es un lenguaje de bajo nivel específico para recocedores cuánticos como D-Wave. [55]
El lenguaje de modelado cuántico (Qmod) es un lenguaje de alto nivel que abstrae la operación de cúbits a nivel de compuerta, lo que proporciona un enfoque funcional para la implementación de algoritmos cuánticos en registros cuánticos. El lenguaje es parte de la plataforma Classiq y se puede utilizar directamente con su sintaxis nativa, a través de un SDK de Python o con un editor visual; todos los métodos pueden aprovechar la biblioteca más grande de algoritmos y la optimización eficiente del circuito.
Q|SI> es una plataforma integrada en el lenguaje .Net que soporta la programación cuántica en una extensión cuántica del lenguaje while. [47] [56] Esta plataforma incluye un compilador del lenguaje while cuántico [57] y una cadena de herramientas para la simulación de computación cuántica, optimización de circuitos cuánticos, análisis de terminación de programas cuánticos [58] y verificación de programas cuánticos. [59] [60]
El pseudocódigo cuántico propuesto por E. Knill es el primer lenguaje formalizado para la descripción de algoritmos cuánticos . Fue introducido y, además, estaba estrechamente relacionado con un modelo de máquina cuántica llamada Máquina de Acceso Aleatorio Cuántico (QRAM).
Scaffold es un lenguaje similar a C que compila en QASM y OpenQASM. Está construido sobre la infraestructura del compilador LLVM para realizar optimizaciones en el código Scaffold antes de generar un conjunto de instrucciones específico. [61] [62]
Silq es un lenguaje de programación de alto nivel para computación cuántica con un fuerte sistema de tipos estáticos, desarrollado en la ETH de Zúrich . [63] [64]
Se están realizando esfuerzos para desarrollar lenguajes de programación funcional para la computación cuántica . Los lenguajes de programación funcional son adecuados para razonar sobre programas. Algunos ejemplos incluyen el QPL de Selinger, [65] y el lenguaje similar a Haskell QML de Altenkirch y Grattage. [66] [67] Los lenguajes de programación cuántica de orden superior, basados en el cálculo lambda , han sido propuestos por van Tonder, [68] Selinger y Valiron [69] y por Arrighi y Dowek. [70]
LIQUi|> (pronunciado liquid ) es una extensión de simulación cuántica del lenguaje de programación F# . [71] Actualmente está siendo desarrollado por el Grupo de Arquitecturas y Computación Cuántica (QuArC) [72] , parte de los esfuerzos de StationQ en Microsoft Research. LIQUi|> busca permitir a los teóricos experimentar con el diseño de algoritmos cuánticos antes de que las computadoras cuánticas físicas estén disponibles para su uso. [73]
Incluye un lenguaje de programación, algoritmos de optimización y planificación y simuladores cuánticos. LIQUi|> se puede utilizar para traducir un algoritmo cuántico escrito en forma de programa de alto nivel a instrucciones de máquina de bajo nivel para un dispositivo cuántico. [74]
QFC y QPL son dos lenguajes de programación cuántica estrechamente relacionados definidos por Peter Selinger. Se diferencian solo en su sintaxis: QFC utiliza una sintaxis de diagrama de flujo, mientras que QPL utiliza una sintaxis textual. Estos lenguajes tienen un flujo de control clásico pero pueden operar con datos cuánticos o clásicos. Selinger proporciona una semántica denotacional para estos lenguajes en una categoría de superoperadores .
QML es un lenguaje de programación cuántica similar a Haskell de Altenkirch y Grattage. [75] [66] A diferencia del QPL de Selinger, este lenguaje toma la duplicación, en lugar del descarte, de la información cuántica como una operación primitiva. La duplicación en este contexto se entiende como la operación que se asigna a , y no debe confundirse con la operación imposible de clonación ; los autores afirman que es similar a cómo se modela el intercambio en los lenguajes clásicos. QML también introduce operadores de control clásicos y cuánticos, mientras que la mayoría de los demás lenguajes se basan en el control clásico.
Se presenta una semántica operacional para QML en términos de circuitos cuánticos , mientras que una semántica denotacional se presenta en términos de superoperadores , y se demuestra que concuerdan. Tanto la semántica operacional como la denotacional se han implementado (clásicamente) en Haskell. [76]
Los cálculos lambda cuánticos son extensiones del cálculo lambda clásico introducido por Alonzo Church y Stephen Cole Kleene en la década de 1930. El propósito de los cálculos lambda cuánticos es extender los lenguajes de programación cuántica con una teoría de funciones de orden superior .
El primer intento de definir un cálculo lambda cuántico fue realizado por Philip Maymin en 1996. [77] Su cálculo lambda-q es lo suficientemente potente como para expresar cualquier cálculo cuántico. Sin embargo, este lenguaje puede resolver eficientemente problemas NP-completos y, por lo tanto, parece ser estrictamente más fuerte que los modelos computacionales cuánticos estándar (como la máquina de Turing cuántica o el modelo de circuito cuántico ). Por lo tanto, el cálculo lambda-q de Maymin probablemente no sea implementable en un dispositivo físico [ cita requerida ] .
En 2003, André van Tonder definió una extensión del cálculo lambda adecuada para demostrar la corrección de los programas cuánticos. También proporcionó una implementación en el lenguaje de programación Scheme . [78]
En 2004, Selinger y Valiron definieron un cálculo lambda fuertemente tipado para la computación cuántica con un sistema de tipos basado en lógica lineal . [79]
Quipper se publicó en 2013. [80] [81] Se implementa como un lenguaje integrado, utilizando Haskell como lenguaje anfitrión. [82] Por esta razón, los programas cuánticos escritos en Quipper se escriben en Haskell utilizando las bibliotecas proporcionadas. Por ejemplo, el siguiente código implementa la preparación de una superposición
importar Quipper spos :: Bool -> Circ Qubit spos b = hacer q <- qinit b r <- hadamard q devolver r