Skip to main content
IBM Quantum Platform

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:

  • qiskit v2.1.0 ou mais recente
  • qiskit-ibm-runtime v0.40.1 ou mais recente
  • qiskit-aer v0.17.0 ou mais recente
  • qiskit.visualization
  • numpy
  • pylatexenc

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 = 00004 = 01008 = 100012 = 1100
1 = 00015 = 01019 = 100113 = 1101
2 = 00106 = 011010 = 101014 = 1110
3 = 00117 = 011111 = 101115 = 1111

Em geral, para converter de um número binário de NN bits para um número familiar, base-10, você multiplica o bit menos significativo (mais à direita) por 20=12^0 = 1, o próximo bit à esquerda por 21=22^1 = 2, depois o próximo por 22=42^2 = 4, e assim por diante, até chegar ao mais significativo (bit mais à esquerda), que você multiplica 2N12^{N-1}.

Portanto, isso significa que NN bits podem estar em um dos 2N2^N 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 NN bits permite que você represente os números 00 a 2N12^N - 1, portanto, usando seis bits, chegaríamos a 261=632^6 - 1 = 63. Isso não é suficiente. Adicionamos mais um bit para chegar a 271=1272^7 - 1 = 127. Agora vamos dividir 86 em potências de 2:

    86=64+16+4+2=26×1+25×0+24×1+23×0+22×1+21×1+20×0=1010110\begin{aligned} 86 &= 64 + 16 + 4 + 2 \\ &= 2^6 \times 1 + 2^5 \times 0 + 2^4 \times 1 + 2^3 \times 0 + 2^2 \times 1 + 2^1 \times 1 + 2^0 \times 0 \\ &= 1010110 \end{aligned}

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
01
10

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
000
010
220
111

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
000
011
221
111

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
000
011
221
110

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:

Diagrama de circuito clássico para o circuito meio-somador. Uma porta XOR gera o bit de saída de soma e uma porta AND gera o bit de saída de transporte.

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:

AA
BB
Soma ( ABA \oplus B )
Carry ( ABA \wedge B )
0000
0110
1010
1101

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 A+B=S+2×CA+B=S+2 \times C.

  • 0+0=0+0=0 0+1=1+0=1 1+0=1+0=1 1+1=0+2=2 \begin{aligned} 0+0 &= 0+0 = 0 ~\checkmark \\ 0+1 &= 1+0 = 1 ~\checkmark \\ 1+0 &= 1+0 = 1 ~\checkmark \\ 1+1 &= 0+2 = 2 ~\checkmark \\ \end{aligned}

Computadores quânticos

Bits \rightarrow 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 0\vert 0\rangle e 1\vert 1\rangle. Mas, diferentemente do bit clássico, um bit quântico também pode estar em uma superposição do estado 0\vert 0\rangle e do estado 1\vert 1\rangle ao mesmo tempo. Em geral, um qubit pode estar em qualquer estado ψ\vert \psi\rangle da forma:

ψ=c00+c11\vert \psi\rangle = c_0 \vert 0\rangle + c_1 \vert 1\rangle

em que c0c_0 e c1c_1 são amplitudes complexas com c02+c12=1\vert c_0 \vert ^2+\vert c_1\vert ^2=1.

A fase quântica

Como c0c_0 e c1c_1 são complexos, cada um deles pode ser escrito como ci=cieiϕic_i = \vert c_i\vert e^{i\phi_i}, onde ϕi\phi_i é 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" eiϕ0e^{i\phi_0}, dando:

ψ=c00+c1eiϕ1\vert \psi\rangle = \vert c_0\vert \vert 0\rangle + \vert c_1\vert e^{i\phi}\vert 1\rangle

em que ϕ=ϕ1ϕ0\phi = \phi_1-\phi_0 é 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 NN bits podem estar em um dos 2N2^N 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 NN podem estar em uma superposição de todos esses estados ao mesmo tempo!

Isso pode ser expresso como

ψN=i=02N1cii\psi_N = \sum_{i=0}^{2^N-1} c_i \vert i\rangle

onde, como no caso clássico, o estado i\vert i\rangle corresponde ao estado em que cada qubit está na combinação certa de 0s e 1s para produzir o número binário ii. 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:

ψ3=c0000+c1001+c2010+c3011+c4100+c5101+c6110+c7111\psi_3 = c_0 \vert 000\rangle + c_1 \vert 001\rangle + c_2 \vert 010\rangle + c_3 \vert 011\rangle + c_4 \vert 100\rangle + c_5 \vert 101\rangle + c_6 \vert 110\rangle + c_7 \vert 111\rangle

Cada qubit no sistema é denotado com um índice 00 a N1N-1. A convenção é ler os estados dos qubits da direita para a esquerda, de modo que o estado do qubit 00 seja o estado mais à direita e o estado do qubit N1N-1 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 00 ao bit menos significativo, que é multiplicado por 202^0 e o qubit N1N-1 ao bit mais significativo, que é multiplicado por 2N12^{N-1}.

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 c0=c3=12c_0 = c_3 = \frac{1}{\sqrt{2}} e c1=c2=0c_1 = c_2 = 0 :

ψ=12(00+11)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 00\rangle + \vert 11\rangle)

Portanto, o estado do qubit 0 pode ser 0\vert 0\rangle ou 1\vert 1\rangle 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 é 0\vert 0\rangle, saberemos que o qubit 1 também estará em 0\vert 0\rangle. 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

ψ=12(01+10)\vert \psi\rangle = \frac{1}{\sqrt{2}}(\vert 01\rangle + \vert 10\rangle)

produz resultados opostos todas as vezes: se um qubit for medido 0\vert 0\rangle, é garantido que o outro será encontrado no estado 1\vert 1\rangle.

Verifique sua compreensão

O estado ψ=11\vert \psi\rangle = \vert 11\rangle 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 1\vert 1\rangle. O resultado da medição de um qubit não depende de fato do outro - ambos estão sempre 1\vert 1\rangle.

    Em geral, se você puder descrever o estado de cada qubit separadamente e depois multiplicá-los dessa forma:

    ψ=ψ1ψ0\vert \psi\rangle = \vert \psi_1\rangle \vert \psi_0\rangle

    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: 0=(10)\vert 0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)\vert 1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix} Dessa forma, um estado arbitrário ψ=a0+b1\vert \psi\rangle = a\vert 0\rangle+b\vert 1\rangle pode ser escrito como ψ=(ab)\vert \psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

Para um estado geral de nn -qubit, precisaremos de um vetor 2n2^n -dimensional, com estados de base ordenados, como seria de se esperar, em valor binário crescente:

0000=(1000),0001=1110=(0010),1111=(0001)\vert 0 \dots 000\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ \vdots \\ 0\end{pmatrix}, \vert 0 \dots 001 \rangle = \vert 1 \dots 110\rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 1 \dots 111 \rangle = \begin{pmatrix}0 \\ \vdots \\ 0 \\ 0\\ 1\end{pmatrix}

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.

  • 00=(1000),01=(0100),,10=(0010),11=(0001)\vert 00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix}, \vert 01 \rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, \dots, \vert 10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\ 0\end{pmatrix}, \vert 11 \rangle = \begin{pmatrix}0 \\ 0 \\ 0\\ 1\end{pmatrix}

Portas \rightarrow 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 0|0\rangle e 1|1\rangle 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

XX 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
0\vert 0\rangle1\vert 1\rangle
1\vert 1\rangle0\vert 0\rangle

E a representação da matriz:

X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

No Qiskit, a criação de um circuito com uma porta XX tem a seguinte aparência:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output:

Output of the previous code cell

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
0\vert 0\rangle12(0+1)\frac{1}{\sqrt{2}}\left(\vert 0\rangle+\vert 1\rangle\right)
1\vert 1\rangle12(01)\frac{1}{\sqrt{2}}\left(\vert 0\rangle-\vert 1\rangle\right)

Representação matricial: H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

Um circuito com uma porta Hadamard é feito da seguinte forma:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output:

Output of the previous code cell

ZZ portão : Adiciona uma mudança de fase de Δϕ=π\Delta \phi = \pi ao estado 1|1\rangle :

Entrada
Saída
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangle1-\vert 1\rangle

Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

No Qiskit, a criação de um circuito com uma porta ZZ tem a seguinte aparência:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output:

Output of the previous code cell

TT portão : Adiciona uma mudança de fase de Δϕ=π/4\Delta \phi = \pi/4 ao estado 1|1\rangle :

Entrada
Saída
0\vert 0\rangle0\vert 0\rangle
1\vert 1\rangleeiπ/41e^{i\pi/4}\vert 1\rangle

T=(100eiπ/4)T=\begin{pmatrix} 1 & 0 \\ 0 & e^{i\pi/4} \end{pmatrix}

No Qiskit, a criação de um circuito com uma porta TT tem a seguinte aparência:

qc = QuantumCircuit(1)
qc.t(0)
qc.draw("mpl")

Output:

Output of the previous code cell

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 1\vert 1\rangle, uma porta XX será aplicada a esse alvo; se o estado do qubit de controle for 0\vert 0\rangle, nenhuma alteração será feita. Na notação abaixo, suponha que o qubit AA (qubit mais à direita) seja o controle e o qubit BB (o qubit mais à esquerda) seja o alvo. Abaixo, a notação usada é CNOT(qcontrol,qtarget)BA.CNOT(q_{control},q_{target})\vert BA\rangle.

CNOT(A,B)BAinput=BAoutputCNOT(A,B)\vert BA\rangle_{input} = \vert BA\rangle_{output}

Entrada
Saída
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle11\vert 11\rangle
10\vert 10\rangle10\vert 10\rangle
11\vert 11\rangle01\vert 01\rangle

Portanto, a matriz que representa essa ação é:

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output:

Output of the previous code cell

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 q0q_0 como controle e q1q_1 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 q0,q1,...\vert q_0,q_1,...\rangle 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 01.\vert 01\rangle.

  • CNOT01=(1000000100100100)(0100)=(0001)=11CNOT\vert 01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = \vert 11\rangle

Porta SWAP: Essa porta troca os estados de dois qubits. Tabela verdade:

Entrada
Saída
00\vert 00\rangle00\vert 00\rangle
01\vert 01\rangle10\vert 10\rangle
10\vert 10\rangle01\vert 01\rangle
11\vert 11\rangle11\vert 11\rangle

Portanto, a matriz que representa essa ação é:

SWAP=(1000001001000001)SWAP=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix}

qc = QuantumCircuit(2)
qc.swap(0, 1)
qc.draw("mpl")

Output:

Output of the previous code cell

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:

Output of the previous code cell

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:

    (1000000100100100)(1000010000010010)(1000000100100100)=(1000001001000001)=SWAP \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0\end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1\end{pmatrix} = SWAP ~\checkmark

    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:

    Entrada
    CNOT(A,B)
    CNOT(B,A)
    CNOT(A,B)
    00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle00\vert 00\rangle \checkmark
    01\vert 01\rangle11\vert 11\rangle10\vert 10\rangle10\vert 10\rangle \checkmark
    10\vert 10\rangle10\vert 10\rangle11\vert 11\rangle01\vert 01\rangle \checkmark
    11\vert 11\rangle01\vert 01\rangle01\vert 01\rangle11\vert 11\rangle \checkmark

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 1\vert 1\rangle. Mantemos a convenção de ordenação que usamos com o CNOT:

CCNOT(ControlA,ControlB,TargetC)CBACCNOT(Control A, Control B, Target C)\vert CBA\rangle

Portanto, a tabela de verdade é:

Entrada
Saída
000\vert 000\rangle000\vert 000\rangle
001\vert 001\rangle001\vert 001\rangle
010\vert 010\rangle010\vert 010\rangle
011\vert 011\rangle111\vert 111\rangle
100\vert 100\rangle100\vert 100\rangle
101\vert 101\rangle101\vert 101\rangle
110\vert 110\rangle110\vert 110\rangle
111\vert 111\rangle011\vert 011\rangle

E a matriz que representa essa ação é:

CCNOT=(1000000001000000001000000000000100001000000001000000001000010000)CCNOT=\begin{pmatrix} 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\end{pmatrix}
qc = QuantumCircuit(3)
qc.ccx(0, 1, 2)
qc.draw("mpl")

Output:

Output of the previous code cell

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 NN -bit ψ=i=02N1cii\vert \psi\rangle = \sum_{i=0}^{2^N-1} c_i \vert i\rangle, uma medição colapsará o estado para uma das funções de base i\vert i\rangle com uma probabilidade igual a ci2\vert c_i\vert ^2.

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:

Output of the previous code cell

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:

  1. Mapeamento de nosso problema para circuitos e operadores quânticos
  2. Otimização do circuito para o hardware de destino
  3. Execução no hardware de destino
  4. 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 0\vert 0\rangle para armazenar as saídas de soma e transporte. Portanto, nosso estado quântico completo consistirá em qubits AA e BB, e os qubits de soma e transporte, que rotularemos como SS e CC :

ψ=CSBA\vert \psi\rangle = \vert C S B A\rangle

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 AA e BB e qubit de destino SS para ambos. Se AA e BB forem diferentes, uma das portas CNOT inverterá SS para o estado 1\vert 1\rangle. Se AA e BB forem ambos 0\vert 0\rangle, então nada acontecerá com SS e ele permanecerá no estado 0\vert 0\rangle. Se AA e BB forem ambos 1\vert 1\rangle, o estado de SS será invertido duas vezes, levando-o de volta ao estado 0\vert 0\rangle.

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 1\vert 1\rangle. Portanto, se o qubit de destino começar no estado 0\vert 0\rangle, 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:

Output of the previous code cell

Acima está o diagrama do circuito quântico de meio-somador. Conforme mencionado anteriormente, os fios representam os qubits 00 a 33 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 00 ou 11, 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:

CCNOT(q0,q1,q3)CNOT(q1,q2)CNOT(q0,q2)q3q2q1q0CCNOT(q_0,q_1,q_3)CNOT(q_1, q_2)CNOT(q_0,q_2)\vert q_3 q_2 q_1 q_0\rangle

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:

Output of the previous code cell

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}
Output of the previous code cell

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 AA, BB, SS e CC, verifique se o circuito de somador quântico funcionou.

  • Precisamos verificar se A+B=S+2×CA+B = S+2 \times C. 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.

    0+0=0+0×2=0 0 + 0 = 0 + 0 \times 2 = 0 ~\checkmark

Volte e altere os valores de AA e BB para A=1A=1 e B=1B=1 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:

    1+1=0+1×2=2 1 + 1 = 0 + 1 \times 2 = 2 ~\checkmark

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 AA e BB 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, q0q_0, na posição mais à direita e o qubit mais significativo, qNq_N, 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

  1. Um único bit em um computador clássico só pode conter o valor 0 ou 1.

  2. O entrelaçamento significa que o estado de um qubit é independente do estado de outro.

  3. As portas quânticas geralmente são operações irreversíveis.

  4. A convenção Qiskit coloca o qubit menos significativo, q0q_0, na posição mais à esquerda.

  5. A medição de um estado quântico sempre apresenta exatamente o mesmo resultado se for repetida várias vezes.

  6. A porta Hadamard cria uma superposição em um único qubit.

  7. Os circuitos quânticos podem incluir operações de medição que colapsam o estado de superposição em um dos estados classicamente permitidos.

  8. O número de estados clássicos possíveis para NN bits é 2N2N.

  9. 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

  1. Quais são as principais diferenças entre um bit e um qubit?

  2. O que acontece com um estado quântico quando ele é medido?

  3. Por que usamos a notação little-endian no Qiskit?

  4. Quais são as quatro etapas do fluxo de trabalho dos padrões do Qiskit?

Perguntas desafiadoras:

  1. No módulo, usamos apenas o somador para adicionar estados classicamente permitidos para AA e BB. Mas também podemos preparar AA e BB 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.

  2. 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!

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.