Teletrasporto quantistico
Per questo modulo Qiskit in Classrooms, gli studenti devono avere un ambiente Python funzionante con i seguenti pacchetti installati:
qiskitv2.1.0 o più recenteqiskit-ibm-runtimev0.40.1 o più recenteqiskit-aerv0.17.0 o più recenteqiskit.visualizationnumpypylatexenc
Per configurare e installare i pacchetti di cui sopra, consultare la guida Installare Qiskit. Per poter eseguire lavori su veri computer quantistici, gli studenti dovranno creare un account con IBM Quantum® seguendo i passaggi della guida Set up your IBM Cloud account.
Questo modulo è stato testato e ha utilizzato 14 secondi di tempo della QPU. Si tratta solo di una stima. L'utilizzo effettivo può variare.
# 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'Guardate la presentazione del modulo da parte della dottoressa Katie McCormick qui sotto, oppure fate clic qui per guardarla su YouTube.
Introduzione e contesto
Il teletrasporto quantistico è una tecnica della fisica quantistica che permette di trasferire informazioni quantistiche da un luogo all'altro senza spostare fisicamente le particelle. A differenza del concetto fantascientifico di teletrasporto, questo processo non comporta il trasporto di materia. Si basa invece sul principio dell'entanglement quantistico, secondo il quale due particelle diventano collegate indipendentemente dalla distanza. Attraverso una serie di misurazioni precise e comunicazioni classiche, lo stato quantistico di una particella può essere ricreato in un'altra particella in una posizione distante, "teletrasportando" di fatto l'informazione quantistica. In questo modulo vedremo come funziona matematicamente e poi implementeremo il teletrasporto quantistico su un vero computer quantistico. L'introduzione sarà breve; per maggiori informazioni sull'informazione quantistica e per maggiori spiegazioni sul teletrasporto, consigliamo il corso di John Watrous sui Fondamenti dell'informazione quantistica, in particolare la sezione sul Teletrasporto
I bit classici possono trovarsi negli stati 0 o 1. I bit quantistici (qubit) possono trovarsi in stati quantistici denominati e e anche in combinazioni lineari di questi stati, chiamate "superposizioni", come , con e Sebbene gli stati possano esistere in questa superposizione, una misurazione dello stato lo farà "collassare" negli stati o . I parametri e sono correlati alla probabilità di ciascun risultato di misura secondo la formula
Da qui il vincolo che
Un'altra caratteristica fondamentale è che i bit quantistici possono essere "aggrovigliati", il che significa che la misurazione di un qubit può influenzare il risultato della misurazione di un altro qubit aggrovigliato. Capire come l'entanglement sia diverso dalle semplici correlazioni classiche è un po' complicato. Spieghiamo innanzitutto la nostra notazione. Chiamiamo due qubit appartenenti all'amico 0 (Alice) e all'amico 1 (Bob), e ciascuno nello stato
oppure
a volte abbreviato semplicemente in
Si noti che il qubit con il numero più basso (o la lettera) è il più lontano a destra. Si tratta di una convenzione chiamata notazione "little-endian", utilizzata in tutto Qiskit. Se lo stato a due qubit degli amici è ed essi misurano lo stato dei rispettivi qubit, troveranno ciascuno uno 0. Allo stesso modo, se i qubit si trovassero nello stato , ciascuna delle loro misurazioni darebbe un 1. Questo non è diverso dal caso classico. Tuttavia, nell'informatica quantistica, possiamo combinare questo aspetto con la superposizione per ottenere stati come
In uno stato come questo, se Alice e Bob hanno qubit nello stato 0 o 1 non è ancora noto, nemmeno determinato dalla natura, eppure sappiamo che misureranno lo stesso stato per il loro qubit. Per esempio, se Bob misura che il suo qubit si trova nello stato , questo può avvenire solo se la misura ha fatto collassare lo stato a due qubit in uno dei due stati possibili, in particolare in . Ciò lascia il qubit di Alice nello stato .
L'entangled dei qubit in questo modo non richiede che i qubit rimangano fisicamente vicini l'uno all'altro. In altre parole, potremmo agganciare i qubit, poi separarli da una grande distanza e usare il loro entanglement per inviare informazioni. Uno stato entangled come quello sopra descritto è un'unità di base dell'entanglement ed è talvolta indicato come un "e-bit", un singolo bit di entanglement. Questi e-bit possono essere considerati come risorse nella comunicazione quantistica, poiché ogni e-bit condiviso tra partner distanti può essere utilizzato, come illustriamo qui, per spostare informazioni da una posizione all'altra.
Il primo pensiero di molte persone che ne vengono a conoscenza per la prima volta riguarda la violazione della relatività: possiamo usarla per inviare informazioni più veloci della luce? Continuate pure a mettere in discussione e a sondare le regole scientifiche, ma purtroppo questo non ci permetterà di inviare informazioni più veloci della luce, per ragioni che diventeranno chiare nel corso di questo modulo. Spoiler: incredibilmente NON è dovuto alla velocità di propagazione del collasso, che sembra avvenire più velocemente della luce [1].
Iniziamo con due collaboratori, Alice e Bob, che inizialmente si trovano nello stesso luogo e possono lavorare insieme sugli stessi qubit. Questi collaboratori agganciano i loro qubit. Poi si allontaneranno in due luoghi geografici diversi, portando con sé i rispettivi qubit. Alice otterrà quindi informazioni quantistiche su un nuovo qubit Q. Non facciamo ipotesi sulle informazioni relative a Q. Lo stato di Q potrebbe essere un segreto sconosciuto ad Alice; potrebbe essere sconosciuto a tutte le persone. Ma ad Alice viene affidato il compito di trasferire le informazioni su Q a Bob. Lo farà utilizzando il teletrasporto quantistico.
Per farlo, dovremo conoscere alcune operazioni quantistiche o "porte".
Operatori quantistici (porte)
Se avete già familiarità con le porte quantiche, potete saltare questa sezione. Se volete capire meglio queste porte, date un'occhiata a Fondamenti dell'informazione quantistica, in particolare alle prime due lezioni, su IBM Quantum Learning.
Per questo protocollo di teletrasporto utilizzeremo principalmente due tipi di porte quantistiche: la porta di Hadamard e la porta CNOT. Alcuni altri avranno un ruolo minore: il gate , il gate e il gate SWAP.
Questo modulo può essere completato con una preparazione molto limitata in algebra lineare, ma a volte può essere utile visualizzare le porte della meccanica quantistica utilizzando matrici e vettori. Presentiamo quindi anche le forme matriciali/vettoriali delle porte/stati quantistici.
Gli stati che abbiamo già presentato sono stati scelti (in parte per convenzione e in parte per vincoli) per avere forme vettoriali:
In questo modo, uno stato arbitrario può essere scritto come
È possibile scegliere come estendere la notazione agli stati a qubit multipli, ma la scelta che segue è abbastanza standard:
Tenendo presente questa scelta di notazione vettoriale, possiamo introdurre le porte quantistiche necessarie, i loro effetti sugli stati quantistici e le loro forme matriciali.
H Porta di Hadamard: Crea uno stato di sovrapposizione. Cancello a singolo qubit.
Un circuito con una porta di Hadamard è realizzato come segue:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")Output:
Gate CNOT Controlled-NOT: questo gate utilizza due qubit: uno di controllo e uno di destinazione. Controlla lo stato di un qubit di controllo che non viene modificato. Ma se il qubit di controllo si trova nello stato , il gate cambia lo stato del qubit di destinazione; se lo stato del qubit di controllo è non viene effettuato alcun cambiamento. Nella notazione che segue, si assume che il qubit (il qubit più a destra) sia il controllo e il qubit (il qubit più a sinistra) sia il bersaglio. Di seguito, la notazione utilizzata è
A volte si può vedere scritto CNOT con l'ordine del controllo e del target semplicemente sottinteso. Ma non c'è questa ambiguità nel codice o negli schemi dei circuiti.
Un gate CNOT ha un aspetto un po' diverso in un circuito, poiché richiede due qubit. Ecco come viene implementato:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")Output:
Verifica la tua comprensione
La maggior parte dei gate ha la stessa forma a matrice in Qiskit come in tutti gli altri contesti. Ma la porta CNOT agisce su due qubit, e così improvvisamente le convenzioni di ordinamento dei qubit diventano un problema. I testi che trattano i qubit presentano una forma matriciale diversa per i loro porte CNOT. Verificare, mediante una moltiplicazione esplicita delle matrici, che la matrice CNOT sopra riportata abbia l'azione corretta sullo stato
Gate : equivalente a un'operazione NOT. Cancello a singolo qubit.
In Qiskit, la creazione di un circuito con una porta si presenta come segue:
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")Output:
Cancello : Aggiunge una "fase" a uno stato (un prefattore, che nel caso degli autostati Z e è rispettivamente un 1 o -1 ). Cancello a singolo qubit.
In Qiskit, la creazione di un circuito con una porta si presenta come segue:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")Output:
Teoria
Illustriamo il protocollo per il teletrasporto quantistico usando la matematica. Poi, nella prossima sezione, realizzeremo questa configurazione utilizzando un computer quantistico.
Alice e Bob agganciano i loro qubit: Inizialmente, il qubit di Alice e il qubit di Bob sono ciascuno, separatamente, nello stato (un'ipotesi corretta e anche l'inizializzazione corretta per i computer quantistici di IBM® ). Possiamo scriverlo come o semplicemente come . Calcoliamo cosa succede quando Alice e Bob agiscono con il gate di Hadamard sul qubit di Alice e poi con un gate CNOT con il qubit di Alice come controllo e quello di Bob come bersaglio:
Si noti che ora i qubit di Alice e Bob sono entangled. Sebbene non sia ancora determinato dalla natura se entrambi i loro qubit si trovino nello stato o nello stato , è noto che i loro qubit si trovano nello stesso stato.
Alice e Bob si separano: I due amici spostano i loro qubit in nuove posizioni, possibilmente molto distanti tra loro. Ciò comporta molte avvertenze: non è banale spostare l'informazione quantistica senza disturbarla. Ma può essere spostata, e infatti la sposterete in questo modulo. Ma teniamo presente che ci aspettiamo di incontrare alcuni errori quando spostiamo molto le informazioni quantistiche.
Q viene introdotto: Lo stato segreto viene preparato sul qubit Q:
A questo punto Q è semplicemente adiacente al qubit di Alice (A). Non c'è stato entanglement, quindi lo stato quantistico dei tre qubit insieme può essere scritto come:
L'obiettivo è spostare le informazioni su Q dalla posizione di Alice a quella di Bob. A questo punto, non abbiamo alcuna pretesa o requisito di segretezza o velocità di trasferimento delle informazioni. Stiamo semplicemente esplorando il modo in cui le informazioni possono passare da Alice a Bob.
Poiché le informazioni iniziano da Q, assumeremo che a Q sia assegnato il numero più basso tra i qubit, in modo che la notazione little endian faccia sì che Q sia il qubit più a destra nella matematica che segue.
Alice aggancia i qubit A e Q: ora Alice opera con una porta CNOT con il proprio qubit come controllo e Q come bersaglio, quindi applica una porta Hadamard a Q. Calcoliamo lo stato a tre qubit dopo questa operazione:
Poiché A e Q si trovano nella stessa posizione, raggruppiamo i termini di cui sopra in base ai risultati delle misurazioni sui qubit A e Q:
Verifica la tua comprensione
Data l'espressione sopra riportata relativa agli stati di tutti e tre i qubit, qual è la probabilità che una misurazione dei qubit A e Q dia come risultato un
25%. Per capire questo, ricordiamo che lo stato di Bob deve essere normalizzato, quindi
Ora, Alice può misurare i qubit A e Q. Non può controllare l'esito della misurazione, poiché le misure quantistiche sono probabilistiche. Quindi, quando misura, ci sono 4 risultati possibili e tutti e 4 sono ugualmente probabili: e Si noti che ogni risultato ha implicazioni diverse per il qubit di Bob. Ad esempio, se Alice trova i suoi qubit in , l'intero stato quantistico a 3 qubit è collassato in . Altri risultati di misurazione per Alice producono stati diversi per Bob. Questi sono raccolti nella tabella seguente.
Risultato di Alice | Stato di Bob | Istruzioni a Bob | Risultato |
|---|---|---|---|
| Nessuna | |||
| allora |
Per tutti i possibili risultati delle misurazioni sui qubit di Alice, il qubit di Bob rimane in uno stato che assomiglia vagamente allo stato segreto originariamente presente su Q. Nel caso in cui Alice misuri (la prima riga della tabella), il qubit di Bob viene lasciato esattamente nello stato segreto! Negli altri casi, c'è qualcosa di strano nello Stato. I coefficienti ( 's) sono scambiati, oppure c'è un segno "-" dove dovrebbe esserci un segno "+", o entrambi. Per modificare il qubit di Bob e renderlo esattamente uguale allo stato segreto, Alice deve chiamare Bob (utilizzando un mezzo di comunicazione classico) e dire a Bob di eseguire operazioni aggiuntive sul suo qubit, come indicato nella tabella. Ad esempio, nella terza riga i coefficienti sono scambiati. Se Alice chiama Bob e gli dice di applicare un gate al suo qubit, questo cambia un in un e viceversa, e viene fuori lo stato segreto.
Ora dovrebbe essere chiaro perché non possiamo usare questa configurazione per inviare informazioni più veloci della luce. Potremmo essere fortunati e misurare , il che significa che Bob ha esattamente lo stato segreto, all'istante. Ma Bob non lo sa finché non lo chiamiamo e gli diciamo: "Abbiamo misurato , quindi non devi fare nulla"
Nell'esperimento di pensiero, i qubit vengono spesso separati fisicamente e portati in una nuova posizione. IBM® i computer quantistici utilizzano qubit a stato solido su un chip che non possono essere separati. Quindi, invece di spostare Alice e Bob in luoghi diversi, separeremo le informazioni sul chip stesso utilizzando i cosiddetti "swap gate" per spostare le informazioni da un qubit all'altro.
Esperimento 1: Teletrasporto di base
IBM Quantum raccomanda di affrontare i problemi di calcolo quantistico utilizzando un quadro che chiamiamo "modelli Qiskit". Si compone delle seguenti fasi.
- Fase 1: mappare il problema in un circuito quantistico
- Fase 2: Ottimizzazione del circuito per l'esecuzione su hardware quantistico reale
- Fase 3: Eseguire il proprio processo sui computer quantistici dell' IBM utilizzando le primitive dell' IBM Quantum
- Fase 4: Postelaborazione dei risultati
Passaggio 1: mappa il tuo problema su un circuito quantistico
Tutti i calcoli che abbiamo fatto in precedenza erano per delineare il passo 1. Lo implementeremo ora, costruendo il nostro circuito quantistico con Qiskit! Iniziamo a creare un circuito quantistico con tre qubit e ad agganciare i due qubit di Alice e Bob. Questi saranno i qubit 1 e 2, mentre il qubit 0 sarà riservato allo stato segreto.
# Step 1: Map your problem to a quantum circuit
# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
import numpy as np
# Define registers
secret = QuantumRegister(1, "Q")
Alice = QuantumRegister(1, "A")
Bob = QuantumRegister(1, "B")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, Alice, Bob, cr)
# We entangle Alice's and Bob's qubits as in our work above.
# We apply a Hadamard gate and then a CNOT gate.
# Note that the second argument in the CNOT gate is the target.
qc.h(Alice)
qc.cx(Alice, Bob)
# Inserting a barrier changes nothing about the logic. It just allows us to
# force gates to be positioned in "layers".
qc.barrier()
# Now we will use random variables to create the secret state.
# Don't worry about the "u" gate and the details.
np.random.seed(42) # fixing seed for repeatability
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
# Assign the secret state to the qubit on the other side of Alice's (qubit 0), labeled Q
qc.u(theta, varphi, 0.0, secret)
qc.barrier()
# Now entangle Q and Alice's qubits as in the discussion above.
qc.cx(secret, Alice)
qc.h(secret)
qc.barrier()
# Now Alice measures her qubits, and stores the outcomes in the "classical registers" cr[]
qc.measure(Alice, cr[1])
qc.measure(secret, cr[0])
# Now we insert some conditional logic. If Alice measures Q in a "1" we need a Z gate, and if Alice
# measures A in a "1" we need an X gate (see the table).
with qc.if_test((cr[1], 1)):
qc.x(Bob)
with qc.if_test((cr[0], 1)):
qc.z(Bob)
qc.draw(output="mpl")Output:
Questo è tutto ciò che dobbiamo fare per far teletrasportare lo stato di Alice a Bob. Tuttavia, ricordiamo che quando misuriamo uno stato quantistico troviamo o o Quindi, alla fine di tutto questo, Bob ha sicuramente lo stato segreto di Alice, ma non possiamo verificarlo facilmente con una misurazione. Affinché una misurazione ci dica che abbiamo fatto questo correttamente, dobbiamo fare un trucco. Avevamo un operatore contrassegnato con "U" per "unitario", che abbiamo usato per preparare lo stato segreto di Alice. Possiamo applicare l'inverso di U alla fine del nostro circuito. Se U ha mappato lo stato di Alice in , allora l'inverso di U mapperà lo stato di Bob in Quest'ultima parte non verrebbe necessariamente eseguita se l'obiettivo fosse solo quello di spostare informazioni quantistiche. Questo viene fatto solo per controllare noi stessi.
# Add the inverse of U and measure Bob's qubit.
qc.barrier()
qc.u(theta, varphi, 0.0, Bob).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(Bob, cr[2]) # add measurement gate
qc.draw(output="mpl")Output:
Quindi, se abbiamo fatto questo correttamente, la nostra misura sul qubit di Bob dovrebbe produrre uno stato . Naturalmente, queste misure sono probabilistiche. Quindi, se c'è anche solo una piccola possibilità di misurare il qubit di Bob nello stato , allora una singola misurazione potrebbe risultare in Vorremmo davvero effettuare molte misurazioni per essere certi che la probabilità di sia piuttosto alta.
Fase 2: Ottimizzazione del problema per l'esecuzione quantistica
Questa fase prende le operazioni che vogliamo eseguire e le esprime in termini di funzionalità di uno specifico computer quantistico. Inoltre, il nostro problema è stato tracciato sul layout del computer quantistico.
Inizieremo caricando diversi pacchetti che sono necessari per comunicare con i computer quantistici di IBM. Dobbiamo anche selezionare un backend su cui eseguire l'operazione. Possiamo scegliere il backend meno trafficato, oppure selezionare un backend specifico di cui conosciamo le proprietà.
Di seguito è riportato un codice per salvare le credenziali al primo utilizzo. Assicurarsi di eliminare queste informazioni dal blocco note dopo averlo salvato nel proprio ambiente, in modo che le credenziali non vengano accidentalmente condivise quando si condivide il blocco note. Per ulteriori informazioni, vedere Configurazione dell'account IBM Cloud e Inizializzazione del servizio in un ambiente non attendibile.
# Load IBM Quantum Compute Service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load IBM Quantum Compute 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_sherbrooke
Abilitiamo esplicitamente la logica sulle misure.
from qiskit.circuit import IfElseOp
backend.target.add_instruction(IfElseOp, name="if_else")Ora dobbiamo "transpilare" il circuito quantistico. Si tratta di un argomento affascinante che coinvolge molte fasi secondarie. Solo per fare un esempio di un sottofase: non tutti i computer quantistici possono implementare direttamente tutte le porte logiche di Qiskit. Dobbiamo scrivere le porte del nostro circuito in termini di porte che il computer quantistico può implementare. Possiamo eseguire questo processo, e altri, utilizzando un gestore di pass preimpostati. L'impostazione di optimization = 3 (il livello più alto di ottimizzazione) garantisce che la mappatura dal nostro circuito quantistico astratto alle istruzioni fornite al computer quantistico sia la più efficiente possibile, grazie alla nostra pre-elaborazione.
# 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)Un "Sampler" è una primitiva progettata per campionare i possibili stati risultanti da un circuito quantistico e raccogliere dati statistici su quali stati potrebbero essere misurati e con quale probabilità. Qui importiamo il codice di esempio " IBM Quantum ":
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)Non tutti i calcoli di un computer quantistico possono essere ragionevolmente simulati su computer classici. Questo semplice teletrasporto può sicuramente esserlo, ma non è affatto sorprendente che possiamo classicamente salvare le informazioni in un luogo o in un altro. Si consiglia vivamente di eseguire questi calcoli utilizzando un vero computer quantistico IBM. Ma nel caso in cui abbiate esaurito il vostro utilizzo mensile gratuito, o se dovete completare qualcosa in classe e non potete aspettare in coda, questo modulo può essere completato utilizzando un simulatore. A tale scopo, è sufficiente eseguire la cella sottostante e decommentare le righe associate nei passaggi "Esegui".
# 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)Fase 3: Esecuzione
Utilizzare il campionatore per eseguire il lavoro, con il circuito come argomento.
job = sampler.run([qc_isa])
# job = sampler_sim.run([qc_isa])
res = job.result()
counts = res[0].data.c.get_counts()Fase 4: Post-elaborazione e analisi
Tracciamo i risultati e interpretiamoli.
# This required 5 s to run on a Heron r2 processor on 10-28-24
from qiskit.visualization import plot_histogram
plot_histogram(counts)Output:
Verifica la tua comprensione
Quali degli stati sopra indicati indicano che il teletrasporto è andato a buon fine, e come si fa a capirlo?
Gli stati sono tutti coerenti con il successo del teletrasporto. Questo perché abbiamo aggiunto un cancello per annullare la preparazione iniziale dello stato segreto. Se lo stato segreto è stato teletrasportato con successo al qubit di Bob, quel gate aggiuntivo dovrebbe riportare il qubit di Bob allo stato . Quindi qualsiasi stato superiore con il qubit di Bob (qubit 0, misurato anche sulla componente 0 del registro classico, e quindi il più alto/più a destra) nello stato indica un successo.
Questo grafico mostra tutti i risultati delle misure dei tre qubit, su 5.000 prove o "scatti". Abbiamo sottolineato in precedenza che Alice misurerebbe tutti i possibili stati dei qubit A e Q con la stessa probabilità. Abbiamo assegnato i qubit 0-2 del circuito a Q, A e B, in quest'ordine. In notazione little-endian, il qubit di Bob è il più a sinistra/il più basso. Quindi le quattro barre a sinistra corrispondono al fatto che il qubit di Bob è e gli altri due qubit sono in tutte le combinazioni possibili con una probabilità approssimativamente uguale. Si noti che quasi tutte le misurazioni (di solito ´95%) danno il qubit di Bob nello stato , il che significa che la nostra configurazione ha avuto successo! Ci sono una manciata di scatti (~5%) che hanno prodotto il qubit di Bob nello stato . Questo non dovrebbe essere logicamente possibile. Tuttavia, tutti i moderni computer quantistici soffrono di rumore ed errori in misura molto maggiore rispetto ai computer classici. E la correzione quantistica degli errori è ancora un campo emergente.
Esperimento 2: Teletrasporto attraverso un processore
Probabilmente, la parte più interessante del teletrasporto quantistico è che uno stato quantistico può essere teletrasportato su lunghe distanze in modo istantaneo (sebbene la comunicazione classica di porte extra non sia istantanea). Come già detto, non possiamo staccare i qubit dal processore e spostarli. Ma possiamo spostare l'informazione da un qubit all'altro, finché i qubit coinvolti nel teletrasporto non si trovano ai lati opposti del processore. Ripetiamo i passaggi precedenti, ma ora realizzeremo un circuito più grande con un numero di qubit sufficiente a coprire il processore.
Passaggio 1: mappa il tuo problema su un circuito quantistico
Questa volta, i qubit corrispondenti ad Alice e Bob cambieranno. Quindi non chiameremo un singolo qubit "A" e un altro "B". Piuttosto, numereremo i qubit e useremo variabili per rappresentare la posizione attuale delle informazioni sui qubit appartenenti ad Alice e Bob. Tutte le altre fasi, ad eccezione delle porte di scambio, sono descritte in precedenza.
# Step 1: Map
# Define registers
qr = QuantumRegister(13, "q")
qc = QuantumCircuit(qr, cr)
# Define registers
secret = QuantumRegister(1, "Q")
ebitsa = QuantumRegister(6, "A")
ebitsb = QuantumRegister(6, "B")
# q = ClassicalRegister(1, "q meas")
# a = ClassicalRegister(1, "a")
# b = ClassicalRegister(1, "b")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, ebitsa, ebitsb, cr)
# We'll start Alice in the middle of the circuit, then move information outward in both directions.
Alice = 5
Bob = 0
qc.h(ebitsa[Alice])
qc.cx(ebitsa[Alice], ebitsb[Bob])
# Starting with Bob and Alice in the center, we swap their information onto adjacent qubits,
# until the information is on distant qubits.
for n in range(Alice):
qc.swap(ebitsb[Bob], ebitsb[Bob + 1])
qc.swap(ebitsa[Alice], ebitsa[Alice - 1])
Alice = Alice - 1
Bob = Bob + 1
qc.barrier()
# Create a random state for Alice (qubit zero)
np.random.seed(42) # fixing seed for repeatability
# theta = np.random.uniform(0.0, 1.0) * np.pi #from 0 to pi
theta = 0.3
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi
qc.u(theta, varphi, 0.0, secret)
# Entangle Alice's two qubits
qc.cx(secret, ebitsa[Alice])
qc.h(secret)
qc.barrier()
# Make measurements of Alice's qubits and store the results in the classical register.
qc.measure(ebitsa[Alice], cr[1])
qc.measure(secret, cr[0])
# Send instructions to Bob's qubits based on the outcome of Alice's measurements.
with qc.if_test((cr[1], 1)):
qc.x(ebitsb[Bob])
with qc.if_test((cr[0], 1)):
qc.z(ebitsb[Bob])
qc.barrier()
# Invert the preparation we did for Carl's qubit so we can check whether we did this correctly.
qc.u(theta, varphi, 0.0, ebitsb[Bob]).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(ebitsb[Bob], cr[2]) # add measurement gate
qc.draw("mpl")Output:
Nello schema del circuito si può notare che i passaggi logici sono gli stessi. L'unica differenza è che abbiamo usato le porte di scambio per portare lo stato del qubit di Alice dal qubit 6 ( ) fino al qubit 1 ( ), proprio accanto a Q. E abbiamo usato le porte di scambio per portare lo stato iniziale di Bob dal qubit 7 ( ) al qubit 12 ( ). Si noti che lo stato del qubit 12 non è nemmeno correlato allo stato segreto di Q finché non vengono effettuate misure sui qubit 0 e 1 distanti, e lo stato del qubit 12 non è uguale allo stato segreto finché non vengono applicate le porte condizionali e .
Passaggio 2: Ottimizza il tuo circuito
Normalmente, quando si usa il gestore dei passaggi per transpilare e ottimizzare i circuiti, ha senso impostare optimization_level = 3, perché si vuole che i circuiti siano il più efficienti possibile. In questo caso, non c'è alcuna ragione computazionale per trasferire gli stati dai qubit 6 e 7 ai qubit 1 e 12. Era solo una cosa che abbiamo fatto per dimostrare il teletrasporto a distanza. Se chiediamo al pass manager di ottimizzare il nostro circuito, si renderà conto che non c'è alcuna ragione logica per questi swap gate, e li rimuoverà ed eseguirà le operazioni di gate sui qubit adiacenti. Quindi, per questo caso speciale, utilizziamo optimization_level = 0.
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pmzero = generate_preset_pass_manager(target=target, optimization_level=0)
qc_isa_zero = pmzero.run(qc)
print(qc_isa_zero.depth())Output:
105
Possiamo visualizzare la posizione di questi qubit sul processore quantistico utilizzando la funzione plot_circuit_layout .
Fase 3: Esecuzione
Come in precedenza, si consiglia di eseguire l'operazione su computer quantistici reali IBM. Se l'utilizzo mensile gratuito è stato raggiunto, è possibile decommentare le celle del simulatore per eseguirle su un simulatore.
# This required 5 s to run on a Heron r2 processor on 10-28-24
job = sampler.run([qc_isa_zero])
# job = sampler_sim.run([qc_isa_zero])
counts = job.result()[0].data.c.get_counts()from qiskit.visualization import plot_histogram
plot_histogram(counts)Output:
Fase 4: Post-elaborazione classica
Anche in questo caso vediamo che le probabilità dei possibili risultati per i qubit di Alice sono abbastanza uniformi. C'è una forte preferenza per trovare il qubit di Bob in dopo aver invertito il codice segreto, il che significa che c'è una forte probabilità di aver teletrasportato correttamente lo stato segreto attraverso il processore da Q a Bob (qubit da 0 a 12). Tuttavia, notiamo che ora c'è una probabilità maggiore di non misurare per Bob. Questa è una lezione importante per l'informatica quantistica: più porte si hanno, soprattutto porte multi-qubit come le porte swap, più rumore ed errori si incontrano.
Domande
Gli insegnanti possono richiedere le versioni di questi quaderni con le chiavi di risposta e le indicazioni per l'inserimento nei curricula comuni compilando questo rapido sondaggio sull'utilizzo dei quaderni.
Concetti fondamentali
- I qubit possono essere entangled, ovvero la misurazione di un qubit influenza o addirittura determina lo stato di un altro qubit.
- L'entanglement è diverso dalle correlazioni classiche; ad esempio, i qubit A e B potrebbero trovarsi in una sovrapposizione di stati come . Lo stato di A o B potrebbe essere indeterminato dalla natura, eppure si potrebbe garantire che A e B si trovino nello stesso stato.
- Attraverso una combinazione di entanglement e misure, possiamo trasferire uno stato (che può memorizzare informazioni) da un qubit all'altro. Questo trasferimento può avvenire anche su lunghe distanze e si chiama teletrasporto quantistico.
- Il teletrasporto quantistico si basa su misure quantistiche, che sono probabilistiche. Pertanto, la comunicazione classica può essere necessaria per modificare gli stati teletrasportati. Questo impedisce al teletrasporto quantistico di spostare le informazioni più velocemente della luce. Il teletrasporto quantistico non viola la relatività o la causalità.
- I moderni computer quantistici sono più sensibili al rumore e agli errori rispetto ai computer classici. Aspettatevi un errore di qualche punto percentuale.
- Più porte si aggiungono in sequenza (soprattutto quelle a 2 qubit), più errori e rumore si possono prevedere.
Domande vero/falso
- T/F Il teletrasporto quantistico può essere utilizzato per inviare informazioni più velocemente della luce.
- T/F Le prove moderne suggeriscono che il collasso di uno stato quantistico si propaga più velocemente della luce.
- T/F In Qiskit, i qubit sono ordinati in stati con il qubit di numero più basso a destra, come in
Domande del presentatore
- I Qubit A e B sono entangled, quindi separati da una grande distanza . Il Qubit A viene misurato. Quale affermazione è corretta riguardo alla velocità con cui viene influenzato lo stato del qubit B?
- a. Il Qubit B viene influenzato istantaneamente, entro la tolleranza sperimentale, negli esperimenti condotti finora.
- b. Il Qubit B viene colpito dopo un tempo , il che significa che lo stato quantistico "collassa" approssimativamente alla velocità della luce, entro la tolleranza sperimentale.
- c. Il Qubit B è interessato solo dopo che si è verificata la comunicazione classica, il che significa che avviene in un tempo superiore a .
- d. Nessuna delle precedenti
- Ricordiamo che la probabilità di misurazione è legata alle ampiezze degli stati quantistici. Ad esempio, se un qubit si trova inizialmente nello stato , la probabilità di misurare lo stato è Non tutti gli insiemi di misurazioni corrisponderanno esattamente a queste probabilità, a causa di un campionamento finito (proprio come il lancio di una moneta potrebbe dare testa per due volte di seguito). L'istogramma di misura sottostante potrebbe corrispondere a quale dei seguenti stati quantistici? Selezionare l'opzione migliore.
- a.
- b.
- c.
- d.
- e.
- Quale dei seguenti stati mostra i qubit A e B entangled? Selezionare tutte le opzioni appropriate.
- a.
- b.
- c.
- d.
- e.
- In questo modulo abbiamo preparato uno stato entangled: Ma ci sono molti altri stati entangled che si possono usare per un protocollo simile. Quale dei seguenti stati potrebbe produrre un istogramma di misura a 2 qubit come il seguente? Selezionare la risposta migliore.
- a.
- b.
- c.
- d.
- e.
Domande di discussione
-
Descrivete al vostro compagno/gruppo il protocollo di teletrasporto quantistico, dall'inizio alla fine. Chiedete se hanno qualcosa da aggiungere o se hanno domande da fare.
-
C'è qualcosa di unico nello stato entangled iniziale tra Alice e Bob: Se sì, che cosa c'è di unico? In caso contrario, quali altri stati entangled avremmo potuto utilizzare?