Quais são os principais componentes de um programa Q#?

Concluído

Antes de você começar a escrever programas quânticos, é importante entender a estrutura e os componentes de um programa Q#.

Nesta unidade, você analisará os principais componentes de um programa Q#.

A operação Main

Cada programa Q# deve conter pelo menos uma operação, que geralmente é a operação Main. A operação Main é o ponto de entrada do programa. Por padrão, o compilador Q# começa a executar um programa da operação Main(). Opcionalmente, você pode usar o atributo @EntryPoint() para especificar uma operação no programa como o ponto de execução.

Por exemplo, o código a seguir define uma operação de ponto de entrada, MeasureOneQubit:

@EntryPoint()
operation MeasureOneQubit() : Result {
    ...
}

No entanto, você também pode escrever esse código sem o atributo @EntryPoint() renomeando a operação MeasureOneQubit() para Main():

// The Q# compiler automatically detects the Main() operation as the entry point. 
operation Main() : Result {
    ...
}

Tipos

O Q# fornece muitos tipos internos com os quais você já pode estar familiarizado, incluindo Int, Double, Boole String. O Q# também fornece tipos específicos à computação quântica, como Qubit e Result.

Neste exemplo, a operação MeasureOneQubit retorna um tipo Result. Um tipo Result é o resultado da medição de um qubit e pode ser One ou Zero.

operation MeasureOneQubit() : Result {
    ...
}

Bibliotecas quânticas

As bibliotecas Q# contêm funções e operações que você pode usar em programas quânticos. Ao chamar uma função ou operação de uma biblioteca, você usa a diretiva import e especifica o namespace dessa biblioteca. Por exemplo, para usar a função Message do namespace Microsoft.Quantum.Intrinsic na biblioteca quântica Standard, faça o seguinte:

// imports all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;
    Message("Hello quantum world!");


// imports just the `Message` function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
    Message("Hello quantum world!");

Namespaces na biblioteca Standard podem ser importados usando Std em vez de Microsoft.Quantum. Por exemplo:

// imports all functions and operations from Microsoft.Quantum.Intrinsic == Std.Intrinsic
import Std.Intrinsic.*;
    Message("Hello quantum world!");

Alocação de qubits

Em Q#, para alocar um qubit, use a palavra-chave use e o tipo Qubit. Os qubits que você aloca com a palavra-chave use começam no estado $\ket{0}$.

Você pode alocar um ou vários qubits de cada vez. Aqui está um exemplo que aloca um e cinco qubits:

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

Medindo qubits

Em Q#, a operação Measure executa uma medida conjunta de um ou mais qubits nas bases Pauli especificadas, que podem ser PauliX, PauliYou PauliZ. A operação Measure retorna um tipo de Result que é One ou Zero.

Para implementar uma medida na base computacional $\lbrace\ket{0},\ket{1}\rbrace$, você também pode usar a operação M, que executa uma medida na base de Pauli Z. Portanto, a operação M é equivalente à aplicação de Measure([PauliZ], [qubit]).

Redefinir os qubits

Em Q#, os qubits devem estar no estado $\ket{0}$ no momento em que forem liberados. Quando você terminar de usar um qubit, use a operação Reset para redefinir o qubit para o $\ket{0}$.

    // Reset the qubit so it can be safely released.
    Reset(qubit);