Compartilhar via


Introdução à linguagem de programação quântica Q#

Q#é uma linguagem de programação de código aberto de alto nível para desenvolver e executar algoritmos quânticos. Q# está incluído no Quantum Development Kit (QDK). Para obter mais informações, consulte Configurar o Quantum Development Kit.

Como uma linguagem de programação quântica, Q# atende aos seguintes requisitos de linguagem, compilador e tempo de execução:

  • Independente de hardware: os qubits em algoritmos quânticos não estão vinculados a um hardware ou layout quântico específico. O Q# compilador e o runtime lidam com o mapeamento de qubits de programa para qubits físicos.
  • Integra computação quântica e clássica: A capacidade de realizar cálculos clássicos e quânticos é essencial em um computador quântico universal.
  • Respeita as leis da física:Q# e os algoritmos quânticos seguem as regras da física quântica. Por exemplo, você não pode copiar ou acessar diretamente o estado do qubit no Q#.

Estrutura de um Q# programa

Antes de começar a escrever programas quânticos, é importante entender sua estrutura e componentes. Considere o seguinte Q# programa que cria um estado de superposição:

namespace Superposition {
    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit. By default, it's in the 0 state.  
        use q = Qubit();  
        // Apply the Hadamard operation, H, to the state.
        // It now has a 50% chance of being measured as 0 or 1.
        H(q);      
        // Measure the qubit in the Z-basis.
        let result = M(q);
        // Reset the qubit before releasing it.
        Reset(q);
        // Return the result of the measurement.
        return result;
    }
}

Com base nos comentários (//), o Superposition programa primeiro aloca um qubit, aplica uma operação para colocar o qubit em superposição, mede o estado do qubit, redefine o qubit e, finalmente, retorna o resultado. Vamos dividir este programa em seus componentes.

Namespaces de usuário

Q#Os programas começam com um namespace definido pelo usuário, como:

namespace Superposition {
    // Your code goes here.
}

Os namespaces ajudam você a organizar a funcionalidade relacionada. Cada Q# programa pode ter apenas um namespace.

A Q# biblioteca padrão tem namespaces predefinidos que contêm funções e operações que você pode usar em programas quânticos. Para obter mais informações, consulte Namespaces internos.

Pontos de entrada

O @EntryPoint() atributo informa ao Q# compilador por onde começar a executar o programa. Em um programa com múltiplas funções e operações, você pode colocar @EntryPoint() antes de qualquer uma delas para fazer o programa começar ali e continuar sequencialmente.

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

Tipos

Q# Fornece tipos internos comuns à maioria das linguagens, incluindo Int, Double, Bool, e String, e tipos específicos da computação quântica. Por exemplo, o Result tipo representa o resultado de uma medição de qubit e pode ter um dos dois valores: Zero ou One.

Superposition No programa, a MeasureOneQubit() operação retorna um Result tipo, que corresponde ao tipo de retorno da M operação. O resultado da medição é armazenado em uma nova variável definida usando a let instrução:

// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
    ...
    // Measure the qubit in the Z-basis, returning a Result type.
    let result = M(q);
    ...

O Q# também fornece tipos que definem intervalos, matrizes e tuplas. Você pode até mesmo definir seus tipos personalizados.

Alocação de qubits

No Q#, você aloca qubits usando a use palavra-chave. Os qubits são sempre alocados no $\ket{0}$ estado.

O Superposition programa define um único qubit:

// Allocate a qubit.
use q = Qubit();

Você também pode alocar vários qubits e acessar cada um por meio de seu índice:

use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.

Para obter mais informações, consulte Instrução de uso.

Operações quânticas

Depois de alocar um qubit, você pode passá-lo para operações e funções, também conhecidas como callables. Operações são os blocos de construção básicos de um programa em Q#. Uma Q# operação é uma sub-rotina quântica ou uma rotina que pode ser chamada que contém operações quânticas que alteram o estado do registro de qubit.

Para definir uma Q# operação, especifique um nome para a operação, suas entradas e sua saída. Superposition No programa, a MeasureOneQubit() operação é essencialmente o programa inteiro. Ele não usa parâmetros e retorna um Result tipo:

operation MeasureOneQubit() : Result {
    ...
}

Aqui está um exemplo básico que não usa parâmetros e não espera nenhum valor de retorno. O Unit valor é equivalente a NULL em outros idiomas:

operation SayHelloQ() : Unit {
    Message("Hello quantum world!");
}

A Q# biblioteca padrão também fornece operações que você pode usar em programas quânticos, como a operação de Hadamard, H, no Superposition programa. Dado um qubit na base Z, H coloca o qubit em uma superposição uniforme, onde ele tem 50% de chance de ser medido como Zero ou One.

Medindo qubits

Embora existam muitos tipos de medições quânticas, Q# concentra-se em medições projetivas em qubits únicos, também conhecidas como medições de Pauli.

Em Q#, a Measure operação mede um ou mais qubits na base Pauli especificada, que pode ser PauliX, PauliY, ou PauliZ. Measure retorna um Result tipo de either Zero ou One.

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

O Superposition programa usa a M operação:

// Measure the qubit in the Z-basis.
let result = M(q);

Redefinir os qubits

No Q#, os $\ket{0}$ qubits devem estar no estado em que são liberados. Use a Reset operação para redefinir cada qubit para o $\ket{0}$ estado antes de liberá-lo no final do programa. A falha ao redefinir um qubit resulta em um erro de tempo de execução.

// Reset a qubit.
Reset(q);

Namespaces internos

A Q# biblioteca padrão tem namespaces internos que contêm funções e operações que você pode usar em programas quânticos. Por exemplo, o Microsoft.Quantum.Intrinsic namespace contém operações e funções comumente usadas, como M medir resultados e Message exibir mensagens do usuário em qualquer lugar do programa.

Para chamar uma função ou operação, você pode especificar o namespace completo ou usar uma open instrução, o que torna todas as funções e operações para esse namespace disponíveis e torna seu código mais legível. Os exemplos a seguir chamam a mesma operação:

Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");

O Superposition programa não tem instruções open ou chamadas com namespaces completos. Isso ocorre porque o Q# ambiente de desenvolvimento carrega automaticamente dois namespaces: Microsoft.Quantum.Core e Microsoft.Quantum.Intrinsic, que contêm funções e operações comumente usadas.

Você pode aproveitar o Microsoft.Quantum.Measurement namespace usando a MResetZ operação para otimizar o Superposition programa. MResetZ Combina as operações de medição e reinicialização em uma etapa, como no exemplo a seguir:

namespace Superposition {
    // Open the namespace for the MResetZ operation.
    open Microsoft.Quantum.Measurement;

    @EntryPoint()
    operation MeasureOneQubit() : Result {
        // Allocate a qubit. By default, it's in the 0 state.      
        use q = Qubit();  
        // Apply the Hadamard operation, H, to the state.
        // It now has a 50% chance of being measured as 0 or 1. 
        H(q);   
        // Measure and reset the qubit, and then return the result value.
        return MResetZ(q);
    }
}

Desenvolver programas quânticos com Q# o Azure Quantum

Q# e Azure Quantum são uma combinação poderosa para desenvolver e executar programas quânticos. Com Q# o Azure Quantum, você pode escrever programas quânticos, simular seu comportamento, estimar os requisitos de recursos e executá-los em hardware quântico real. Essa integração permite explorar o potencial da computação quântica e desenvolver soluções inovadoras para problemas complexos. Seja você um iniciante ou um desenvolvedor quântico experiente, Q# o Azure Quantum fornece as ferramentas e os recursos necessários para liberar o poder da computação quântica.

O diagrama a seguir mostra os estágios pelos quais um programa quântico passa quando você o desenvolve com Q# o Azure Quantum. Seu programa começa com o ambiente de desenvolvimento e termina com o envio do trabalho para hardware quântico real.

Diagrama mostrando o fluxo de trabalho do desenvolvimento de programação quântica.

Vamos detalhar as etapas no diagrama.

Escolher o ambiente de desenvolvimento

Execute seus programas quânticos em seu ambiente de desenvolvimento preferido. Você pode usar o editor de código online no site do Azure Quantum, os Jupyter Notebooks hospedados em seu workspace do Azure Quantum no portal do Azure ou um ambiente de desenvolvimento local com o Visual Studio Code. Para obter mais informações, consulte Diferentes maneiras de executar Q# programas.

Escrever seu programa quântico

Você pode escrever programas quânticos usando Q# o QDK (Kit de Desenvolvimento Quântico). Para começar, consulte Guia de início rápido: criar seu primeiro Q# programa.

Além disso Q#, o QDK oferece suporte para outras linguagens para computação quântica, como Qiskit e Cirq.

Integrar com Python

Você pode usar Q# sozinho ou em conjunto com o Python em vários IDEs. Por exemplo, você pode usar um Q# projeto com um programa host Python para chamar Q# operações. Você também pode integrar Q# com o Python no Jupyter Notebooks. Para obter mais informações, consulte Diferentes maneiras de executar Q# programas.

O comando %%qsharp

Por padrão, Q# os programas em Jupyter Notebooks usam o ipykernel pacote Python. Para adicionar Q# código a uma célula de notebook, use o %%qsharp comando, que é habilitado com o qsharp pacote Python, seguido pelo código Q# .

Ao usar %%qsharpo , lembre-se do seguinte:

  • Você deve primeiro executar import qsharp para ativar %%qsharpo .
  • %%qsharp escopos para a célula do notebook na qual ele aparece e altera o tipo de célula de Python para Q#.
  • Você não pode colocar uma instrução Python antes ou depois %%qsharpde .
  • Q# O código a seguir %%qsharp deve aderir à Q# sintaxe. Por exemplo, use // instead of para denotar comentários e ; para terminar linhas de # código.

Observação

Os notebooks do Azure no portal do Azure incluem as versões mais recentes dos pacotes e azure-quantum do qsharp Python, portanto, você não precisa instalar nada. Para obter mais informações, consulte Introdução e Q# blocos de anotações do Azure Quantum.

Estimar recursos

Antes de executar em hardware quântico real, você precisará descobrir se seu programa pode ser executado em hardware existente e quantos recursos ele consumirá.

O Avaliador de Recursos do Azure Quantum permite avaliar decisões de arquitetura, comparar tecnologias de qubit e determinar os recursos necessários para executar um determinado algoritmo quântico. Você pode escolher entre protocolos tolerantes a falhas predefinidos e especificar suposições do modelo de qubit físico subjacente.

Para obter mais informações, consulte Executar sua primeira estimativa de recurso.

Observação

O Avaliador de Recursos do Azure Quantum é gratuito e não requer uma conta do Azure.

Execute seu programa em simulação

Quando você compila e executa um programa quântico, o QDK cria uma instância do simulador quântico e passa o Q# código para ele. O simulador usa o código Q# para criar qubits (simulações de partículas quânticas) e aplicar transformações para modificar o estado deles. Os resultados das operações quânticas no simulador são retornados para o programa. O isolamento do código Q# no simulador garante que os algoritmos sigam as leis da física quântica e possam ser executados corretamente em computadores quânticos.

Envie seu programa para hardware quântico real

Você pode enviar seus Q# programas (também conhecidos como trabalhos) para o Azure Quantum por meio de seu ambiente de desenvolvimento preferido, local e online. Para obter mais informações, confira como enviar trabalhos Q#. Você também pode executar e enviar circuitos quânticos escritos nas linguagens Qiskit e Cirq.

O Azure Quantum oferece alguns dos hardwares quânticos mais atraentes e diversificados disponíveis atualmente dos líderes do setor. Confira Provedores de computação quântica para a lista atual de provedores de hardware com suporte.

Observação

O destino do Emulador Quantinuum H-Series baseado em nuvem está disponível sem uma conta do Azure. Para enviar um trabalho para o restante dos provedores do Azure Quantum, você precisa de uma conta do Azure e de um workspace quântico. Se você não tiver um workspace quântico, consulte Criar um workspace do Azure Quantum.

Este diagrama mostra o fluxo de trabalho básico após o envio do trabalho:

Diagrama que mostra o fluxo de trabalho após o envio de um trabalho para o Azure Quantum.