Tipos de datos específicos del dominio cuántico

En este tema, se describe el tipo Qubit, junto con otros dos tipos que son en cierto modo específicos del dominio cuántico: Pauli y Result.

Cúbit

Q# trata los cúbits como elementos opacos que se pueden pasar a funciones y operaciones, pero con los que solo se puede interactuar si se pasan a instrucciones nativas del procesador cuántico de destino. Estas instrucciones siempre se definen en forma de operaciones, ya que su intención es modificar el estado cuántico. La restricción de que las funciones no puedan modificar el estado cuántico, a pesar de que se pueden pasar cúbits como argumentos de entrada, se aplica mediante la restricción de que las funciones solo pueden llamar a otras funciones y no pueden llamar a operaciones.

Las bibliotecas de Q# se compilan con un conjunto estándar de operaciones intrínsecas, lo que significa operaciones que no tienen ninguna definición para su implementación dentro del lenguaje. Tras la asignación de destino, el compilador vincula las implementaciones que las expresan en términos de instrucciones nativas del destino de ejecución. Un programa de Q# vuelve a combinar estas operaciones según lo definido por una máquina de destino para crear nuevas operaciones de nivel superior que expresen el cálculo cuántico. De este modo, Q# facilita la expresión de la lógica subyacente a los algoritmos cuánticos e híbridos cuánticos-clásicos, mientras se mantiene general con relación a la estructura de un máquina de destino y su realización del estado cuántico.

Dentro de Q# en sí, no hay ningún tipo o construcción en Q# que represente el estado cuántico. En su lugar, un cúbit representa la unidad física direccionable más pequeña de un equipo cuántico. Por lo tanto, un cúbit es un elemento de larga duración, por lo que Q# no necesita tipos lineales. Por lo tanto, no hacemos referencia explícitamente al estado dentro de Q#, sino que describimos cómo el programa transforma el estado, por ejemplo, mediante la aplicación de operaciones como X y H. De forma similar a cómo un programa de sombreador de gráficos acumula una descripción de las transformaciones en cada vértice, un programa cuántico en Q# acumula transformaciones en estados cuánticos, representados como referencias completamente opacas a la estructura interna de una máquina de destino.

Un programa de Q# no tiene la capacidad de entrar en el estado de un qubit y, por tanto, es completamente independiente de qué es un estado cuántico o de cómo se realiza. En su lugar, un programa puede llamar a operaciones como Measure para obtener información sobre el estado cuántico del cálculo.

Pauli

Los valores de tipo Pauli especifican un operador de Pauli de un solo cúbit; las posibilidades son PauliI, PauliX, PauliY y PauliZ. Los valores Pauli se usan principalmente para especificar la base de una medida cuántica.

Resultado

El tipo Result especifica el resultado de una medida cuántica. Q# refleja la mayoría del hardware cuántico proporcionando medidas en productos de operadores de Pauli de un solo cúbit; un Result de Zero indica que se midó el valor propio de +1 y un Result de One indica que se midó el valor propio de -1. Es decir, Q# representa valores propios por la potencia a la que se eleva -1. Esta convención es más común en la comunidad de algoritmos cuánticos, porque está más relacionada con los bits clásicos.