¿Cuáles son los componentes principales de un programa de Q#?

Completado

Antes de escribir sus propios programas cuánticos, es importante comprender la estructura y los componentes del lenguaje de programación Q#.

En esta unidad, obtendrá información sobre los componentes básicos de un programa de Q#.

La operación Main

Cada programa de Q# debe contener al menos una operación. El compilador de Q# comienza a ejecutar un programa desde la operación de punto de entrada, que es la Main operación de forma predeterminada. Por ejemplo, el siguiente programa de Q# contiene una operación denominada Main que crea un cúbit y devuelve una medida del estado del cúbit:

// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
    use q = Qubit();
    return M(q);
}

El código de Q# no se puede ejecutar sin una operación de punto de entrada. Si desea usar una operación distinta de Main como punto de entrada, use el @EntryPoint() atributo . Por ejemplo, el código siguiente proporciona a la operación anterior un nombre más descriptivo, MeasureOneQubity define esa operación como punto de entrada para el programa de Q#:

// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
    use q = Qubit();
    return M(q);
}

Tipos

Q# proporciona muchos tipos de datos integrados con los que es posible que ya esté familiarizado, como Int, Double, Booly String. Q# también proporciona tipos específicos de la computación cuántica, como Qubit y Result.

Por ejemplo, la MeasureOneQubit operación devuelve un Result valor de tipo. El Result tipo representa el estado de un cúbit cuando se mide el cúbit y puede tener un valor de Zero o One.

Bibliotecas cuánticas

Q# incluye varias bibliotecas que contienen funciones y operaciones para ayudarle a escribir programas cuánticos. Para llamar a una función o operación desde una biblioteca, use la import palabra clave y especifique el espacio de nombres de la biblioteca. Por ejemplo, para usar la función Message del espacio de nombres Microsoft.Quantum.Intrinsic en la biblioteca cuántica estándar, use el siguiente código:

// import all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;

operation Main() : Unit {
    // call the Message function from Microsoft.Quantum.Intrinsic
    Message("Hello quantum world!");
}

El asterisco significa que se importan todas las funciones del Microsoft.Quantum.Intrinsic espacio de nombres. Como alternativa, solo puede importar la Message función :

// import only the Message function from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.Message;

operation Main() : Unit {
    // call the Message function from Microsoft.Quantum.Intrinsic
    Message("Hello quantum world!");
}

Nota:

En Q#, el Unit tipo significa que la función o la operación no devuelven un valor. Para obtener más información sobre los tipos en Q#, vea Type System.

Puede importar espacios de nombres en la biblioteca estándar con Std en lugar de Microsoft.Quantum. Por ejemplo, el código siguiente importa todas las funciones y operaciones desde el Microsoft.Quantum.Intrinsic espacio de nombres:

// import everything from Std.Intrinsic (Microsoft.Quantum.Intrinsic)
import Std.Intrinsic.*;

operation Main() : Unit {
    // call the Message function from Std.Intrinsic
    Message("Hello quantum world!");
}

Para explorar la biblioteca estándar de Q#, consulte la referencia de API.

Asignación de cúbits

Para asignar un cúbit en Q#, use la palabra clave use y el tipo Qubit. Los cúbits que asigne con la use palabra clave siempre comienzan en el estado $\ket{0}$.

Puede asignar un solo cúbit o varios cúbits en una matriz de cúbits. Este es un ejemplo que asigna un solo cúbit en la variable q1 y una matriz de cinco cúbits en q5:

use q1 = Qubit();  // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

Medición de cúbits

En Q#, la Measure operación realiza una medición conjunta de uno o varios cúbits en las bases de Pauli especificadas, que pueden ser PauliX, PauliY, o PauliZ. La Measure operación devuelve un Result tipo que tiene un valor de Zero o One.

Para realizar una medición en la base computacional $\lbrace\ket{c0},\ket{c1}\rbrace$, también puede usar la operación M. La M operación es equivalente a la Measure operación en la base de Pauli-Z, por lo que M([qubit]) se comporta exactamente igual que Measure([PauliZ], [qubit]). Sin embargo, la M operación solo acepta cúbits únicos como entrada, no matrices de cúbits.

Restablecimiento de cúbits

En Q#, los cúbits deben estar en el estado $\ket{0}$ para liberarlos. Al terminar de usar un cúbit, llame a la operación Reset para restablecerlo al estado $\ket{0}$. Por ejemplo, el código siguiente asigna un cúbit, mide el estado del cúbit y, a continuación, restablece el cúbit:

operation Main() : Result {
    use q = Qubit();
    let result = M(q);

    // Reset the qubit so that you can release it
    Reset(q);

    return result;
    }