Comece a usar o Qiskit em sala de aula
Para este módulo do Qiskit in Classrooms, os alunos devem ter um ambiente Python em funcionamento com os seguintes pacotes instalados:
qiskitv2.1.0 ou mais recenteqiskit-ibm-runtimev0.40.1 ou mais recenteqiskit-aerv0.17.0 ou mais recenteqiskit.visualizationnumpypylatexenc
Para configurar e instalar os pacotes acima, consulte o guia Instalar o Qiskit. Para executar trabalhos em computadores quânticos reais, os alunos precisarão configurar uma conta no site IBM Quantum® seguindo as etapas do guia Configurar sua conta IBM Cloud®.
Esse módulo foi testado e usou 2 segundos de tempo de QPU em um processador Heron v2. Essa é apenas uma estimativa. Seu uso real pode variar.
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'Introdução
Nos módulos Qiskit in the Classroom, você terá a oportunidade de usar um computador quântico para explorar vários conceitos em campos adjacentes à computação quântica, como mecânica quântica, ciência da computação, química e muito mais. Este módulo serve como pré-requisito para os outros: ele apresenta os fundamentos da computação quântica e como usar o Qiskit para executar circuitos quânticos.
Primeiro, apresentaremos uma breve visão geral de como funciona um computador clássico e, em seguida, mostraremos como esses conceitos são adaptados para se adequarem ao paradigma da computação quântica. Por fim, mostraremos como reunir esses conceitos para construir e executar seu primeiro circuito quântico.
Computadores clássicos
É provável que você conheça os princípios básicos do funcionamento dos computadores clássicos, mas aqui destacaremos alguns dos principais recursos para que possamos fazer uma comparação com os computadores quânticos.
As unidades básicas de informação: bits
Os computadores clássicos processam informações clássicas, e a unidade fundamental das informações clássicas é o bit. Um único bit pode armazenar a resposta a uma pergunta do tipo "sim/não". Normalmente, representamos os dois estados binários de um bit como "0" e "1".
Revisão dos números binários
A combinação de bits permite que você armazene mais informações. Por exemplo, se você quiser armazenar um número de 0 a 15, poderá fazê-lo com quatro bits da seguinte forma:
| 0 = 0000 | 4 = 0100 | 8 = 1000 | 12 = 1100 |
| 1 = 0001 | 5 = 0101 | 9 = 1001 | 13 = 1101 |
| 2 = 0010 | 6 = 0110 | 10 = 1010 | 14 = 1110 |
| 3 = 0011 | 7 = 0111 | 11 = 1011 | 15 = 1111 |
Em geral, para converter de um número binário de bits para um número familiar, base-10, você multiplica o bit menos significativo (mais à direita) por , o próximo bit à esquerda por , depois o próximo por , e assim por diante, até chegar ao mais significativo (bit mais à esquerda), que você multiplica .
Portanto, isso significa que bits podem estar em um dos diferentes estados possíveis.
Verifique sua compreensão
De quantos bits você precisaria para representar o número 86? Escreva o bitstring que codifica esse número em binário.
Lembre-se de que bits permite que você represente os números a , portanto, usando seis bits, chegaríamos a . Isso não é suficiente. Adicionamos mais um bit para chegar a . Agora vamos dividir 86 em potências de 2:
Operações fundamentais: portas
Agora, um computador precisa ser capaz de fazer algo com os bits para, bem, computar. As portas binárias são as operações que formam os blocos de construção fundamentais de todos os algoritmos e códigos mais complicados.
Porta de bit único:
NÃO
Quando você tem apenas um bit, só há uma maneira de transformar seu estado: inverter o estado de 0 para 1 ou de 1 para 0. Chamamos isso de porta "NOT". O efeito dessa porta - e o restante das portas que discutiremos a seguir - pode ser representado em uma chamada "tabela verdade", com colunas para os estados de entrada e saída dos qubits. A tabela verdade para a porta NOT é:
Entrada | Saída |
|---|---|
| 0 | 1 |
| 1 | 0 |
Portas multibits:
E
AND é uma porta de dois bits que recebe dois bits de entrada e gera um único bit de saída. Ele produz 1 se ambos os bits de entrada forem 1 e 0 caso contrário:
Entrada | Saída |
|---|---|
| 00 | 0 |
| 01 | 0 |
| 22 | 0 |
| 11 | 1 |
OU
OR é outra porta de dois bits com um único bit de saída. Ele produz 1 se qualquer um dos bits for 1:
Entrada | Saída |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 22 | 1 |
| 11 | 1 |
XOR
XOR significa "exclusive OR" (OU exclusivo) e é como a porta OR, mas produz 1 se apenas um dos bits de entrada for 1. O resultado será 0 se ambos forem 1 ou 0:
Entrada | Saída |
|---|---|
| 00 | 0 |
| 01 | 1 |
| 22 | 1 |
| 11 | 0 |
Medidas:
Normalmente, ao aprender sobre computação clássica, não se dá muita atenção ao processo de leitura do estado dos bits. Isso ocorre porque ele não é muito complexo do ponto de vista conceitual. Você pode medir os bits a qualquer momento antes, durante ou depois de um cálculo, e isso não afeta o resultado. Esse não é o caso da computação quântica, como discutiremos a seguir.
Circuitos:
Ao combinar as portas acima, você pode fazer qualquer tipo de operação que desejar em um computador. Vamos dar um exemplo simples: Usando as portas AND e XOR, você pode construir o circuito de meio-somador, que calcula a soma de dois bits. Isso é representado em um diagrama de circuito lógico, em que os fios representam os bits e as portas que operam nos bits são mostradas como símbolos nos fios correspondentes:
Assim, os dois bits são copiados e alimentados por uma porta AND e uma porta XOR. O resultado da porta XOR é o "bit de soma" (S), que permanece no lugar das unidades do número binário, e o resultado da porta AND é o "bit de transporte" (C), que é o valor do próximo dígito mais significativo do número binário. Aqui está a tabela de verdade:
Soma ( ) | Carry ( ) | ||
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Verifique sua compreensão
Verifique se a tabela verdade acima produz a solução correta para um circuito somador. Ou seja, para cada uma das quatro opções de A e B, verifique se .
Computadores quânticos
Bits qubits
Assim como os bits são as unidades fundamentais da informação clássica, os bits quânticos, ou "qubits", são as unidades fundamentais da informação quântica. Assim como o bit clássico, o estado de um qubit pode ser 0 ou 1, que normalmente denotamos como e . Mas, diferentemente do bit clássico, um bit quântico também pode estar em uma superposição do estado e do estado ao mesmo tempo. Em geral, um qubit pode estar em qualquer estado da forma:
em que e são amplitudes complexas com .
A fase quântica
Como e são complexos, cada um deles pode ser escrito como , onde é chamado de fase. Se multiplicarmos todo o estado pelo mesmo fator de fase geral, nada muda fisicamente - isso é chamado de fase global e não tem consequências observáveis.
Por esse motivo, é convencional "fatorar" , dando:
em que é a fase relativa do estado quântico, que tem consequências observáveis.
Essa fase desempenha um papel muito importante na computação quântica, e você explorará suas várias consequências nos módulos subsequentes do Qiskit in the Classroom.
Vários qubits
Embora o estado de vários bits possa ser expresso simplesmente como uma cadeia de 0s e 1s, o estado de vários qubits é um pouco mais complicado devido aos princípios de superposição e emaranhamento.
Lembre-se de que bits podem estar em um dos estados possíveis, variando dos números binários 000...000 a 111...111. Mas agora, devido ao princípio da superposição, os qubits podem estar em uma superposição de todos esses estados ao mesmo tempo!
Isso pode ser expresso como
onde, como no caso clássico, o estado corresponde ao estado em que cada qubit está na combinação certa de 0s e 1s para produzir o número binário . Esses são conhecidos como "estados da base computacional" do sistema quântico. Por exemplo, um estado de três qubits pode ser escrito como uma superposição de seus oito estados de base computacional:
Cada qubit no sistema é denotado com um índice a . A convenção é ler os estados dos qubits da direita para a esquerda, de modo que o estado do qubit seja o estado mais à direita e o estado do qubit seja o mais à esquerda. Isso é conhecido como notação "little-endian" e, a princípio, pode parecer contraintuitivo, pois estamos acostumados a ler da esquerda para a direita.
Verifique sua compreensão
À primeira vista, pode parecer contraintuitivo ordenar os qubits da direita para a esquerda, como na notação little-endian, mas, na verdade, é algo muito lógico de se fazer! Explique por quê. (Lembre-se de nossa discussão acima sobre a conversão de números binários para base-10 )
Se ordenarmos os qubits da direita para a esquerda, de modo que o qubit 0 seja o mais à direita e o qubit N-1 seja o mais à esquerda, é lógico associar o qubit ao bit menos significativo, que é multiplicado por e o qubit ao bit mais significativo, que é multiplicado por .
Emaranhamento
Como mencionamos anteriormente, outro recurso importante dos qubits é que eles podem ser emaranhados uns com os outros. Vejamos um exemplo de um estado de dois qubits, em que e :
Portanto, o estado do qubit 0 pode ser ou com a mesma probabilidade, e o mesmo ocorre com o estado do qubit 1. Mas essas probabilidades não são mais independentes umas das outras. Se descobrirmos que o estado do qubit 0 é , saberemos que o qubit 1 também estará em . Isso é verdade independentemente da distância entre eles, e é por isso que o ato de medir um estado emaranhado é às vezes chamado de "ação assustadora à distância"
O entrelaçamento também pode assumir outras formas. Por exemplo, o estado
produz resultados opostos todas as vezes: se um qubit for medido , é garantido que o outro será encontrado no estado .
Verifique sua compreensão
O estado está emaranhado? Por que ou por que não?
Ele não está emaranhado. Embora os resultados sejam sempre os mesmos quando você mede os dois qubits, isso ocorre apenas porque cada qubit está sempre fixo no estado . O resultado da medição de um qubit não depende de fato do outro - ambos estão sempre .
Em geral, se você puder descrever o estado de cada qubit separadamente e depois multiplicá-los dessa forma:
Nesse caso, ele é conhecido como um "estado de produto" e não está emaranhado.
Notação vetorial
Muitas vezes, é útil usar vetores e matrizes para ver como o estado quântico se transforma em diferentes operações. Nessa representação, nossos estados quânticos serão vetores, e nossas portas quânticas (discutidas na próxima seção) serão matrizes que transformam os vetores.
Para um único qubit, a forma vetorial dos estados é escolhida para ser: Dessa forma, um estado arbitrário pode ser escrito como
Para um estado geral de -qubit, precisaremos de um vetor -dimensional, com estados de base ordenados, como seria de se esperar, em valor binário crescente:
Com essa escolha de notação vetorial em mente, podemos apresentar nossas portas quânticas necessárias, seus efeitos sobre os estados quânticos e suas formas de matriz.
Verifique sua compreensão
Há quatro estados de base computacional para um sistema de dois qubits. Escreva cada um deles nas notações de ket e vetor.
Portas portas quânticas
Assim como as portas clássicas, como NOT, AND, OR e XOR, podem ser combinadas para criar circuitos clássicos arbitrários, as portas quânticas desempenham o mesmo papel na computação quântica. Como os qubits têm recursos mecânicos quânticos adicionais, as portas quânticas são correspondentemente mais ricas. Embora ainda possamos descrever sua ação com base nos estados e com uma tabela de verdade, isso não capta todo o quadro. Para portas quânticas, geralmente é mais natural usar uma representação matricial, pois elas também atuam em superposições de estados básicos.
A seguir, apresentaremos as portas quânticas mais comuns e como elas transformam os qubits com os quais interagem. Quando aplicável, nós os conectaremos de volta aos portões clássicos conhecidos.
Portas de qubit único
porta : Esse é o equivalente quântico de uma operação NOT. Sua tabela verdade se parece exatamente com a porta NOT clássica:
Entrada | Saída |
|---|---|
E a representação da matriz:
No Qiskit, a criação de um circuito com uma porta tem a seguinte aparência:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")Output:
Nesse diagrama de circuito muito simples, o qubit é representado por um fio, a linha horizontal preta, e a porta aparece como uma caixa nesse fio.
Porta Hadamard: Cria um estado de superposição. Tabela verdade:
Entrada | Saída |
|---|---|
Representação matricial:
Um circuito com uma porta Hadamard é feito da seguinte forma:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")Output:
portão : Adiciona uma mudança de fase de ao estado :
Entrada | Saída |
|---|---|
No Qiskit, a criação de um circuito com uma porta tem a seguinte aparência:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")Output:
portão : Adiciona uma mudança de fase de ao estado :
Entrada | Saída |
|---|---|
No Qiskit, a criação de um circuito com uma porta tem a seguinte aparência:
qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")Output:
Portas multi-qubit
As portas de dois qubits podem se assemelhar às portas clássicas de dois bits, mas com uma ressalva importante: todas as portas quânticas devem ser reversíveis. Em termos de álgebra linear, isso significa que eles são representados por matrizes unitárias. Assim, dois qubits de entrada sempre são mapeados para dois qubits de saída, e a operação pode, em princípio, ser desfeita. Isso contrasta com as portas clássicas que vimos acima, como AND ou OR, que perdem informações e são irreversíveis - dada uma saída, não é possível determinar com exclusividade a entrada.
Porta CNOT (Controlled-NOT): Os dois qubits de entrada são chamados de qubits de "controle" e "alvo". O qubit de controle permanece inalterado, mas seu estado determina o que acontece com o qubit de destino. Se o qubit de controle estiver no estado , uma porta será aplicada a esse alvo; se o estado do qubit de controle for , nenhuma alteração será feita. Na notação abaixo, suponha que o qubit (qubit mais à direita) seja o controle e o qubit (o qubit mais à esquerda) seja o alvo. Abaixo, a notação usada é
Entrada | Saída |
|---|---|
Portanto, a matriz que representa essa ação é:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")Output:
Esse é o primeiro diagrama de circuito que vemos com dois qubits, que são representados pelos dois fios. A porta CNOT é implementada entre os dois qubits, com como controle e como alvo.
Verifique sua compreensão
A maioria dos portões tem a mesma forma de matriz no Qiskit e em qualquer outro lugar. Mas a porta CNOT atua em dois qubits e, de repente, as convenções de ordenação dos qubits se tornam um problema. Textos que ordenam qubits mostrarão uma forma de matriz diferente para suas portas CNOT. Verifique, por meio da multiplicação explícita de matrizes, se a matriz CNOT acima tem a ação correta sobre o estado
Porta SWAP: Essa porta troca os estados de dois qubits. Tabela verdade:
Entrada | Saída |
|---|---|
Portanto, a matriz que representa essa ação é:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")Output:
A porta SWAP pode, na verdade, ser construída a partir de três CNOTs. Para ver como, podemos decompose() o portão com o Qiskit:
qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.decompose().draw("mpl")Output:
Aqui vemos pela primeira vez como várias portas são mostradas em um diagrama de circuito. Nós o lemos da esquerda para a direita, de modo que a porta mais à esquerda é aplicada primeiro.
Verifique sua compreensão
Verifique se a combinação de CNOTs acima resulta em uma porta SWAP. Você pode fazer isso com a multiplicação de matrizes ou qualquer outro método.
Com multiplicação de matriz:
Usar uma tabela verdade para ver como os estados mudam com cada CNOT. Na última coluna, os estados devem ser equivalentes à coluna "saída" da tabela verdade SWAP:
EntradaCNOT(A,B)CNOT(B,A)CNOT(A,B)
Porta Toffoli (ou "controlado-controlado-NOT" (CCNOT)): Essa é uma porta de três qubits. O nome "controlled-controlled-NOT" talvez já diga como ele funciona: há dois qubits de controle e um qubit de destino, e o estado do qubit de destino é invertido somente se ambos os qubits de controle estiverem no estado . Mantemos a convenção de ordenação que usamos com o CNOT:
Portanto, a tabela de verdade é:
Entrada | Saída |
|---|---|
E a matriz que representa essa ação é:
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")Output:
O portão de Toffoli também pode ser decomposto em CNOTs, juntamente com alguns outros portões. No entanto, ela é significativamente mais complicada do que a decomposição da porta SWAP, portanto, será deixada como um exercício opcional no final do módulo para explorar e verificar essa decomposição.
Medições
As medições desempenham um papel especial na computação quântica, que não tem um análogo na computação clássica. Enquanto na computação clássica é possível verificar os bits a qualquer momento durante um algoritmo, na computação quântica é preciso ser muito seletivo quanto ao momento de verificar os qubits, pois a medição colapsa o estado deles e destrói a superposição que dá aos qubits sua complexidade computacional.
Em particular, dado um estado quântico de -bit , uma medição colapsará o estado para uma das funções de base com uma probabilidade igual a .
Mas esse efeito destrutivo de uma medição nem sempre é um obstáculo. De fato, é um recurso fundamental em determinados algoritmos e protocolos, como o teletransporte quântico e a distribuição de chaves quânticas.
No Qiskit, quando uma medição é feita, ela é enviada para um registro clássico, onde é armazenada como um bit clássico. A criação de um circuito com uma medição tem a seguinte aparência:
qc = QuantumCircuit(
1, 1
) # the second number is the number of classical bits in the circuit
qc.measure(0, 0)
qc.draw("mpl")Output:
Circuitos
Agora que sabemos como funcionam os qubits, as portas e as medições, vamos criar e executar nosso próprio circuito quântico! Para isso, precisaremos apresentar a você um fluxo de trabalho útil chamado Qiskit patterns.
Estrutura de padrões Qiskit
A estrutura de padrões Qiskit é um procedimento geral para abordar e resolver problemas com um computador quântico. Ele consiste em quatro etapas:
- Mapeamento de nosso problema para circuitos e operadores quânticos
- Otimização do circuito para o hardware de destino
- Execução no hardware de destino
- Pós-processamento de nossos resultados
Para ilustrar essas etapas, implementaremos uma versão quântica do circuito meio-somador discutido acima.
1. Mapeamento
O circuito somador clássico usa uma porta XOR e uma porta AND para calcular a soma e os bits de transporte, respectivamente. Podemos adaptar essas portas ao contexto quântico para criar o meio somador quântico. Primeiro, lembrando que as portas quânticas são reversíveis, não podemos simplesmente sobrescrever as entradas. Em vez disso, introduzimos dois qubits auxiliares inicializados em para armazenar as saídas de soma e transporte. Portanto, nosso estado quântico completo consistirá em qubits e , e os qubits de soma e transporte, que rotularemos como e :
Agora, precisamos de portas quânticas que realizem o que as portas XOR e AND fizeram no circuito clássico.
Soma:
Para o XOR, aplicamos dois CNOTs, cada um com qubits de controle e e qubit de destino para ambos. Se e forem diferentes, uma das portas CNOT inverterá para o estado . Se e forem ambos , então nada acontecerá com e ele permanecerá no estado . Se e forem ambos , o estado de será invertido duas vezes, levando-o de volta ao estado .
Transportar:
Para o bit de transporte, precisamos de algo que funcione como a porta AND clássica.
Verifique sua compreensão
Dê uma olhada nas portas que discutimos para ver se você consegue adivinhar qual porta quântica usaremos no lugar da porta AND clássica:
É o portão Toffoli! Lembre-se de que a porta Toffoli, ou controlada-controlada-NÃO, inverte o estado de destino se e somente se o qubit de controle 0 E o qubit de controle 1 forem ambos . Portanto, se o qubit de destino começar no estado , ele terá a mesma ação que a porta AND.
Portanto, agora temos todos os ingredientes necessários para fazer o circuito quântico:
# qubits: a, b, sum, carry
qc = QuantumCircuit(4)
# Choose values for A and B:
a = 0
b = 0
# Prepare A and B qubits according to selected values:
if a:
qc.x(0)
if b:
qc.x(1)
# XOR (sum) into qubit 2
qc.cx(0, 2)
qc.cx(1, 2)
# AND (carry) into qubit 3
qc.ccx(0, 1, 3) # a AND b
# measure
qc.measure_all()
qc.draw("mpl")Output:
Acima está o diagrama do circuito quântico de meio-somador. Conforme mencionado anteriormente, os fios representam os qubits a ordenados de cima para baixo, e o registro de bits clássico é o fio de linha dupla inferior. Em seguida, lendo da esquerda para a direita, vemos como as portas são aplicadas a cada qubit, observando onde as caixas aparecem nos fios correspondentes. Por fim, as medições são mostradas no final. As medições colapsam os estados do qubit em valores definidos ou , e os resultados são enviados para um registro clássico.
Uma sutileza: embora o diagrama do circuito esteja desenhado da esquerda para a direita, ao escrever a expressão da matriz correspondente, devemos lê-la da direita para a esquerda. Isso ocorre porque, na multiplicação de matrizes, o operador mais próximo do vetor de estado atua primeiro. Assim, por exemplo, o circuito acima (ignorando as medições) seria escrito como:
2. Otimização:
Em seguida, precisamos otimizar o circuito para ser executado no hardware quântico. Essa otimização é realizada por meio do transpilador, que traduz o circuito abstrato mostrado acima em instruções que o computador quântico entenderá. Ele atribui os qubits lógicos acima a qubits reais e físicos no processador e reescreve as portas em termos de seu próprio conjunto nativo de portas que foram otimizadas para serem executadas no computador quântico. Por fim, o transpilador também implementa algo chamado "supressão e atenuação de erros" para tentar minimizar o efeito dos erros no resultado. Isso não é tão importante para o nosso circuito muito simples, mas se você continuar em sua jornada de computação quântica para executar circuitos mais complicados, logo verá o valor da supressão e atenuação de erros. Se você quiser saber mais sobre isso, consulte o curso de Olivia Lane, Quantum Computing in Practice (Computação quântica na prática ).
Primeiro, carregamos os pacotes necessários para nos comunicarmos com os computadores quânticos do IBM® e selecionamos um backend para execução. Podemos escolher o backend menos ocupado ou selecionar um backend específico cujas propriedades conhecemos.
Há um código abaixo para salvar suas credenciais na primeira utilização. Certifique-se de excluir essas informações do notebook depois de salvá-lo em seu ambiente, para que suas credenciais não sejam compartilhadas acidentalmente quando você compartilhar o notebook. Consulte Configurar sua conta IBM Cloud e Inicializar o serviço em um ambiente não confiável para obter mais orientações.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load the Qiskit Runtime service
# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',
# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')
# Load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)Output:
ibm_fez
Agora, usamos o transpilador para otimizar o circuito. Podemos escolher o nível de otimização de 0 (sem otimização) a 3 (otimização máxima). Para ver o que cada nível implica, visite o guia de níveis de otimização do transpilador Set. O circuito resultante terá uma aparência significativamente diferente do circuito lógico que criamos em nossa etapa de mapeamento.
# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
qc_isa.draw("mpl")Output:
Um "amostrador" é um primitivo projetado para amostrar possíveis estados resultantes de um circuito quântico e coletar estatísticas sobre quais estados podem ser medidos e com qual probabilidade. Importamos o Qiskit Runtime Sampler para cá:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)Se você tiver esgotado o tempo alocado em computadores quânticos reais ou se não tiver conexão com a Internet, talvez prefira usar um simulador. Para fazer isso, execute a célula abaixo e descomente a linha associada na etapa "Execute" (Executar).
# Load the backend sampler
from qiskit.primitives import BackendSamplerV2
# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel
noise_model = NoiseModel.from_backend(backend)
# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)3. Execução
Depois de preparar o circuito, agora podemos executá-lo no computador quântico!
job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()4. Pós-processamento
Agora estamos prontos para ver nossos resultados! Exibiremos um histograma das 100 amostras do circuito.
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)Output:
counts = {'0000': 90, '0100': 4, '1100': 3, '0010': 3}
O histograma acima mostra os resultados da medição de todos os quatro qubits no final do circuito. Um computador quântico ideal com ruído zero teria medido os qubits para ter sempre os mesmos valores, mas, na realidade, o ruído fará com que algumas das execuções produzam erros.
Verifique sua compreensão
Usando o bitstring com o maior número de contagens como seus valores para , , e , verifique se o circuito de somador quântico funcionou.
Precisamos verificar se . Lembre-se de que a ordem da cadeia de bits segue a notação little-endian, portanto, é lida
CSBA.No histograma acima, vemos que o bitstring
0000é o dominante.
Volte e altere os valores de e para e e siga novamente as etapas dos padrões do Qiskit para executar novamente o circuito. Verifique se o circuito somador funcionou novamente.
Você deverá obter um histograma com o bitstring dominante sendo
1011:
Um dos recursos adicionais do meio-somador quântico em relação ao meio-somador clássico é que ele pode ser executado com entradas quânticas. Ou seja, ele pode "adicionar" os qubits e mesmo que eles estejam em estados de superposição. Na seção Perguntas de desafio abaixo, será solicitado que você prepare os qubits em superposições e veja o que acontece!
Conclusão
Este módulo foi projetado para lhe dar uma sólida compreensão dos princípios básicos por trás da computação quântica, comparando-a com a computação clássica. Examinamos o circuito clássico de meio-somador e, em seguida, mostramos como adaptar o circuito para ser executado com qubits em um computador quântico. Agora você está pronto para explorar os outros módulos do Qiskit in the Classroom!
Conceitos críticos:
- Em contraste com os bits clássicos, que só podem assumir os valores 0 e 1, os qubits também podem estar em estados de superposição de 0 e 1.
- Vários qubits podem estar em uma superposição sobre as cadeias de bits classicamente permitidas, chamadas de estados de base computacional.
- Vários qubits podem ser emaranhados de modo que o estado de um dependa do estado do outro.
- A convenção do Qiskit é usar a notação little-endian, que coloca o qubit menos significativo, , na posição mais à direita e o qubit mais significativo, , na mais à esquerda.
- As portas quânticas são operações reversíveis representadas por matrizes unitárias que atuam nos vetores de estado quântico. Nessa notação, a matriz mais próxima do vetor (que está mais à direita) age primeiro.
- As medições colapsam um estado de superposição quântica em um de seus estados classicamente permitidos, com probabilidade igual ao quadrado da amplitude do estado da base computacional correspondente na superposição.
- Os circuitos quânticos são frequentemente representados por meio de diagramas de circuitos quânticos, em que os qubits são representados como fios horizontais e as portas quânticas aparecem ao longo desses fios, da esquerda para a direita.
- Para executar um circuito quântico, usamos as quatro etapas do fluxo de trabalho dos padrões Qiskit : Mapear, otimizar, executar e pós-processar.
Perguntas
Questões de verdadeiro/falso
-
Um único bit em um computador clássico só pode conter o valor 0 ou 1.
-
O entrelaçamento significa que o estado de um qubit é independente do estado de outro.
-
As portas quânticas geralmente são operações irreversíveis.
-
A convenção Qiskit coloca o qubit menos significativo, , na posição mais à esquerda.
-
A medição de um estado quântico sempre apresenta exatamente o mesmo resultado se for repetida várias vezes.
-
A porta Hadamard cria uma superposição em um único qubit.
-
Os circuitos quânticos podem incluir operações de medição que colapsam o estado de superposição em um dos estados classicamente permitidos.
-
O número de estados clássicos possíveis para bits é .
-
As probabilidades de resultado das medições quânticas são dadas pelas amplitudes ao quadrado dos estados básicos classicamente mensuráveis.
Perguntas de resposta curta
-
Quais são as principais diferenças entre um bit e um qubit?
-
O que acontece com um estado quântico quando ele é medido?
-
Por que usamos a notação little-endian no Qiskit?
-
Quais são as quatro etapas do fluxo de trabalho dos padrões do Qiskit?
Perguntas desafiadoras:
-
No módulo, usamos apenas o somador para adicionar estados classicamente permitidos para e . Mas também podemos preparar e em superposições! Altere o código para preparar cada qubit em uma sobreposição igual de 0 e 1, depois execute o novo circuito e obtenha um novo histograma. O que você está vendo? Explique o que está acontecendo.
-
Decomposição da porta Toffoli. Use o site
decompose()para mostrar como a porta Toffoli é decomposta em portas de um e dois qubits e, em seguida, verifique essa construção com a multiplicação de matrizes. Lembre-se de que, embora os diagramas de circuito sejam lidos da esquerda para a direita, as matrizes são aplicadas aos estados quânticos da direita para a esquerda!