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#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. Cada Q# programa pode ter apenas um namespace
. Se um namespace não for especificado, o Q# compilador usará o nome do arquivo como namespace. Por exemplo, o programa pode Superposition
ser escrito 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;
}
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
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.
Superposition
No programa, a operação mais descritiva MeasureOneQubit()
é o ponto de entrada do programa.
@EntryPoint()
operation MeasureOneQubit() : Result {
...
No entanto, o programa também pode ser escrito sem o @EntryPoint()
atributo, renomeando a MeasureOneQubit()
operação para Main()
:
// 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
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 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:
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
// imports all functions and operations from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.*;
Message("Hello quantum world!");
// imports just the `Message` function from the Microsoft.Quantum.Intrinsic namespace.
import Microsoft.Quantum.Intrinsic.Message;
Message("Hello quantum world!");
// namespaces in the standard library may be imported using `Std` instead of `Microsoft.Quantum`.
import Std.Intrinsic.*;
Message("Hello quantum world!");
O Superposition
programa não tem instruções import
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:
// Import the namespace for the MResetZ operation.
import 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.
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 %%qsharp
o , lembre-se do seguinte:
- Você deve primeiro executar
import qsharp
para ativar%%qsharp
o . %%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
%%qsharp
de . - 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: