Qiskit é um SDK de código aberto para trabalhar com computadores quânticos no nível de circuitos quânticos estendidos, operadores e primitivos.
Esta biblioteca é o componente principal do Qiskit, que contém os blocos de construção para criar e trabalhar com circuitos quânticos, operadores quânticos e funções primitivas (Amostrador e Estimador). Ele também contém um transpilador que suporta a otimização de circuitos quânticos e uma caixa de ferramentas de informações quânticas para a criação de operadores avançados.
Para obter mais detalhes sobre como usar o Qiskit, consulte a documentação localizada aqui:
https://docs.quantum.ibm.com/
Aviso
Não tente atualizar um ambiente Qiskit 0.* existente para Qiskit 1.0 in-loco. Leia mais.
Encorajamos a instalação do Qiskit via pip
:
pip install qiskit
Pip irá lidar com todas as dependências automaticamente e você sempre instalará a versão mais recente (e bem testada).
Para instalar a partir do código-fonte, siga as instruções da documentação.
Agora que o Qiskit está instalado, é hora de começar a trabalhar com o Qiskit. As partes essenciais de um programa quântico são:
sampler
de função primitiva para amostrar resultados ou o estimator
para estimar valores. Crie um exemplo de circuito quântico usando a classe QuantumCircuit
:
import numpy as np
from qiskit import QuantumCircuit
# 1. A quantum circuit for preparing the quantum state |000> + i |111>
qc_example = QuantumCircuit ( 3 )
qc_example . h ( 0 ) # generate superpostion
qc_example . p ( np . pi / 2 , 0 ) # add quantum phase
qc_example . cx ( 0 , 1 ) # 0th-qubit-Controlled-NOT gate on 1st qubit
qc_example . cx ( 0 , 2 ) # 0th-qubit-Controlled-NOT gate on 2nd qubit
Este exemplo simples torna um estado emaranhado conhecido como estado GHZ h
), porta de fase ( p
) e porta CNOT ( cx
).
Depois de fazer seu primeiro circuito quântico, escolha qual função primitiva você usará. Começando com sampler
, usamos measure_all(inplace=False)
para obter uma cópia do circuito no qual todos os qubits são medidos:
# 2. Add the classical output in the form of measurement of all qubits
qc_measured = qc_example . measure_all ( inplace = False )
# 3. Execute using the Sampler primitive
from qiskit . primitives import StatevectorSampler
sampler = StatevectorSampler ()
job = sampler . run ([ qc_measured ], shots = 1000 )
result = job . result ()
print ( f" > Counts: { result [ 0 ]. data [ "meas" ]. get_counts () } " )
Executar isso fornecerá um resultado semelhante a {'000': 497, '111': 503}
que é 000
50% do tempo e 111
50% do tempo até flutuações estatísticas. Para ilustrar o poder do Estimador, agora usamos a caixa de ferramentas de informação quântica para criar o operador run()
, junto com nosso circuito quântico. Observe que o Estimador requer um circuito sem medição, portanto usamos o circuito qc_example
que criamos anteriormente.
# 2. Define the observable to be measured
from qiskit . quantum_info import SparsePauliOp
operator = SparsePauliOp . from_list ([( "XXY" , 1 ), ( "XYX" , 1 ), ( "YXX" , 1 ), ( "YYY" , - 1 )])
# 3. Execute using the Estimator primitive
from qiskit . primitives import StatevectorEstimator
estimator = StatevectorEstimator ()
job = estimator . run ([( qc_example , operator )], precision = 1e-3 )
result = job . result ()
print ( f" > Expectation values: { result [ 0 ]. data . evs } " )
Executar isso dará o resultado 4
. Por diversão, tente atribuir um valor de +/- 1 a cada operador de qubit único X e Y e veja se você consegue esse resultado. (Alerta de spoiler: isso não é possível!)
Usar o qiskit.primitives.StatevectorSampler
e qiskit.primitives.StatevectorEstimator
fornecidos pelo Qiskit não o levará muito longe. O poder da computação quântica não pode ser simulado em computadores clássicos e você precisa usar hardware quântico real para escalar circuitos quânticos maiores. No entanto, a execução de um circuito quântico em hardware requer a reescrita das portas básicas e da conectividade do hardware quântico. A ferramenta que faz isso é o transpiler, e o Qiskit inclui passagens de transpiler para síntese, otimização, mapeamento e agendamento. No entanto, também inclui um compilador padrão, que funciona muito bem na maioria dos exemplos. O código a seguir mapeará o circuito de exemplo para basis_gates = ['cz', 'sx', 'rz']
e uma cadeia linear de qubits coupling_map =[[0, 1], [1, 2]]
.
from qiskit import transpile
qc_transpiled = transpile ( qc_example , basis_gates = [ 'cz' , 'sx' , 'rz' ], coupling_map = [[ 0 , 1 ], [ 1 , 2 ]] , optimization_level = 3 )
Qiskit fornece uma camada de abstração que permite aos usuários executar circuitos quânticos em hardware de qualquer fornecedor que forneça uma interface compatível. A melhor maneira de usar o Qiskit é com um ambiente de tempo de execução que fornece implementações otimizadas de sampler
e estimator
para uma determinada plataforma de hardware. Este tempo de execução pode envolver o uso de pré e pós-processamento, como passagens de transpiler otimizadas com supressão de erros, mitigação de erros e, eventualmente, correção de erros integrada. Um tempo de execução implementa interfaces qiskit.primitives.BaseSamplerV2
e qiskit.primitives.BaseEstimatorV2
. Por exemplo, alguns pacotes que fornecem implementações de uma implementação primitiva de tempo de execução são:
Qiskit também fornece uma interface abstrata de nível inferior para descrever back-ends quânticos. Esta interface, localizada em qiskit.providers
, define uma classe abstrata BackendV2
que os provedores podem implementar para representar seu hardware ou simuladores no Qiskit. A classe backend inclui uma interface comum para execução de circuitos nos backends; entretanto, nesta interface cada provedor pode realizar diferentes tipos de pré e pós-processamento e retornar resultados definidos pelo fornecedor. Alguns exemplos de pacotes de provedores publicados que fazem interface com hardware real são:
Você pode consultar a documentação desses pacotes para obter mais instruções sobre como obter acesso e usar esses sistemas.
Se você gostaria de contribuir com o Qiskit, dê uma olhada em nossas diretrizes de contribuição. Ao participar, espera-se que você cumpra nosso código de conduta.
Usamos problemas do GitHub para rastrear solicitações e bugs. Junte-se à comunidade Qiskit Slack para discussões, comentários e perguntas. Para questões relacionadas à execução ou uso do Qiskit, o Stack Overflow possui um qiskit
. Para perguntas sobre computação quântica com Qiskit, use a tag qiskit
no Quantum Computing Stack Exchange (por favor, leia primeiro as orientações sobre como perguntar nesse fórum).
Qiskit é o trabalho de muitas pessoas que contribuem para o projeto em diferentes níveis. Se você usa o Qiskit, cite conforme o arquivo BibTeX incluído.
O changelog de uma versão específica é gerado dinamicamente e gravado na página de lançamento no Github para cada versão. Por exemplo, você pode encontrar a página da versão 0.46.0
aqui:
https://github.com/Qiskit/qiskit/releases/tag/0.46.0
O changelog da versão atual pode ser encontrado na guia releases: O changelog fornece uma visão geral rápida das mudanças notáveis para uma determinada versão.
Além disso, como parte de cada versão, notas de versão detalhadas são escritas para documentar detalhadamente o que mudou como parte de uma versão. Isso inclui qualquer documentação sobre possíveis alterações importantes na atualização e novos recursos. Veja todas as notas de lançamento aqui.
Reconhecemos o apoio parcial para o desenvolvimento do Qiskit do DOE Office of Science National Quantum Information Science Research Centers, Co-design Center for Quantum Advantage (C2QA) sob o contrato número DE-SC0012704.
Licença Apache 2.0