Simulador de computador quântico
Escreve um pequeno circuito quântico em JavaScript, simula-o diretamente no navegador e vê o diagrama do circuito, as probabilidades e o vetor de estado. Ou descreve um cálculo a alto nível (por exemplo, uma adição) e vê como se transforma automaticamente num circuito quântico reversível real.
Modelo de ruído
Os computadores quânticos reais não calculam perfeitamente: os qubits são extremamente sensíveis e perdem parte da informação por cada interação indesejada com o ambiente — calor, campos eletromagnéticos ou qubits vizinhos. As operações de porta também nunca são perfeitamente precisas e até a leitura final pode falhar. Este simulador calcula idealmente por predefinição; aqui podes ativar modelos de erro típicos e observar diretamente o efeito nos resultados.
Descreve um cálculo com quantum.add, quantum.subtract, quantum.multiply, quantum.divide ou quantum.random. Ctrl+Enter inicia a simulação. Consulta a documentação completa através do botão “Documentação”.
Este código foi gerado automaticamente a partir do código do programa acima e simulado diretamente. Podes editá-lo manualmente e executá-lo de novo.
O circuito gerado foi editado manualmente. Por isso, o agrupamento de registos no diagrama está oculto; executar novamente o código do programa acima substitui estas alterações.
Máximo de 4000 caracteres. Métodos QuantumCircuit disponíveis: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (aliás: toffoli), swap, measureAll, run. Ctrl+Enter inicia a simulação.
Diagrama do circuito
A vista por passos mostra as probabilidades e o vetor de estado exatamente após a porta selecionada. Os resultados das medições abaixo aplicam-se sempre ao circuito completo.
OpenQASM 2.0
OpenQASM 2.0 é o formato de intercâmbio amplamente usado para circuitos quânticos e é lido, entre outros, pelo Qiskit. Nota sobre a ordem dos bits: este simulador lê q0 como o bit mais significativo (esquerdo), enquanto o Qiskit lê q[0] como o menos significativo; por isso, as cadeias medidas aparecem lá espelhadas.
Probabilidades
A probabilidade de medir cada cadeia de bits possível, calculada exatamente a partir do vetor de estado. Sentido de leitura: q0 é o bit esquerdo (mais significativo).
Esferas de Bloch
O estado de cada qubit individual como uma seta na esfera de Bloch: polo norte = |0⟩, polo sul = |1⟩, equador = sobreposição com pesos iguais. Se a seta for claramente menor que o raio da esfera, o qubit não tem um estado puro próprio: está entrelaçado com outros qubits. Uma seta curta também pode resultar de ruído; com um modelo de ruído ativo, o qubit perde coerência e a seta encolhe. As esferas ruidosas são aqui uma aproximação; o vetor de Bloch é calculado como média das trajetórias de ruído. Na vista por passos acima, as setas movem-se porta a porta, apenas sem ruído.
Resultados das medições
Quantas vezes cada cadeia de bits ocorreu efetivamente nas medições simuladas. Havendo vários resultados possíveis, os números dispersam-se aleatoriamente em torno das probabilidades exatas.
Vetor de estado
As amplitudes complexas por trás das probabilidades: o quadrado do módulo de uma amplitude (real² + imaginário²) dá a probabilidade do respetivo estado.
| Estado | Parte real | Parte imaginária |
|---|
Noções básicas: como funciona?
Do programa ao qubit físico
Um computador quântico real é mais do que um chip. A eletrónica de controlo clássica traduz o circuito em impulsos precisos. No exemplo, lasers de arrefecimento, repump, qubit e leitura moldam estes sinais numa mesa ótica e direcionam-nos para uma câmara de vácuo blindada. Aí alteram e medem o estado do qubit; o resultado da medição regressa depois ao computador clássico.
Qubit e estados de base
Um bit clássico é 0 ou 1. Um qubit pode, além disso, existir numa sobreposição dos dois estados de base |0⟩ e |1⟩. Com vários qubits, todos os estados de base são escritos como uma cadeia de bits, por exemplo |10⟩ para 2 qubits — onde q0 neste simulador é sempre o bit mais significativo (esquerdo).
Sobreposição
Um qubit em sobreposição contém simultaneamente componentes de vários estados de base. Estas componentes são descritas por amplitudes complexas; o quadrado do módulo de uma amplitude dá a probabilidade de obter o estado correspondente numa medição.
A esfera de Bloch
O estado de um único qubit pode ser visualizado como uma seta numa esfera: o polo norte representa |0⟩, o polo sul |1⟩, e todos os pontos do equador são sobreposições com pesos iguais; a fase determina a direção no equador para onde aponta a seta. As portas de rotação rx, rye rz rodam a seta em torno do respetivo eixo; portas de fase como S e T rodam-na em torno do eixo Z. Com qubits entrelaçados, a seta encolhe para o centro da esfera: o qubit individual deixa de ter um estado puro próprio, pelo que o entrelaçamento se torna literalmente visível.
Medição e shots
measureAll() mede todos os qubits de uma vez e termina o circuito. Como uma única medição só produz um resultado aleatório, o circuito é conceptualmente medido “shots” vezes com run({ shots }), para que a distribuição de probabilidades apareça como histograma. As probabilidades exatas são ainda calculadas diretamente do vetor de estado, independentemente da aleatoriedade das medições.
Porta Hadamard
A porta Hadamard h(q) leva um qubit de um estado definido (|0⟩ ou |1⟩) para uma sobreposição com pesos iguais de |0⟩ e |1⟩ — portanto, cerca de 50% / 50% na medição.
Portas de fase: S e T
As portas s(q) e t(q) não alteram as probabilidades de medição de um único qubit; apenas rodam a fase da amplitude |1⟩ — S em 90°, T em 45°. Só mostram o efeito combinadas com sobreposição: entre duas Hadamard, a fase decide como as amplitudes se combinam ou se anulam (interferência). As variantes adaga sdg(q) e tdg(q) rodam exatamente no sentido oposto e desfazem S e T. A regra é: duas T fazem uma S; duas S fazem uma Z.
CNOT e entrelaçamento condicional
A porta CNOT cnot(control, target) inverte o qubit alvo exatamente quando o qubit de controlo está no estado |1⟩. Se o qubit de controlo estiver antes em sobreposição, isso pode criar entrelaçamento; os dois qubits deixam então de poder ser descritos independentemente, como no exemplo do estado de Bell. Se o controlo estiver num estado de base definido, CNOT apenas faz uma inversão condicional de bit, sem entrelaçamento. Portanto, nem toda CNOT cria automaticamente entrelaçamento.
CZ: a parente simétrica da CNOT
A porta CZ cz(a, b) inverte o sinal da amplitude exatamente quando ambos os qubits são |1⟩. Ao contrário de CNOT, não há controlo nem alvo; a porta atua de forma idêntica nos dois qubits e por isso é desenhada como dois pontos ligados no diagrama. CZ e CNOT podem converter-se mutuamente: uma CNOT é uma CZ cujo qubit alvo passa por uma Hadamard antes e depois. CZ é um bloco central de muitos algoritmos, como a pesquisa de Grover.
Estado GHZ: entrelaçamento em trio
O estado GHZ (assim chamado por Greenberger, Horne e Zeilinger) estende o princípio do estado de Bell a três qubits: uma porta Hadamard e duas CNOT entrelaçam os três, pelo que a medição só produz |000⟩ ou |111⟩ — nunca cadeias de bits mistas. Nenhum qubit tem já um estado próprio; a informação reside exclusivamente na correlação partilhada.
Algoritmo de Deutsch: a menor vantagem quântica
Com uma única avaliação de um oráculo desconhecido, o algoritmo de Deutsch responde a uma questão para a qual um computador clássico precisa de duas avaliações: a função é constante ou equilibrada? O truque é enviar a entrada pelo oráculo em sobreposição; graças à interferência, a resposta fica depois inequivocamente codificada no qubit de entrada. O princípio subjacente (phase kickback) está no centro de quase todos os algoritmos quânticos.
Pesquisa de Grover: amplificar amplitudes
A pesquisa de Grover encontra uma entrada marcada num conjunto não ordenado com significativamente menos consultas do que seriam necessárias classicamente. Um oráculo marca o estado procurado com uma inversão de fase (aqui por uma porta CZ); depois, o operador de difusão amplifica a amplitude marcada à custa de todas as outras. Com 2 qubits, uma iteração basta para medir o resultado com 100% de probabilidade.
Adição reversível: de quantum.add() a um circuito
O editor de código do programa acima traduz quantum.add({ a, b }) num circuito de portas X, CNOT e CCNOT (Toffoli), que reproduz a adição clássica de modo puramente reversível: cada porta pode ser desfeita exatamente porque nenhuma informação é descartada. Uma porta CCNOT (ccnot(c1, c2, target)) inverte o qubit alvo apenas quando ambos os qubits de controlo são |1⟩ — o que basta como bloco para reconstruir reversivelmente qualquer circuito clássico, incluindo um somador completo com transporte. As entradas A e B são primeiro inicializadas como estados de base definidos (sem sobreposição) usando portas X. Como todo o circuito passa apenas por estados definidos em vez de sobreposições, a medição no fim dá exatamente um resultado com 100% de probabilidade: a soma clássica correta. É por isso que quantum.add() produz um resultado determinístico apesar da simulação quântica, em vez de vários estados possíveis com probabilidades abaixo de 100%.
Subtração: adição ao contrário
Como cada porta de um circuito quântico é exatamente invertível, o circuito completo do somador pode ser executado para trás, e a adição transforma-se numa subtração: quantum.subtract({ a, b }) usa exatamente as portas do somador na ordem inversa e calcula assim a − b. Não é um truque, mas o princípio básico da computação reversível: nenhum passo de cálculo destrói informação e cada passo pode ser desfeito. Nesta versão, é exigido a ≥ b para não haver resultado negativo.
Multiplicação: quantum.multiply()
A multiplicação surge aqui dos mesmos blocos reversíveis que a adição: seguindo o método escolar, o fator a é adicionado várias vezes em posições deslocadas, correspondendo aos bits ativos do fator b. Cada adição parcial é o mesmo somador reversível com transporte propagado; o transporte flui cada vez para o bit de produto seguinte. Como o registo de resultado cresce com o produto, os fatores limitam-se aqui a 3 bits (0–7); só assim fator, produto e qubit de transporte cabem nos 10 qubits deste simulador.
Divisão: quantum.divide()
A divisão também usa apenas blocos reversíveis: quantum.divide({ a, b }) executa divisão longa baseada em subtrações reversíveis deslocadas do divisor ao registo de resto; o resultado é o quociente e o resto (a = quotient · b + remainder). Como dividendo, divisor, quociente e um qubit de empréstimo têm todos de caber nos 10 qubits, a divisão é a operação mais limitada: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 tem de ser válido, e o divisor b tem de ser ≥ 1 (sem divisão por zero). Se uma entrada não couber no orçamento, o editor informa em vez de calcular.
Aleatoriedade verdadeira: quantum.random()
Os computadores clássicos não podem gerar aleatoriedade verdadeira: os seus “números aleatórios” vêm de algoritmos determinísticos (pseudoaleatoriedade). Um computador quântico pode: quantum.random({ bits }) coloca cada bit numa sobreposição 50/50 através de uma porta Hadamard, e só a medição decide — de forma fundamentalmente imprevisível — que valor sai. Em hardware quântico real, isto é aleatoriedade física verdadeira; este simulador imita-a com a pseudoaleatoriedade do teu navegador.
Simulador vs. hardware quântico real
Este simulador calcula o estado exatamente com aritmética clássica de vírgula flutuante no navegador; isto só funciona porque aqui são considerados apenas circuitos muito pequenos, até 10 qubits. Computadores quânticos reais usam qubits físicos, são propensos a erros (decoerência, ruído) e a sua vantagem só surge em circuitos bem maiores, que já não podem ser simulados classicamente na prática. Esta ferramenta é educativa, não um processador quântico real.