Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Q# é uma linguagem de programação de alto nível de software livre desenvolvida pela Microsoft para escrever programas 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 runtime:
- 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 manipulam o mapeamento de qubits de programas para qubits físicos, permitindo que o mesmo código seja executado em diferentes processadores quânticos.
- Integração da computação quântica e clássica:Q# permite a integração de cálculos quânticos e clássicos, o que é essencial para a computação quântica universal.
- Gerenciamento do Qubit:Q# fornece operações e funções internas para gerenciar qubits, incluindo a criação de estados de superposição, o emaranhamento de qubits e a execução de medidas quânticas.
- Respeitar as leis da física:Q# e algoritmos quânticos devem seguir as regras da física quântica. Por exemplo, você não pode copiar ou acessar diretamente o estado do qubit no Q#.
Para obter mais informações sobre as origens de Q#, consulte a postagem no blog Por que precisamos Q#?.
Estrutura de um Q# programa
Antes de começar a escrever Q# programas, é importante entender a estrutura e os componentes deles. Considere o seguinte Q# programa, chamado Superposition, 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 Q# 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 esse Q# programa em seus componentes.
Namespaces de usuário
Q# opcionalmente, os programas podem começar com um namespace definido pelo usuário, como:
namespace Superposition {
// Your code goes here.
}
Os namespaces podem ajudá-lo a organizar a funcionalidade relacionada. Namespaces são opcionais em Q# programas, o que significa que você pode escrever um programa sem definir um namespace.
Por exemplo, o Superposition programa do exemplo também pode ser escrito sem um namespace como:
@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;
}
Observação
Cada Q# programa pode ter apenas um namespace. Se você não especificar um namespace, o Q# compilador usará o nome do arquivo como o namespace.
Pontos de entrada
Cada Q# programa deve ter um ponto de entrada, que é o ponto de partida do programa. Por padrão, o Q# compilador inicia a execução de um programa a Main() partir da operação, se disponível, que pode estar localizada em qualquer lugar do programa. Opcionalmente, você pode usar o @EntryPoint() atributo para especificar qualquer operação no programa como o ponto de execução.
Por exemplo, no Superposition programa, a MeasureOneQubit() operação é o ponto de entrada do programa porque tem o @EntryPoint() atributo antes da definição da operação:
@EntryPoint()
operation MeasureOneQubit() : Result {
...
}
No entanto, o programa também pode ser gravado sem o @EntryPoint() atributo renomeando a MeasureOneQubit() operação para Main(), por exemplo:
// The Q# compiler automatically detects the Main() operation as the entry point.
operation Main() : 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;
}
Tipos
Os tipos são essenciais em qualquer linguagem de programação porque definem os dados com os quais um programa pode trabalhar.
Q# fornece tipos internos que são comuns à maioria dos idiomas, incluindo Int, Double, Boole , e Stringtipos que definem intervalos, matrizes e tuplas.
Q# também fornece tipos específicos à computação quântica. Por exemplo, o Result tipo representa o resultado de uma medida de qubit e pode ter dois valores: Zero ou One.
No programa Superposition, a operação MeasureOneQubit() retorna um tipo Result, que corresponde ao tipo de retorno da operação M. 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);
...
}
Outro exemplo de um tipo específico do quantum é o Qubit tipo, que representa um bit quântico.
Q# também permite que você defina seus próprios tipos personalizados. Para obter mais informações, consulte Declarações de tipo.
Alocação de qubits
Em Q#, você aloca qubits usando a use palavra-chave e o Qubit tipo. Os qubits são sempre alocados no $\ket{0}$ estado.
Por exemplo, o Superposition programa define um único qubit e o armazena na variável q:
// 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.
Operações quânticas
Depois de alocar um qubit, você pode passá-lo para operações e funções. As operações são os blocos de construção básicos de um Q# programa. 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. No programa Superposition, a operação MeasureOneQubit() não usa parâmetros e retorna um tipo Result.
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 Hadamard, Hno 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]).
Por exemplo, o Superposition programa usa a M operação:
// Measure the qubit in the Z-basis.
let result = M(q);
Redefinir os qubits
Em Q#, os qubits $\ket{0}$ estar no estado quando são liberados para evitar erros no hardware quântico. Você pode redefinir um qubit para o $\ket{0}$ estado usando a Reset operação 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 de biblioteca padrão
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 Std.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 import 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:
Std.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Std.Intrinsic namespace.
import Std.Intrinsic.*;
Message("Hello quantum world!");
// imports just the `Message` function from the Std.Intrinsic namespace.
import Std.Intrinsic.Message;
Message("Hello quantum world!");
Observação
O programa Superposition não tem instruções import nem chamadas com namespaces completos. Isso ocorre porque o Q# ambiente de desenvolvimento carrega automaticamente dois namespaces Std.Core e Std.Intrinsic, que contêm funções e operações comumente usadas.
Você pode aproveitar o Std.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:
// Import the namespace for the MResetZ operation.
import Std.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);
}
Saiba como 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.
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 Microsoft Quantum, um ambiente de desenvolvimento local com o Visual Studio Code ou combinar Q# código com código Python no Jupyter Notebooks. 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 ou integrar-se Q# ao Python no Jupyter Notebooks. Para obter mais informações, consulte Integração de Q# e Python.
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
from qdk import qsharppara ativar%%qsharpo . -
%%qsharpescopos 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
%%qsharpdeve aderir à Q# sintaxe. Por exemplo, use//instead of para denotar comentários e#para terminar linhas de;código.
Estimar recursos
Antes de executar em hardware quântico real, você precisa descobrir se o 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
Depois de testar seu programa em simulação, você pode executá-lo em hardware quântico real. Ao executar um programa quântico no Azure Quantum, você cria e executa um trabalho. Para enviar um trabalho para os provedores do Azure Quantum, você precisa de uma conta do Azure e um workspace quântico. Se você não tiver um workspace quântico, consulte Criar um workspace do Azure Quantum.
O Azure Quantum oferece alguns dos hardwares quânticos mais atraentes e diversos. Confira Provedores de computação quântica para a lista atual de provedores de hardware com suporte.
Depois de enviar seu trabalho, o Azure Quantum gerencia o ciclo de vida do trabalho, incluindo agendamento de trabalho, execução e monitoramento. Você pode acompanhar o status do trabalho e exibir os resultados no portal do Azure Quantum.