Portuguese
Idiomas
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

Introdução ao Qiskit

Ao usar o Qiskit um fluxo de trabalho do usuário nominalmente consiste em seguir quatro etapas de alto nível:

  • Construir: Projete circuito (s) quântico (s) que represente o problema que você está considerando.

  • Compilar: Compila circuitos para um serviço quântico específico, por exemplo, um sistema quântico ou simulador clássico.

  • Execute: execute os circuitos compilados no serviço(s) quântico especificado. Esses serviços podem ser na nuvem ou locais.

  • Analisar: Calcule estatísticas resumidas e visualize os resultados dos experimentos.

Aqui é exibido um exemplo de todo o workflow, com cada passo explicado em detalhes nas seções subsequentes:

import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit.providers.aer import QasmSimulator
from qiskit.visualization import plot_histogram

# Use Aer's qasm_simulator
simulator = QasmSimulator()

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(2, 2)

# Add a H gate on qubit 0
circuit.h(0)

# Add a CX (CNOT) gate on control qubit 0 and target qubit 1
circuit.cx(0, 1)

# Map the quantum measurement to the classical bits
circuit.measure([0,1], [0,1])

# compile the circuit down to low-level QASM instructions
# supported by the backend (not needed for simple circuits)
compiled_circuit = transpile(circuit, simulator)

# Execute the circuit on the qasm simulator
job = simulator.run(compiled_circuit, shots=1000)

# Grab results from the job
result = job.result()

# Returns counts
counts = result.get_counts(compiled_circuit)
print("\nTotal count for 00 and 11 are:",counts)

# Draw the circuit
circuit.draw()

Total count for 00 and 11 are: {'00': 525, '11': 475}
     ┌───┐     ┌─┐   
q_0: ┤ H ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
          └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 
# Plot a histogram
plot_histogram(counts)
_images/intro_tutorial1_1_0.png

Fluxo passo-a-passo

O trecho de código apresentado acima é composto de seis passos:

  1. Importar pacotes

  2. Inicializar variáveis

  3. Adicionar portas

  4. Visualizar o circuito

  5. Simular o experimento

  6. Visualizar os resultados

Passo 1: Importar pacotes

Os elementos básicos necessários para seu programa são importados como segue:

import numpy as np
from qiskit import QuantumCircuit
from qiskit.providers.aer import QasmSimulator
from qiskit.visualization import plot_histogram

Em maiores detalhes, os imports são

  • QuantumCircuit: pode ser pensado como as instruções do sistema quântico. Ele contém todas as suas operações quânticas.

  • QasmSimulator: é o simulador de circuito de alto desempenho Aer.

  • plot_histogram: cria histogramas.

Passo 2: Inicializar variáveis

Considere a linha de código a seguir:

circuit = QuantumCircuit(2, 2)

Aqui, você inicializa com 2 qubits no estado zero; com 2 bits clássicos definidos para zero; e `` circuito`` é o circuito quântico.

Sintaxe:

  • QuantumCircuit(int, int)

Passo 3: Adicionar portas

Você pode adicionar portas (Operações) para manipular os registradores do seu circuito.

Considere as três linhas de código seguintes:

circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0,1], [0,1])

As portas são adicionadas ao circuito uma a uma para formar o estado de Bell

\[|\psi\rangle = \left(|00\rangle+|11\rangle\right)/\sqrt{2}.\]

O código acima aplica as seguintes portas:

  • QuantumCircuit.h(0): Uma porta Hadamard \(H\) no qubit 0, que coloca-o em um estado de superposição.

  • QuantumCircuit.cx(0, 1): Uma operação não controlada (\(CNOT\)) no qubit de controle 0 e no qubit de destino 1, colocando os quibits em um estado de emaranhamento.

  • QuantumCircuit.measure([0,1], [0,1]): se você passar todos os registradores quânticos e clássicos para measure, o resultado da medição do i-ésimo qubit será armazenado no i-ésimo bit clássico.

Passo 4: Visualizar o circuito

Você pode utilizar qiskit.circuit.QuantumCircuit.draw() para visualizar o circuito que você projetou nas várias formas usadas em muitos livros didáticos e artigos de pesquisa.

circuit.draw()
     ┌───┐     ┌─┐   
q_0: ┤ H ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
          └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 

Neste circuito, os qubits são ordenados com qubit zero na parte superior e qubit um na parte inferior. O circuito é lido da esquerda para a direita, o que significa que as portas que são aplicadas anteriormente no circuito aparecem mais à esquerda.

O serviço padrão para QuantumCircuit.draw() ou qiskit.visualization.circuit_drawer() é o serviço de texto. No entanto, dependendo do seu ambiente local, você pode querer alterar estes padrões para algo mais apropriado ao seu caso de uso. Isso é feito com o arquivo de configuração do usuário. Por padrão, o arquivo de configuração do usuário deve estar localizado em ~/.qiskit/settings.conf e é um arquivo .ini.

Por exemplo, um arquivo settings.conf para configurar um drawer do Matplotlib é:

[default]
circuit_drawer = mpl

Você pode utilizar qualquer um dos serviços de desenho de circuito válidos como o valor para esta configuração, isso inclui text, mpl, latex, e latex_source.

Passo 5: Simular o experimento

Qiskit Aer é um framework simulador de alto desempenho para circuitos quânticos. Ele fornece vários backends para atingir diferentes objetivos de simulação.

Caso tenha problemas ao instalar o Aer, você pode alternativamente utilizar o provedor Basic Aer substituindo Aer por BasicAer. Basic Aer está incluso no Qiskit Terra.

import numpy as np
from qiskit import QuantumCircuit, transpile
from qiskit.providers.basicaer import QasmSimulatorPy
...

Para simular este circuito, você utilizará o qasm_simulator. Cada execução deste circuito produzirá a sequência de bits 00 or 11.

simulator = QasmSimulator()
compiled_circuit = transpile(circuit, simulator)
job = simulator.run(compiled_circuit, shots=1000)
result = job.result()
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

Total count for 00 and 11 are: {'11': 526, '00': 474}

Como esperado, a saída da sequência de bits é 00 aproximadamente 50 por cento do tempo. O número de vezes que o circuito é executado pode ser especificado por meio do argumento shots do método execute. O número de execuções da simulação foi definido como 1000 (o padrão é 1024).

Uma vez que tenha um objeto result, você pode acessar as contagens por meio do método get_counts(circuit). Isso fornece os resultados agregados do experimento executado.

Passo 6: Visualizar os resultados

Qiskit fornece muitas visualizações,

incluindo a função plot_histogram, para visualizar seus resultados.

plot_histogram(counts)
_images/intro_tutorial1_4_0.png

As probabilidades observadas \(Pr(00)\) e \(Pr(11)\) são computadas tomando as respectivas contagens e dividindo pelo número total de execuções.

Nota

Tente modificar o argumento shots no método run() para ver como as probabilidades estimadas mudam.

Próximos Passos

Agora que você aprendeu o básico, considere estes recursos de aprendizagem: