Monete quantistiche — un modulo sulla sovrapposizione e l'interferenza
Per questo modulo Qiskit in Classrooms, gli studenti devono disporre di un ambiente Python funzionante con i seguenti pacchetti installati:
qiskitv2.1.0 o superioreqiskit-ibm-runtimev0.40.1 o superioreqiskit-aerv0.17.0 o superioreqiskit.visualizationnumpypylatexenc
Per configurare e installare i pacchetti elencati sopra, consulta la guida Installa Qiskit. Per eseguire job su computer quantistici reali, gli studenti dovranno creare un account IBM Quantum® seguendo i passaggi descritti nella guida Configura il tuo account IBM Cloud.
Questo modulo è stato testato e ha utilizzato 47 secondi di tempo QPU. Si tratta solo di una stima. L'utilizzo effettivo può variare.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime
# 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'
Guarda la panoramica del modulo con la Dr.ssa Katie McCormick qui sotto, oppure clicca qui per guardarlo su YouTube.
Introduzione
In questo modulo esploreremo uno dei principi fondamentali al cuore della teoria quantistica: la sovrapposizione. Nella nostra esperienza quotidiana, gli oggetti hanno sempre caratteristiche definite. La loro posizione, dimensione, forma, colore — tutto ciò che li riguarda — è determinato e certo, anche se noi osservatori non li abbiamo ancora misurati. Nel mondo quantistico, questo non è necessariamente il caso. Un oggetto quantistico può trovarsi in quello che viene chiamato uno "stato di sovrapposizione" di molteplici stati classicamente permessi. Quando la sovrapposizione viene misurata, essa "collasserà" casualmente in uno di quegli stati.
In un certo senso, misurare uno stato di sovrapposizione è come lanciare una moneta: non c'è modo di sapere in anticipo come cadrà. Questo indeterminismo fondamentale è un aspetto scomodo della meccanica quantistica con cui anche Einstein ebbe difficoltà. Disse famosamente "Dio non gioca a dadi" riguardo a questa casualità. Ma, come vedremo, Dio in realtà gioca a dadi — e lancia monete.
Penseremo al lancio di una moneta classica come analogia alla misurazione di uno stato di sovrapposizione. E — giocando con una "moneta quantistica" usando Qiskit e un qubit su un processore quantistico IBM® — scopriremo presto i limiti di questa analogia.
Moneta classica
Cominciamo con una moneta classica. Lancia una moneta e cadrà con testa su o testa giù, con una probabilità del 50% per ciascun caso. Anche se in linea di principio si potrebbe calcolare su quale lato cadrà la moneta se si conoscessero le condizioni iniziali precise e la forza/coppia del lancio, in pratica non c'è modo di sapere a priori su quale lato cadrà la moneta. Ecco perché usiamo il lancio della moneta come esempio canonico di stato probabilistico classico, dove l'esito è essenzialmente casuale. Possiamo scrivere lo stato della moneta prima che atterri per riflettere questa probabilità 50/50:
Qui, i due termini rappresentano i due possibili esiti del lancio e i loro coefficienti rappresentano le probabilità di ciascun esito. Nota che tipicamente il "" (noto come "ket") viene usato per rappresentare uno stato quantistico, ma qui stiamo parlando di uno stato probabilistico classico. Consulta la Lezione 1: Sistemi singoli nel corso Basi dell'informazione quantistica per saperne di più su come rappresentiamo l'informazione classica e quantistica.
Se lanciassimo una moneta 1000 volte e registrassimo il numero di volte che cade testa su e testa giù, otterremmo qualcosa del genere:
# import necessary packages:
import numpy as np
import matplotlib.pyplot as plt
import random
nflips = 1000
fliplist = [random.randint(0, 1) for f in range(nflips)]
# bar plots using get_gaussian_probs function
plt.hist(fliplist)
plt.show()
Moneta quantistica
Possiamo creare uno stato probabilistico simile usando un qubit sul nostro computer quantistico. Come il lancio della moneta, anche un qubit può essere misurato in due stati possibili: e . Creiamo lo stato probabilistico di "sovrapposizione" partendo dallo stato e applicando poi quello che viene chiamato un gate di Hadamard al qubit. Questo lo mette in un'uguale sovrapposizione di e . Nota che, sebbene questo stato di sovrapposizione possa sembrare e comportarsi come la moneta a prima vista, vedremo presto che c'è molto di più. Lo scopo di questo modulo è mostrarti che una sovrapposizione non è uguale a un lancio di moneta classico.
Quindi, poiché il qubit si trova in un'uguale sovrapposizione di 0 e 1, quando misuriamo il qubit ci sarà una probabilità del 50% di misurare e una probabilità del 50% di misurare . Scriviamo questo stato in modo leggermente diverso rispetto al caso probabilistico classico, per ragioni che diventeranno chiare in seguito:
Qui, le probabilità di misurare ciascuno dei due stati non sono più uguali ai coefficienti, come nel caso dello stato probabilistico classico sopra. Invece, è il quadrato dei coefficienti che ci dà le probabilità, e ciascuno di questi coefficienti può ora essere complesso, ovvero può avere sia una parte reale che una immaginaria.
Nonostante queste differenze, il risultato della misurazione di questo stato è essenzialmente lo stesso del lancio di una moneta.
from qiskit import QuantumCircuit
qcoin = QuantumCircuit(1)
qcoin.h(0)
qcoin.measure_all()
qcoin.draw("mpl")
In effetti, applicare il gate di Hadamard è l'analogo del lancio di una moneta. E proprio come abbiamo lanciato la moneta 1000 volte per osservare le statistiche della moneta che cade testa su o giù, possiamo fare qualcosa di simile su Qiskit con la nostra "moneta quantistica". Possiamo usare una primitiva Qiskit chiamata Sampler, che ripeterà un circuito più volte per campionare le statistiche dello stato risultante.
Prima di tutto, carichiamo il servizio Qiskit Runtime e le primitive, poi selezioniamo un backend su cui eseguire il circuito.
Di seguito è riportato del codice per salvare le tue credenziali al primo utilizzo. Assicurati di eliminare queste informazioni dal notebook dopo averle salvate nel tuo ambiente, in modo che le tue credenziali non vengano condivise accidentalmente quando condividi il notebook. Consulta Configura il tuo account IBM Cloud e Inizializza il servizio in un ambiente non affidabile per ulteriori indicazioni.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
# 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()
# Load the Runtime primitive and session
from qiskit_ibm_runtime import (
SamplerV2 as Sampler,
EstimatorV2 as Estimator,
)
# Use the least busy backend
backend = service.least_busy()
print(backend.name)
ibm_kingston
Se non hai più tempo disponibile sul tuo account, puoi anche scegliere di eseguire il codice su un simulatore. Decommenta il codice ed esegui la cella qui sotto per farlo:
## Use a local simulator
# from qiskit_aer import AerSimulator
## Generate a simulator that mimics the real quantum system
# backend_sim = AerSimulator.from_backend(backend)
## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)
# from qiskit.primitives import BackendSamplerV2
# sampler_sim = BackendSamplerV2(backend = backend_sim)
# from qiskit.primitives import BackendEstimatorV2
# estimator_sim = BackendEstimatorV2(backend = backend_sim)
## 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(qcoin)
## Execute
# On real hardware:
sampler = Sampler(mode=backend)
pubs = [qc_isa]
job = sampler.run(pubs, shots=1000)
res = job.result()
counts = res[0].data.meas.get_counts()
# or with Aer simulator with noise model from real backend
# job = sampler_sim.run([qc_isa])
# counts=job.result()[0].data.meas.get_counts()
## Analysis
from qiskit.visualization import plot_histogram
plot_histogram(counts)
Con 1000 campioni del circuito sopra, otteniamo qualcosa che sembra sostanzialmente identico all'istogramma della moneta classica, a meno di alcune fluttuazioni statistiche.
Oltre a campionare le statistiche della moneta quantistica, possiamo anche usare un'altra primitiva Qiskit chiamata Estimator per misurare il cosiddetto valore atteso di un'osservabile dello stato. Per illustrare cosa sia questo valore atteso, usiamo come esempio la moneta classica. Supponiamo di usare la moneta per giocare d'azzardo: ogni volta che lanci la moneta e cade "testa su," vinci un dollaro. Ma ogni volta che cade "testa giù," perdi un dollaro. Se vuoi sapere quanti soldi ti aspetti di ottenere ad ogni lancio (il valore atteso dell'osservabile "denaro"), calcoleresti:
Poiché hai le stesse probabilità di vincere un dollaro e di perderne uno, il valore atteso è $0.
Allo stesso modo, con uno stato quantistico, possiamo calcolare il valore atteso dell'osservabile "Z", dove Z è la matrice di Pauli con valori +1 e -1 associati agli stati e , rispettivamente.
from qiskit.quantum_info import Pauli
qcoin = QuantumCircuit(1)
qcoin.h(0)
# for Estimator, we do not apply the measurement to the circuit
<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>
## Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
obs = Pauli("Z")
qc_isa = pm.run(qcoin)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
## Execute
# On real hardware:
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# On a simulator:
# job = estimator_sim.run([[qc_isa, obs_isa]])
# res=job.result()
print(res[0].data.evs)
-0.014799284701239441
Otteniamo un valore atteso di 0, come previsto (ah ah). Questo è un altro modo per confermare che effettivamente c'è una probabilità uguale di misurare 0 e 1, e che il comportamento sembra quello di un lancio di moneta.
A questo punto, la "moneta quantistica" sembra esattamente uguale alla moneta classica. Ma nella prossima sezione faremo alcuni esperimenti che riveleranno le differenze fondamentali tra le due.
Il quantum svelato: un esperimento in tre dimensioni
Facciamo un esperimento mentale: immagina di lanciare in aria una moneta e, invece di lasciarla cadere a terra, di avere la coordinazione per applaudire mentre passa tra le tue mani, intrappolandola tra i palmi. Invece di essere testa su o testa giù, la moneta sarà testa a sinistra o testa a destra.
Verifica la tua comprensione
Leggi la domanda qui sotto, pensa alla risposta, poi clicca sul triangolo per vedere la soluzione.
Qual è la probabilità di ciascuno di questi risultati, testa a sinistra o testa a destra?
Risposta:
La probabilità sarà ancora 50-50. Non dovrebbe importare lungo quale dimensione scegliamo di misurare il risultato del lancio della moneta.
Sperabilmente hai risposto che la probabilità di trovare testa a sinistra o a destra è ancora 50-50. La dimensione lungo cui si misura il lancio della moneta non dovrebbe influenzare la probabilità dei risultati.
Ma come sarebbero le cose per la nostra moneta quantistica? Vediamolo.
Possiamo creare la nostra sovrapposizione quantistica nello stesso modo in cui l'abbiamo fatto prima, con un gate Hadamard. Per misurare "testa a sinistra o destra" sulla nostra moneta quantistica, possiamo fare come con la moneta classica: misurare lungo un asse diverso. Le nostre misurazioni standard sul computer quantistico sono lungo l'asse verticale, proprio come la solita misurazione "testa su o giù" della moneta classica. Ma possiamo anche chiedere alla nostra moneta quantistica se è testa a sinistra o destra, o equivalentemente, se si trova negli stati o , che puntano lungo l'asse . Sampler campiona solo nella base di misurazione Z, ma possiamo usare Estimator per ottenere il valore atteso di X. I valori di X sono +1 e -1 per gli stati o , rispettivamente.
Verifica la tua comprensione
Leggi la domanda qui sotto, pensa alla risposta, poi clicca sul triangolo per vedere la soluzione.
Se la moneta quantistica si comportasse come quella classica in questo caso, avremmo una probabilità 50-50 di misurare lo stato in e . Quale valore atteso di X ci aspetteremmo da Estimator, in tal caso?
Estimator, in tal caso?Risposta:
Quando applichiamo X allo stato , otteniamo il valore +1 e allo stato otteniamo -1, quindi se avessimo una distribuzione 50-50, otterremmo un valore atteso di 0.
# Step 1: map problem
qcoin_lr = QuantumCircuit(1)
qcoin_lr.h(0)
obs = Pauli("X")
# Step 2: Transpile the circuit
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qcoin_lr)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
# Step 3: Run the circuit on a real quantum computer
estimator = Estimator(mode=backend)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# Run the job on the Aer simulator with noise model from real backend
# job = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()
# Step 4: Return the result in classical form, and analyze.
print(res[0].data.evs)
0.9985207100591716
Il valore atteso di X per questo stato è 1. Quindi, non c'è una probabilità 50-50 di misurare e .
Verifica la tua comprensione
Leggi la domanda qui sotto, pensa alla risposta, poi clicca sul triangolo per vedere la soluzione.
Cosa ci dice questo valore atteso sullo stato ? Quali sono le probabilità di misurare e in questa base X?
Risposta:
Poiché il valore atteso è uguale al valore di X per lo stato , significa che abbiamo il 100% di probabilità di misurare lo stato quando misuriamo lungo X.
Cosa sta succedendo? Sembra che la nostra moneta quantistica possa avere risultati casuali e probabilistici lungo una dimensione, ma risultati perfettamente prevedibili lungo un'altra. Sarebbe come lanciare una moneta e avere la garanzia che ogni volta che viene intrappolata tra le due mani, la testa finisca rivolta a destra.
La fase quantistica
La differenza fondamentale della moneta quantistica è che ha un'altra qualità che la moneta classica non possiede. Ricorda che in uno stato probabilistico classico,
ogni coefficiente è semplicemente un numero reale positivo che rappresenta la probabilità di misurare un particolare stato. In uno stato quantistico,
i coefficienti sono complessi, quindi contengono una parte reale e una parte immaginaria. Ogni coefficiente può essere espresso come un vettore bidimensionale nel piano complesso, con modulo e angolo che forma con l'asse reale:

Chiamiamo la fase. La fase ci dice come due termini di uno stato quantistico interferiranno, ovvero come si combineranno o si annulleranno come onde. Se due onde sono in fase tra loro, così che le creste e i ventri coincidono, si combineranno formando un'onda doppiamente alta. Questo si chiama interferenza costruttiva. Se sono sfasate, nel senso che la cresta di una coincide con il ventre dell'altra, e viceversa, interferiscono in modo distruttivo e si annullano completamente.
Come le onde, gli stati quantistici possono anch'essi combinarsi in modo costruttivo o distruttivo. Può essere più difficile da vedere perché spesso non si tratta di un'onda reale nello spazio fisico. Nel caso dei nostri qubit, l'interferenza avviene nello spazio astratto e informazionale dei qubit. Nota inoltre che poiché solo la fase relativa tra le due onde conta per come interferiranno — cioè, la differenza nelle fasi dei due coefficienti — di solito applichiamo una fase globale di all'intero stato in modo che sia puramente reale e la fase relativa sia interamente catturata in .
Per vedere come la fase può causare interferenza nella nostra moneta quantistica, proviamo ad applicare l'Hadamard due volte invece di una sola. Classicamente, questo non avrebbe senso — se applicare l'Hadamard equivale a lanciare una moneta, non puoi lanciare una moneta che sta già girando. Ma vediamo cosa succede alla moneta quantistica:
qcoin_0 = QuantumCircuit(1)
qcoin_0.h(0)
qcoin_0.h(0)
qcoin_0.measure_all()
qcoin_0.draw("mpl")
Ora, prima di usare Sampler per misurare lo stato risultante, pensiamo a come questo qubit verrà trasformato da ciascun gate. Parte, come al solito, da . Poi, il primo Hadamard trasforma lo stato in sovrapposizione, come abbiamo già visto:
In questo caso, entrambi i coefficienti sono completamente reali e positivi, il che significa che la fase è .
Il secondo Hadamard viene poi applicato separatamente a ciascuna parte dello stato di sovrapposizione. Sappiamo già come l'Hadamard trasforma lo stato . Ma cosa succede con ?
Anche questo è una sovrapposizione uguale di 0 e 1, analogo al lancio di una moneta, ma il coefficiente di questo stato davanti a