1. Introduzione
1.1. Intro dell’intro
Non so bene cosa sia questo articolo, un misto tra esperimento di coding, divulgazione e forse uno svago di qualcuno che in un’altra vita avrebbe voluto fare il fisico.
Ce l’avevo nel cassetto da un po’ di tempo, da quando avevo letto questo articolo di alcuni ricercatori del CERN, che spiega come sia possibile simulare un esperimento sulle disuguaglianze di Bell usando il framework Qibo.
La lettura dell’articolo mi ha portato ad una constatazione che, almeno per me è super-affascinante: oggi nel 2025 chiunque con un minimo di conoscenze di programmazione e un paio di concetti di base, può fare (o almeno simulare) un esperimento di meccanica quantistica che 20 o 30 anni fa sarebbe stato possibile solo in un laboratorio di fisica con attrezzature costosissime.
Tuttavia, l’esercizio di fare COPIA/INCOLLA del codice e lanciarlo, non mi sembra di particolare interesse, per lo meno senza capire bene di cosa stiamo parlando. Per questo motivo, ho iniziato a studiare un po’ la storia e qualche principio di base.
Questo piccolo esercizio di approfondimento, che attraversa più di un secolo di storia, dalle origini (1905) fino al premio Nobel del 2022 (secondo me meriterebbe un film o un romanzo) e sfiora alcuni dei problemi epistemologici più profondi che il genere umano abbia mai affrontato, ha dunque dato un senso all’esercizio finale, che rimane comunque poco più di un COPIA/INCOLLA dall’articolo del CERN e da qualche suggerimento di Claude 😃
1.2. Intro vera
In molti si chiedono se/quando il quantum computing diventerà una realtà. A dire il vero, dopo una forte espansione del mercato nel periodo post-covid c’è stato un trend crescita moderato tra il 2022 ed il 2024, probabilmente a causa della crisi economica globale e dell’attenzione spostata sull’intelligenza artificiale generativa.
Year | Global Market Revenues |
---|---|
2020 | ████████ $412M |
2021 | ████████ $391M |
2022 | ██████████████ $713M |
2023 | █████████████████ $885M |
2024 | ███████████████████████ $1,160M |
Fonti:
In particolare, nel 2024 i principali player che operano nel settore del Quantum Computing, hanno frenato un po’ la corsa al numero di qubit, concrentrandosi sullo sviluppo di nuove architetture per ridurre il cosiddetto fenomeno della decoerenza quantistica, che è uno dei principali ostacoli per la scalabilità dei sistemi attuali. Tuttavia, nel 2025 c’è stato un ritorno di fiamma, con annunci di nuovi prototipi da parte di IBM, Google e Microsoft e negli ultimi 6 mesi, il titolo di Rigetti (altro player che a differenza dei precedenti, opera esclusivamente nel settore del quantum computing) è cresciuto in borsa del 380%!
In ogni caso, non si è vista ancora alcuna vera rivoluzione e quasi tutti concordano sul fatto che probabilmente il QC non sostituità mai il modello di calcolo classico, ma nel migliore dei casi lo affiancherà, permettendo di risolvere problemi complessi in maniera efficiente.
Un esempio di problema che potrebbe essere risolto in maniera efficiente con un computer quantistico è la scomposizione in fattori primi di numeri interi molto grandi, tramite l’algoritmo di Shor allo scopo di far evolvere (o violare) i sistemi di crittografia attualmente in uso.
Le limitazioni attuali dei computer quantistici, però, non permettono ancora di eseguire questo algoritmo in maniera efficiente su numeri di grandezza tale da minare la sicurezza dei sistemi crittografici attuali. A parte questo caso d’uso potenziale, e qualche altro caso particolare e circoscritto ad ambiti molto particolari, come ad esempio l’algoritmo di Grover per la ricerca in liste non ordinate, non si vedono ancora applicazioni pratiche del quantum computing. Mentre aspettiamo che arrivino applicazioni pratiche, possiamo però già oggi usarla per fare veri e propri esperimenti di meccanica quantistica. Tali esperimenti, che per me sono poco più che un gioco, fanno riferimento a dei lavori molto più seri, durati qualche decennio, che nel 2022 hanno portato John Clauser, Alain Aspect e Anton Zeilinger a vincere il premio Nobel per la Fisica: gli esperimenti sulle Disuguaglianze di Bell.
Inutile dire che quello riportato qui non è neanche un vero e proprio “esperimento”, poiché mi sono basato su un simulatore (e non un vero computer quantistico). Inoltre il circuito che ho implementato è basato su una semplificazione estrema dell’esperimento originale, ma i principi teorici sono gli stessi ed inoltre potrebbe essere portato su un vero Quantum Computer commerciale con poco sforzo, dunque è un esercizio interessante per capire che cosa significa veramente la “non-località” in meccanica quantistica e come gli stessi principi siano alla base del funzionamento del Quantum Computing.
Per farlo, ci servono alcuni ingredienti:
- Un po’ di storia
- Qualche nozione di meccanica quantistica
- Un deep dive sulle disuguaglianze di Bell
- Le basi del Quantum Computing
2. Un po’ di storia
2.1. Einstein e la meccanica quantistica
Forse non tutti sanno che Albert Einstein non vinse il premio Nobel per le sue teorie sulla relatività, ma bensì per la spiegazione dell’effetto fotoelettrico, traendo spunto da un’idea di Max Planck. Analogamente agli studi sulla relatività, quel lavoro di Einstein fu di enorme importanza per la fisica del XX secolo, perché diede il via all’altra grande branca della fisica: la meccanica quantistica. Un fatto degno di nota è che nessun premio Nobel è mai stato assegnato per scoperte direttamente collegate alla teoria della relatività, mentre dal 1920 almeno 16 Nobel sono stati assegnati per studi o scoperte direttamente collegati alla meccanica quantistica.
Agli inizi del ventesimo secolo, l’idea della luce come “corpuscolo” era in contrasto con la rappresentazione ondulatoria della luce, che era ormai ben consolidata e risaliva addirittura ai lavori di Christiaan Huygens svolti intorno alla metà del 1600. Nel corso dei secoli, la natura ondulatoria venne più volte messa in discussione, ma gli esperimenti di interferenza le solide basi teoriche introdotte da Thomas Young nel 1801, e successivamente da James Clerk Maxwell con la sua teoria elettromagnetica della luce, sembravano aver definitivamente chiuso la questione. Di conseguenza, lo stesso Planck, quando introdusse l’idea dei quanti nel 1900, non credeva veramente nella natura corpuscolare della luce. Dal suo punto di vista, si trattava solo di una astrazione teorica, che serviva a spiegare il problema dell’emissione di radiazione di corpo nero, ma che non aveva una reale corrispondenza fisica.
Il grande merito di Einstein fu quello di prendere sul serio l’intuzione di Planck, secondo cui l’energia non poteva essere scambiata in maniera continua, ma bensì a “pacchetti” discreti, che Planck chiamò “quanti” (da cui il nome “meccanica quantistica”). Nel 1905, Einstein applicò questa idea per spiegare l’effetto fotoelettrico, ipotizzando che la luce fosse composta da “quanti di luce”, che oggi chiamiamo fotoni e ciò gli valse il premio Nobel per la fisica nel 1921.
Tuttavia, all’inizio nessuno credette ad Einstein, neppure Max Planck, che pure aveva fornito l’intuizione iniziale. Fu solo grazie al lavoro di Robert Millikan che, con l’obiettivo di screditare la tesi di Einstein, fece numerosi esperimenti e impiegò diversi anni per arrendersi al fatto che la spiegazione dell’effetto fotoelettrico fornita da Einstein era corretta e dunque l’ipotesi dei quanti era tutt’altro che una semplice astrazione teorica.
Da qui in avanti, è un susseguirsi di studi e scoperte che fanno della meccanica quantistica la teoria fisica più accurata e precisa mai sviluppata e che hanno portato in pochi anni ad una sequenza incredibile di premi Nobel, tra cui i più importanti sono:
- 1922 - Niels Bohr per i suoi studi sulla struttura atomica
- 1923 - Millikan per il suo lavoro sperimentale sull’effetto fotoelettrico e la misura della carica dell’elettrone
- 1927 - Arthur Compton per la scoperta dell’effetto Compton
- 1929 - Louis de Broglie per la scoperta della natura ondulatoria dell’elettrone
- 1932 - Werner Heisenberg per la formulazione della meccanica quantistica
- 1933 - Erwin Schrödinger e Paul Dirac per la formulazione della meccanica ondulatoria
- 1945 - Wolfgang Pauli per la scoperta del principio di esclusione
- 1954 - Max Born per la formulazione della meccanica quantistica in termini probabilistici
- 1965 - Richard Feynman, Julian Schwinger e Sin-itiro Tomonaga per lo sviluppo dell’elettrodinamica quantistica
Ironia della sorte, proprio Einstein che aveva dato il via a quella rivoluzione, iniziò ad essere sempre più scettico sulla teoria stessa mano a mano che andava sviluppandosi, fino al punto di isolarsi dalla comunità scientifica che nel frattempo l’aveva abbracciata pienamente.
Ma perché Einstein era così scettico in merito alla rappresentazione della realtà secondo la meccanica quantistica? La risposta a questa domanda ha appunto a che fare con il concetto stesso di Realtà e richiede un approfondimento per capire il punto di vista di Einstein.
2.2. Che cos’è la realtà?
Da un certo punto di vista, l’approccio di Einstein ai problemi sollevati meccanica quantistica è stato simile a quello che aveva caratterizzato il suo approccio alla Relatività. Nel momento in cui si trovava di fronte ad un problema apparentemente insolubile (come ad esempio la costanza della velocità della luce su tutti i sistemi di riferimento inerziali), non cercava a tutti i costi di adattare la teoria, ma piuttosto iniziava a mettere in discussione e a definire un nuovo formalismo, per concetti che sembravano ormai assodati, come ad esempio il concetto di simultaneità, di tempo e di spazio.
Qualcosa di analogo avvenne anche per il concetto di Realtà, attraverso cui poi Einsten, Podolsky e Rosen formularono il famoso paradosso EPR, che metteva in discussione la completezza della meccanica quantistica.
Dal punto di vista di Einstein, la descrizione del mondo fisico doveva obbedire a 2 principi fondamentali:
- Località: un oggetto può essere influenzato solo dal suo immediato intorno, e non da eventi che avvengono a distanza arbitrariamente elevata. In altre parole, non possono esistere “azioni a distanza” (spooky action at a distance).
- Realismo: gli oggetti hanno proprietà definite indipendentemente dall’osservazione. In altre parole, la realtà esiste indipendentemente dal fatto che noi la osserviamo o meno.
Il Paradosso EPR descrive alcuni esperimenti mentali attraverso cui gli autori provano a dimostrare che la meccanica quantistica non può essere una teoria completa, perché viola almeno uno dei principi sopra elencati.
In altre parole, se la meccanica quantistica è corretta, allora vale almeno una delle seguenti affermazioni:
- il principio di località è falso, e quindi esistono azioni a distanza che violano il limite della velocità della luce
- il principio di realismo è falso, e quindi gli oggetti non hanno proprietà definite indipendentemente dall’osservazione, ma bensì le proprietà fisiche si manifestano solo nel momento in cui esse vengono misurate
Da un punto di vista tecnico, il paradosso EPR si basa sul concetto di entanglement che, oltre ad essere uno dei concetti più strani e affascinanti della meccanica quantistica (spesso frainteso e mal interpretato), è anche alla base del funzionamento dei computer quantistici.
2.3 L’interesse del mondo scientifico alla questione
Per decenni, l’intera questione del paradosso EPR e della interpretazione epistemologica della meccanica quantistica rimase confinata a discussioni filosofiche tra pochi addetti ai lavori, e già dopo gli anni 30 la meccanica quantistica era talmente ben consolidata che nessuno si preoccupava più di questi aspetti. Lo stesso Bell, ha lavorato come fisico delle particelle presso diversi enti di ricerca in UK e poi al CERN e si dedicava a questo tema solo nel tempo libero. Nel 1964, durante un anno sabbatico negli Stati Uniti, Bell pubblicò il famoso articolo “On the Einstein Podolsky Rosen paradox” in cui propose un modo per verificare sperimentalmente se Einstein avesse ragione o meno. L’articolo suscitò un certo interesse, ma tuttavia, anche dopo la pubblicazione di Bell, solo pochi temerari si interessarono ad un potenziale esperimento per verificare le disuguaglianze di Bell, anche perché dopo poco tempo la stessa rivista su cui Bell aveva pubblicato l’articolo fallì e questo non contribuì certo a diffondere l’idea.
Lo stesso John Clauser, uno dei tre premi Nobel del 2022, inzialmente non era molto convinto di voler affrontare la questione e racconta che quando chiese un consiglio al mitico Richard Feynman di fare il suo primo esperimento per testare le disuguaglianze di Bell, gli venne risposto che si trattava di una “perdita di tempo”, perché la meccanica quantistica era già stata ampiamente verificata e nessuno si aspettava che Einstein avesse ragione.
3. Qualche nozione di meccanica quantistica
3.1. Sovrapposizione quantistica
In meccanica quantistica, un sistema può trovarsi in uno stato di sovrapposizione, cioè in una combinazione di più stati contemporaneamente.
Nel mondo del quantum computing, lo stato di sovrapposizione può essere implementato tramite l’applicazione di alcuni operatori (quantum gates) sui qubit, l’analogo quantistico del bit classico. Mentre un bit classico può assumere solo i valori 0 o 1, un qubit può trovarsi in una sovrapposizione dei due stati, rappresentata matematicamente come:
$$|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$$
dove $\alpha$ e $\beta$ sono numeri complessi che soddisfano la condizione $|\alpha|^2 + |\beta|^2 = 1$.
3.2. Misura quantistica
Quando misuriamo un qubit, la sovrapposizione “collassa” in uno dei due stati base (0 o 1), con probabilità rispettivamente $|\alpha|^2$ e $|\beta|^2$.
Questo è uno degli aspetti più controversi della meccanica quantistica: prima della misura, il sistema è effettivamente in entrambi gli stati contemporaneamente (almeno secondo l’interpretazione di Copenaghen), ma nel momento in cui lo misuriamo, la realtà “sceglie” uno dei due stati in modo probabilistico.
Einstein non ha mai accettato questa interpretazione. In un primo momento cercò di dimostrare che la meccanica quantistica fosse errata. Sono ormai celebri le sue critiche a Bohr durante i congressi Solvay e gli esperimenti mentali con cui cercava di mettere in difficoltà l’impostazione teoretica della meccanica quantistica che oggi possiamo definire “ortodossa”. Tuttavia, Bohr e Heisenberg riuscivano sempre a trovare una risposta alla challenge di Einstein, supportata dalla teoria stessa. Alla fine, Einstein si arrese all’evidenza: la meccanica quantistica era corretta.
Tuttavia continuò a sostenere che fosse una teoria incompleta e che doveva esistere una descrizione più completa della realtà, che includesse delle “variabili nascoste” che permettono di predire il risultato della misura in modo deterministico.
Al di là delle implicazioni filosofiche, il concetto di “misura” ha delle implicazioni pratiche anche nella programmazione quantistica poiché, ad esempio, non possiamo semplicemente “leggere” lo stato di un qubit in uno stato di sovrapposizione senza alterarlo. Nella interpretazione di Copenhagen, questa alterazione (cioè questa “misura”) equivale al concetto di collasso della funzione d’onda.
3.3. Entanglement
L’entanglement (correlazione quantistica) è forse il fenomeno più strano e controintuitivo della meccanica quantistica. Quando due particelle sono entangled, esse formano un unico sistema quantistico, anche se sono separate da distanze arbitrariamente grandi.
Questa correlazione porta a fenomeni che Einstein chiamava “azioni fantasma a distanza” (spooky actions at a distance) e che lo portarono a credere che la meccanica quantistica dovesse essere una teoria incompleta.
Ciononostante, per quanto strana e controintuitiva (anzi, forse proprio a causa di questo aspetto), il fenomeno dell’entanglement è stato sperimentato e verificato innumerevoli volte in laboratorio.
Nella stragrande maggioranza dei casi, i test fanno riferimento a singole particelle, ma esistono anche casi in cui è stato verificato lo stato entangled di sistemi macroscopici come molecole.
L’esempio più estremo e famoso è quello dell’esperimento mentale del gatto di Schrödinger, che si trova contemporaneamente vivo e morto fino a quando non viene osservato.
3.3.1. Entanglement e Quantum Computing
Dal punto di vista del Quantum Computing, un esempio classico è quello di due qubit in stato di Bell:
$$|\Phi^+\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$$
Questo stato rappresenta una sovrapposizione in cui i due qubit sono entrambi 0 oppure entrambi 1 con probabilità 50%. La cosa straordinaria è che quando misuriamo il primo qubit e otteniamo (ad esempio) 0, istantaneamente il secondo qubit collassa anche lui nello stato 0, indipendentemente dalla distanza che li separa.
3.4 Teorie a variabili nascoste
Secondo Einstein, la meccanica quantistica era una teoria incompleta: le probabilità che osserviamo nelle misure quantistiche non rifletterebbero una reale indeterminazione della natura, ma semplicemente la nostra ignoranza di alcune variabili nascoste che in teoria potrebbero essere utilizzate per determinare in modo preciso il risultato di una misura.
Per capire meglio questo concetto, possiamo fare un’analogia con il lancio di una moneta:
- Dal punto di vista pratico, il risultato (testa o croce) sembra casuale con probabilità 50%
- Ma sappiamo che in realtà il risultato è completamente determinato dalle condizioni iniziali: velocità, angolo di lancio, forza, resistenza dell’aria, ecc.
- Se conoscessimo perfettamente tutte queste “variabili nascoste”, potremmo predire con certezza il risultato
Einstein credeva che qualcosa di simile avvenisse anche in meccanica quantistica. Quando prepariamo un elettrone in uno stato di sovrapposizione e poi lo misuriamo, secondo Einstein:
- L’elettrone possiede già una proprietà definita prima della misura
- Questa proprietà è determinata da variabili che la teoria attuale non include (variabili “nascoste”)
- La natura probabilistica della meccanica quantistica deriva solo dalla nostra ignoranza di queste variabili
- Una teoria più completa, che includesse queste variabili, sarebbe completamente deterministica
Questo punto di vista è chiamato realismo locale con variabili nascoste:
- Locale: le variabili nascoste sono proprietà intrinseche del sistema, non influenzate da eventi distanti
- Realista: le proprietà fisiche esistono indipendentemente dall’osservazione
- Deterministico: conoscendo le variabili nascoste, il risultato della misura sarebbe predeterminato
Il paradosso EPR fu proprio un tentativo di Einstein, Podolsky e Rosen di dimostrare che tali variabili nascoste dovevano necessariamente esistere per mantenere i principi di località e realismo.
4. Un deep dive sulle disuguaglianze di Bell
4.1. Il lavoro di John Bell
Nel 1964, il fisico irlandese John Stewart Bell propose un modo per verificare sperimentalmente se Einstein avesse ragione. Bell formulò una serie di disuguaglianze matematiche che devono essere soddisfatte se vale il principio di realismo locale (cioè se valgono insieme sia il principio di località che quello di realismo).
L’idea geniale di Bell fu di trovare una quantità misurabile che:
- Se la meccanica quantistica è corretta, viola le disuguaglianze
- Se esiste una teoria a “variabili nascoste locali” (come Einstein sosteneva), rispetta le disuguaglianze
Questo lavoro, tuttavia, era di natura interamente matematica. La bravura dei fisici che vennero in seguito (e per cui alla fine è stato riconosciuto il Nobel nel 2022) fu quella di progettare e realizzare esperimenti per declinarlo nel mondo reale.
4.2. Il test CHSH
Una delle formulazioni più utilizzate delle disuguaglianze di Bell è il test CHSH (da Clauser, Horne, Shimony e Holt), che prende il nome dai quattro fisici che lo proposero nel 1969.
L’esperimento prevede:
- Una sorgente che produce coppie di particelle entangled (ad esempio fotoni polarizzati)
- I soliti “Alice” e “Bob” di tutti gli esperimenti di fisica, i quali possono scegliere tra due possibili misure da effettuare
- Si misurano le correlazioni tra i risultati ottenuti da Alice e Bob
Più formalmente:
- Alice può scegliere di misurare secondo l’angolo $a_0$ oppure $a_1$
- Bob può scegliere di misurare secondo l’angolo $b_0$ oppure $b_1$
- Ogni misura produce un risultato +1 oppure -1
Si definisce quindi la quantità CHSH:
$$S = E(a_0, b_0) + E(a_0, b_1) + E(a_1, b_0) - E(a_1, b_1)$$
dove $E(a_i, b_j)$ è la correlazione tra le misure di Alice e Bob.
4.2.1. Grandezze non commutative
Nel test CHSH Alice e Bob misurano la polarizzazione dei fotoni secondo angoli diversi, ma esperienti analoghi possono essere fatti con altre grandezze fisiche, come lo spin di elettroni (anch’essi in stato entangled).
In ogni caso, l’esperimento funziona solo se le grandezze misurate sono di natura non commutativa.
In fisica classica, se vogliamo misurare due proprietà di un oggetto (ad esempio, la sua posizione e la sua velocità), possiamo farlo in qualsiasi ordine e ottenere sempre gli stessi risultati. L’ordine delle misure non conta.
In meccanica quantistica, invece, esistono coppie di grandezze fisiche per cui l’ordine delle misure è importante. Quando misuriamo prima A e poi B, otteniamo risultati diversi rispetto a quando misuriamo prima B e poi A. Matematicamente, questo si esprime dicendo che gli operatori corrispondenti non commutano:
$$\hat{A}\hat{B} \neq \hat{B}\hat{A}$$
Gli esempi più famosi di grandezze non commutative sono:
- Posizione e quantità di moto: formulazione classica del principio di indeterminazione
- Componenti dello spin lungo assi diversi: misurare lo spin lungo l’asse x e poi lungo l’asse y dà risultati diversi rispetto all’ordine inverso
- Polarizzazione del fotone secondo angoli diversi: proprio quello che misuriamo nel test CHSH
Nel nostro esperimento, quando Alice misura la polarizzazione secondo l’angolo $a_0 = 0°$ e Bob secondo $b_0 = 45°$, stanno misurando grandezze non commutative perché associate allo stesso sistema entangled.

Fonte: wikipedia
Secondo la meccanica quantistica “ortodossa”, possiamo riassumere che:
- Non possiamo conoscere simultaneamente entrambe le polarizzazioni con certezza assoluta
- La prima misura influenza la seconda: se Alice misura prima, il risultato di Bob sarà influenzato dal collasso della funzione d’onda causato dalla misura di Alice
- Non esistono “valori preesistenti” per entrambe le polarizzazioni: le proprietà si manifestano solo al momento della misura
Di converso, le teorie a variabili nascoste assumono che ogni particella porti con sé un “istruzione nascosta” che predetermina il risultato per ogni possibile angolo di misura. Ma se le grandezze non commutano, non possono esistere contemporaneamente valori predeterminati per tutte le possibili misure.
Il genio di Bell fu capire che questa differenza tra il mondo classico (dove tutte le grandezze commutano) e quello quantistico (dove alcune grandezze non commutano) si traduce in una differenza misurabile nelle correlazioni statistiche su un campione di misure sufficientemente ampio.
- Secondo il realismo locale: $|S| \leq 2$
- Secondo la meccanica quantistica: $|S|$ può arrivare fino a $2\sqrt{2} \approx 2.828$
Ma perché questi limiti? Cerchiamo di capirlo con un’analogia intuitiva.
4.2.1.1. Il ragionamento del realismo locale (il limite di 2)
Immaginiamo che ogni coppia di particelle entangled porti con sé un “foglietto di istruzioni” nascosto che predetermina il risultato per ogni possibile angolo di misura. Questo foglietto contiene 4 valori predeterminati:
- $A_0$: risultato di Alice se misura secondo $a_0$ (può essere +1 o -1)
- $A_1$: risultato di Alice se misura secondo $a_1$ (può essere +1 o -1)
- $B_0$: risultato di Bob se misura secondo $b_0$ (può essere +1 o -1)
- $B_1$: risultato di Bob se misura secondo $b_1$ (può essere +1 o -1)
Per ogni singola coppia di particelle, possiamo calcolare:
$$S_{\text{singola}} = A_0 B_0 + A_0 B_1 + A_1 B_0 - A_1 B_1$$
Facciamo un esempio concreto. Supponiamo che una particolare coppia abbia:
- $A_0 = +1$, $A_1 = -1$, $B_0 = +1$, $B_1 = +1$
Allora: $$S = (+1)(+1) + (+1)(+1) + (-1)(+1) - (-1)(+1) = 1 + 1 - 1 + 1 = 2$$
Proviamo un’altra combinazione:
- $A_0 = +1$, $A_1 = +1$, $B_0 = +1$, $B_1 = -1$
$$S = (+1)(+1) + (+1)(-1) + (+1)(+1) - (+1)(-1) = 1 - 1 + 1 + 1 = 2$$
Possiamo riscrivere $S$ come: $$S = A_0(B_0 + B_1) + A_1(B_0 - B_1)$$
Ora osserviamo che:
- Se $B_0 = B_1$, allora $(B_0 + B_1) = \pm 2$ e $(B_0 - B_1) = 0$, quindi $S = \pm 2A_0$, cioè $|S| = 2$
- Se $B_0 = -B_1$, allora $(B_0 + B_1) = 0$ e $(B_0 - B_1) = \pm 2$, quindi $S = \pm 2A_1$, cioè $|S| = 2$
In entrambi i casi, per una singola coppia con valori predeterminati, otteniamo sempre $|S| = 2$
Quando facciamo molte misure e calcoliamo la media delle correlazioni $E(a_i, b_j)$, stiamo mediando su tutte le possibili combinazioni di istruzioni nascoste. Ma siccome ogni singola coppia dà $|S| = 2$, la media non può mai superare questo valore:
$$|S| = |E(a_0, b_0) + E(a_0, b_1) + E(a_1, b_0) - E(a_1, b_1)| \leq 2$$
Questo è dunque il limite classico ed è valido per qualsiasi teoria a variabili nascoste locali.
4.2.1.2. Il ragionamento quantistico (il limite di 2√2)
Nella meccanica quantistica, invece, non esistono valori predeterminati. Le particelle sono in uno stato di Bell entangled:
$$|\Phi^+\rangle = \frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)$$
Quando Alice e Bob misurano secondo angoli diversi, le correlazioni dipendono dalla differenza angolare $\theta$ tra le loro direzioni di misura secondo la formula:
$$E(\theta) = \cos(2\theta)$$
Per gli angoli ottimali del test CHSH:
- $a_0 = 0°$, $a_1 = 45°$
- $b_0 = 22.5°$, $b_1 = -22.5°$
Con questi angoli:
- $E(a_0, b_0) = \cos(2 \times 22.5°) = \cos(45°) = \frac{1}{\sqrt{2}}$
- $E(a_0, b_1) = \cos(2 \times 22.5°) = \cos(45°) = \frac{1}{\sqrt{2}}$
- $E(a_1, b_0) = \cos(2 \times 22.5°) = \cos(45°) = \frac{1}{\sqrt{2}}$
- $E(a_1, b_1) = \cos(2 \times 67.5°) = \cos(135°) = -\frac{1}{\sqrt{2}}$
Quindi: $$S = \frac{1}{\sqrt{2}} + \frac{1}{\sqrt{2}} + \frac{1}{\sqrt{2}} - \left(-\frac{1}{\sqrt{2}}\right) = \frac{4}{\sqrt{2}} = 2\sqrt{2} \approx 2.828$$
Questo invece è il limite di Tsirelson ed è il massimo valore teorico previsto dalla meccanica quantistica.
4.2.1.3. Da dove viene questa differenza?
La differenza fondamentale è questa:
Realismo locale: assume che ogni particella abbia 4 proprietà definite contemporaneamente ($A_0, A_1, B_0, B_1$), anche se ne misuriamo solo una. Questa assunzione limita le correlazioni possibili.
Meccanica quantistica: le proprietà non esistono prima della misura. Le particelle sono in sovrapposizione e l’angolo di misura determina la “base” in cui proiettiamo lo stato. Questo permette correlazioni più forti.
Un’analogia: è come se nel caso classico ogni particella portasse con sé 4 monete già lanciate (ma coperte), mentre nel caso quantistico le monete vengono lanciate solo quando le scopriamo, e il modo in cui scopriamo quella di Alice influenza istantaneamente le probabilità per quella di Bob, anche se sono lontane.
4.3. Gli esperimenti che valsero il Nobel 2022
A partire dagli anni ‘70, una serie di esperimenti basati sull’impostazione teorica di Bell ed in particolare sul test CHSH hanno dimostrato indiscutibilmente che le disuguaglianze di Bell vengono violate esattamente secondo quanto previsto dall’impostazione teorica della meccanica quantistica, confermando che il realismo locale non può essere mantenuto:
- 1972 - John Clauser: primo esperimento che violò le disuguaglianze di Bell usando fotoni polarizzati
- 1982 - Alain Aspect: esperimenti più raffinati che eliminarono diverse possibili “scappatoie” (loopholes)
- 1998-2015 - Anton Zeilinger: esperimenti con entanglement su distanze sempre maggiori, fino a dimostrare il teletrasporto quantistico
Nel 2022, questi tre fisici ricevettero il Premio Nobel per la fisica proprio per questi esperimenti pionieristici.
4.3.1. Le “scappatoie” (loopholes) e come sono state eliminate
Nonostante i primi esperimenti di Clauser negli anni ‘70 avessero violato le disuguaglianze di Bell, rimanevano alcune possibili obiezioni tecniche che avrebbero potuto permettere a un sostenitore del realismo locale di mettere in dubbio i risultati. Queste obiezioni sono chiamate loopholes (scappatoie), e gran parte del lavoro sperimentale successivo si è concentrato nell’eliminarle una per una.
4.3.1.1. Locality Loophole
Il problema: Nei primi esperimenti, le misure di Alice e Bob non erano sufficientemente separate nello spazio-tempo. In teoria, un segnale classico (viaggiando alla velocità della luce o meno) avrebbe potuto viaggiare da un rivelatore all’altro influenzando il risultato senza che l’apparato sperimentale fosse in grado di rilevarlo.
La soluzione di Alain Aspect (1982): Aspect introdusse un sistema di switching ultraveloce degli angoli di misura:
- Gli angoli di misura venivano cambiati casualmente durante il volo dei fotoni
- Il cambiamento avveniva così velocemente che nessun segnale subluminale poteva viaggiare da un rivelatore all’altro
- Questo garantiva la separazione spazio-temporale (spacelike separation) delle misure
Tali modifiche vennero implementate di modo che l’intervallo di tempo fra produzione e detection fosse di 20 ns, mentre gli switch dei canali invertissero orientazione in modo asincrono ogni 10 ns, tenendo le varie sezioni sufficientemente lontane da garantire distanze di tipo spazio fra loro. Ciò assicura che l’evento di misura di Alice sia causalmente disconnesso da quello di Bob.
4.3.1.2. Fair Sampling Loophole
Il problema: Nessun rivelatore è perfetto al 100%. Nei primi esperimenti con fotoni, solo una piccola frazione delle coppie di particelle prodotte veniva effettivamente rivelata e misurata. Negli esperimenti di Clauser, ad esempio, l’efficienza di rivelazione era inferiore al 5%.
Questo apre una possibile obiezione: come possiamo essere sicuri che le coppie di particelle effettivamente rivelate siano un campione rappresentativo di tutte le coppie prodotte?
Un sostenitore del realismo locale potrebbe sostenere che:
- Le particelle portano con sé “istruzioni nascoste” che determinano sia il risultato della misura che la probabilità di essere rivelate
- Le particelle con certe combinazioni di istruzioni nascoste hanno una maggiore probabilità di essere rivelate rispetto ad altre
- Il campione osservato è quindi distorto (biased), e le correlazioni misurate non riflettono le vere correlazioni dell’insieme completo
In altre parole, è come se facessimo un sondaggio politico intervistando solo le persone che rispondono al telefono: il campione potrebbe non essere rappresentativo della popolazione generale.
Matematicamente, questa obiezione funziona perché la dimostrazione delle Disuguaglianze di Bell assume che tutte le coppie prodotte vengano misurate. Se possiamo misurare solo un sottoinsieme, e questo sottoinsieme non è scelto in modo casuale ma dipende dalle variabili nascoste, allora le disuguaglianze potrebbero essere violate anche in una teoria a variabili nascoste locali.
L’assunzione del campionamento equo: Per molti anni, gli esperimenti si sono basati sull’ipotesi del campionamento equo (fair sampling assumption), che assume che le particelle rivelate siano un campione casuale rappresentativo. Questa ipotesi è ragionevole dal punto di vista fisico, ma non è una dimostrazione rigorosa.
La soluzione: Per eliminare completamente questo loophole, serve raggiungere un’efficienza di rivelazione superiore a una soglia critica. Per il test CHSH, questa soglia è circa 82.8% (più precisamente, $\eta > 2/3 \approx 66.7%$ per configurazioni ottimali, ma in pratica serve un’efficienza più alta per tenere conto di altri fattori).
Questo obiettivo è stato molto difficile da raggiungere e ha richiesto decenni di progressi tecnologici:
Prima soluzione - Ioni intrappolati (anni 2000):
- Gli ioni (atomi carichi intrappolati in campi elettromagnetici) sono molto più controllabili dei fotoni
- Possono essere mantenuti in posizioni precise e misurati con efficienza molto alta (>90%)
- Esperimenti pioneristici di Rowe et al. (2001) e Matsukevich et al. (2008) raggiunsero efficienze superiori alla soglia critica
- Svantaggio: gli ioni sono difficili da separare spazialmente, rendendo più complicato chiudere simultaneamente il locality loophole
Seconda soluzione - Rivelatori superconduttori per fotoni (anni 2010):
- I rivelatori a nanofili superconduttori (SNSPDs - Superconducting Nanowire Single-Photon Detectors) hanno rivoluzionato la rivelazione di fotoni
- Operano a temperature criogeniche (vicine allo zero assoluto)
- Raggiungono efficienze del 75-98% nella banda infrarossa
- Permettono di usare fotoni (facilmente separabili su grandi distanze) mantenendo alta efficienza di rivelazione
Terza soluzione - Atomi neutri e centri di colore:
- Centri di colore in diamante: tecnica che sfrutta alcuni difetti nella struttura cristallina del diamante
- Atomi neutri intrappolati: atomi raffreddati con laser e intrappolati in pinze ottiche
4.3.1.3. Freedom-of-Choice Loophole
Il problema: Come vengono scelti gli angoli di misura per Alice e Bob? Se la scelta non è veramente casuale, ma è in qualche modo correlata con le “istruzioni nascoste” delle particelle, allora i risultati potrebbero essere spiegati con il realismo locale.
Questa obiezione può sembrare strana, ma dal punto di vista logico è valida: se l’universo è deterministico, allora anche la scelta “casuale” dell’angolo potrebbe essere predeterminata dalle stesse variabili nascoste che determinano il risultato della misura!
La soluzione: Usare sorgenti di casualità il più “libere” possibile:
Generatori quantistici di numeri casuali (QRNG): sfruttano processi quantistici intrinsecamente casuali
Luce da stelle distanti (esperimenti di Zeilinger, 2017): usarono la luce proveniente da stelle lontane migliaia di anni luce per decidere gli angoli di misura. In questo modo, le “istruzioni nascoste” avrebbero dovuto essere correlate con eventi che, almeno in prima approssimazione, possiamo assumere essere causalmente disconnessi dalle particelle entangled.
Partecipazione umana: in un esperimento chiamato “The BIG Bell Test” (2016), migliaia di persone in tutto il mondo hanno scelto gli angoli di misura tramite un videogioco online
4.3.1.4. Memory Loophole
Il problema: Se le coppie di particelle vengono misurate in sequenza e i risultati vengono accumulati nel tempo, potrebbero esserci correlazioni spurie dovute a variazioni nell’apparato sperimentale.
La soluzione: Garantire che l’apparato sia stabile nel tempo o, meglio ancora, completare l’esperimento in un tempo così breve da escludere drift strumentali.
4.3.1.5. Gli esperimenti “loophole-free”
Il vero traguardo è stato raggiunto nel 2015, quando tre gruppi indipendenti riuscirono a realizzare esperimenti che chiudevano simultaneamente tutti i principali loopholes:
Delft (Olanda) - Hensen et al.: usarono due centri di colore in diamante (difetti nella struttura cristallina) separati da 1.3 km, connessi tramite entanglement
- ✓ Locality loophole chiuso (distanza 1.3 km)
- ✓ Detection loophole chiuso (efficienza > 90%)
Vienna (Austria) - Giustina et al.: usarono fotoni entangled con rivelatori superconduttori
- ✓ Locality loophole chiuso
- ✓ Detection loophole chiuso (efficienza 75%)
Boulder, Colorado (USA) - Shalm et al.: usarono fotoni entangled separati da 185 metri
- ✓ Locality loophole chiuso
- ✓ Detection loophole chiuso (efficienza 75%)
Questi esperimenti hanno definitivamente dimostrato che non è possibile salvare il realismo locale: la natura viola veramente le disuguaglianze di Bell, e non si tratta di un artefatto sperimentale.
4.3.1.6. Rimangono ancora loopholes aperti?
Dal punto di vista pratico, no: gli esperimenti moderni sono convincenti oltre ogni ragionevole dubbio. Tuttavia, dal punto di vista filosofico, esiste ancora una “scappatoia” teorica estremamente speculativa:
Si tratta del cosiddetto Superdeterminismo: l’ipotesi che tutto nell’universo sia predeterminato dal Big Bang, incluse le scelte degli sperimentatori e i risultati delle misure. In questo scenario estremo, non esisterebbe il libero arbitrio nemmeno in senso operativo. Questa posizione è considerata dalla maggior parte dei fisici come un’ipotesi non falsificabile e quindi non scientifica.
In conclusione, il consenso scientifico è unanime: le disuguaglianze di Bell sono violate, il realismo locale è incompatibile con la natura, e gli esperimenti che lo hanno dimostrato meritavano pienamente il Premio Nobel 2022.
5. Le basi del Quantum Computing
5.1. Qubit e porte quantistiche
Nel quantum computing, l’informazione è codificata in qubit invece che in bit classici. I qubit possono essere implementati fisicamente in vari modi: spin di elettroni, fotoni polarizzati, stati energetici di atomi intrappolati, ecc.
Le operazioni sui qubit vengono eseguite attraverso porte quantistiche, che sono l’analogo delle porte logiche classiche (AND, OR, NOT, ecc.). Le porte quantistiche più comuni sono:
- Porta X: simile al NOT classico, scambia gli stati |0⟩ e |1⟩
- Porta H (Hadamard): crea una sovrapposizione equiprobabile tra |0⟩ e |1⟩
- Porta CNOT: porta a due qubit che inverte il secondo qubit se il primo è |1⟩
- Porte di rotazione: permettono di manipolare lo stato del qubit con precisione
5.2. Circuiti quantistici
Un programma quantistico è rappresentato come un circuito quantistico, una sequenza di porte quantistiche applicate a uno o più qubit. A differenza dei circuiti classici, i circuiti quantistici sono reversibili (tranne la misura, che è irreversibile).
Per creare entanglement tra due qubit, tipicamente si usa una combinazione di porta Hadamard e CNOT:
- Si applica una porta H al primo qubit per creare una sovrapposizione
- Si applica una porta CNOT usando il primo qubit come controllo e il secondo come target
Questo crea uno stato di Bell, completamente entangled.
q0: ──H──■──
│
q1: ─────X──
5.3. Piattaforme di Quantum Computing
Oggi esistono diverse piattaforme che permettono di eseguire veri e propri programmi su computer quantistici reali, tra cui ad esempio:
- IBM Quantum Experience: permette di accedere gratuitamente a computer quantistici reali di IBM
- Amazon Braket: il servizio di quantum computing di AWS
- Google Quantum AI: la piattaforma di Google per il quantum computing
- Simulatori locali: librerie come Qiskit, Cirq, Q# permettono di simulare circuiti quantistici sul proprio computer
6. Facciamo l’esperimento
6.1. Setup dell’esperimento
Possiamo riprodurre il test CHSH usando un computer quantistico reale o un simulatore. Useremo due qubit in stato entangled e misureremo le correlazioni secondo diverse configurazioni.
Ingredienti necessari:
- Una piattaforma di quantum computing (Qiskit, IBM Quantum, ecc.)
- Due qubit
- Circuiti quantistici per creare entanglement e eseguire rotazioni
6.2. Il circuito quantistico
Il circuito base per il test CHSH è il seguente:
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
# Creiamo 2 qubit e 2 bit classici per le misure
qr = QuantumRegister(2, 'q')
cr = ClassicalRegister(2, 'c')
qc = QuantumCircuit(qr, cr)
# Step 1: Creiamo uno stato di Bell entangled
qc.h(qr[0]) # Hadamard sul primo qubit
qc.cx(qr[0], qr[1]) # CNOT per creare entanglement
# Step 2: Applichiamo le rotazioni per Alice e Bob
# (gli angoli dipendono dalla configurazione che vogliamo testare)
qc.ry(theta_a, qr[0]) # Rotazione per Alice
qc.ry(theta_b, qr[1]) # Rotazione per Bob
# Step 3: Misuriamo
qc.measure(qr, cr)
Per il test CHSH ottimale, gli angoli devono essere:
- $a_0 = 0°$, $a_1 = 45°$ (per Alice)
- $b_0 = 22.5°$, $b_1 = -22.5°$ (per Bob)
6.3. Codice completo
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
import numpy as np
def create_chsh_circuit(theta_a, theta_b):
"""Crea un circuito per il test CHSH con angoli specifici"""
qc = QuantumCircuit(2, 2)
# Crea stato entangled
qc.h(0)
qc.cx(0, 1)
# Rotazioni per Alice e Bob
qc.ry(2 * theta_a, 0)
qc.ry(2 * theta_b, 1)
# Misura
qc.measure([0, 1], [0, 1])
return qc
def compute_correlation(theta_a, theta_b, shots=8192):
"""Calcola la correlazione E(a,b) per dati angoli"""
qc = create_chsh_circuit(theta_a, theta_b)
# Esegui il circuito
simulator = AerSimulator()
compiled_circuit = transpile(qc, simulator)
result = simulator.run(compiled_circuit, shots=shots).result()
counts = result.get_counts()
# Calcola la correlazione
correlation = 0
for outcome, count in counts.items():
# +1 se i bit sono uguali, -1 se diversi
parity = 1 if outcome[0] == outcome[1] else -1
correlation += parity * count / shots
return correlation
# Angoli ottimali per il test CHSH (in radianti)
a0, a1 = 0, np.pi/4
b0, b1 = np.pi/8, -np.pi/8
# Calcola le 4 correlazioni
E_a0_b0 = compute_correlation(a0, b0)
E_a0_b1 = compute_correlation(a0, b1)
E_a1_b0 = compute_correlation(a1, b0)
E_a1_b1 = compute_correlation(a1, b1)
# Calcola il valore CHSH
S = E_a0_b0 + E_a0_b1 + E_a1_b0 - E_a1_b1
print(f"E(a0, b0) = {E_a0_b0:.3f}")
print(f"E(a0, b1) = {E_a0_b1:.3f}")
print(f"E(a1, b0) = {E_a1_b0:.3f}")
print(f"E(a1, b1) = {E_a1_b1:.3f}")
print(f"\nValore CHSH S = {S:.3f}")
print(f"Limite classico: |S| ≤ 2")
print(f"Limite quantistico: |S| ≤ 2√2 ≈ 2.828")
if abs(S) > 2:
print(f"\n✓ Le disuguaglianze di Bell sono VIOLATE!")
print(f" Einstein aveva torto: il realismo locale è incompatibile con i risultati.")
else:
print(f"\n✗ Le disuguaglianze di Bell sono rispettate.")
6.4. Risultati attesi
Eseguendo il codice sopra, dovremmo ottenere un valore di $S$ vicino a $2\sqrt{2} \approx 2.828$, violando quindi le disuguaglianze di Bell.
In pratica, a causa del rumore e delle imperfezioni dei computer quantistici reali, potremmo ottenere valori leggermente inferiori, ma comunque superiori a 2, dimostrando la violazione del realismo locale.
6.5. Significato degli angoli e sfera di Bloch
Per capire veramente cosa stiamo facendo quando scegliamo questi angoli specifici nel test CHSH, possiamo introdurre uno strumento abbastanza intuitivo spesso utilizzato in meccanica quantistica: la sfera di Bloch.
6.5.1. La sfera di Bloch
La sfera di Bloch è una rappresentazione geometrica dello stato di un singolo qubit. Ogni punto sulla superficie della sfera rappresenta uno stato quantistico puro. I due poli della sfera rappresentano gli stati base:
- Polo nord: stato $|0\rangle$
- Polo sud: stato $|1\rangle$
Lo stato generale di un qubit può essere scritto come: $$|\psi\rangle = \cos(\theta/2)|0\rangle + e^{i\phi}\sin(\theta/2)|1\rangle$$
dove:
- $\theta$ è l’angolo polare (da 0° al polo nord a 180° al polo sud)
- $\phi$ è l’angolo azimutale (rotazione attorno all’asse z)
Cosa significa “misurare secondo un angolo”?
Immaginiamo il polarizzatore come un filtro orientabile: possiamo decidere in quale direzione orientarlo per misurare la polarizzazione del fotone.
Esempio fisico con polarizzatori:
- Alice orienta il suo polarizzatore a $a_0 = 0°$ (verticale): sta chiedendo “il fotone è polarizzato verticalmente o orizzontalmente?”
- Alice orienta il suo polarizzatore a $a_1 = 45°$ (diagonale): sta chiedendo “il fotone è polarizzato a 45° o a 135°?”
Ogni angolo di orientamento del polarizzatore corrisponde a una domanda diversa che facciamo al fotone.
Nel quantum computing: Siccome i computer quantistici possono misurare solo nella base standard (chiamata base Z: $|0\rangle$ e $|1\rangle$), per misurare secondo un angolo diverso dobbiamo:
- Ruotare lo stato del qubit con l’angolo desiderato
- Misurare nella base standard
- Il risultato è equivalente ad aver misurato nella base ruotata
In pratica, nel codice usiamo la gate ry(2*θ)
prima della misura. Il fattore 2 è una convenzione matematica della sfera di Bloch (gli angoli fisici vengono raddoppiati nella rappresentazione matematica).
6.5.2. Gli angoli ottimali del test CHSH
Gli angoli ottimali per massimizzare la violazione delle disuguaglianze di Bell sono:
- Alice: $a_0 = 0°$ e $a_1 = 45°$
- Bob: $b_0 = 22.5°$ e $b_1 = -22.5°$
Questi angoli sono disposti simmetricamente e formano un pattern specifico sulla sfera di Bloch. La chiave è che:
- Le direzioni di misura di Alice ($a_0$ e $a_1$) sono separate da 45°
- Le direzioni di Bob ($b_0$ e $b_1$) sono separate da 45° (da -22.5° a +22.5°)
- $b_0 = 22.5°$ è esattamente a metà strada tra $a_0$ e $a_1$
- $b_1 = -22.5°$ è simmetrico a $b_0$ rispetto all’asse a₀
La configurazione crea una disposizione simmetrica dove:
- La differenza angolare tra $a_0$ e $b_0$ è 22.5°
- La differenza angolare tra $a_0$ e $b_1$ è 22.5° (in valore assoluto)
- La differenza angolare tra $a_1$ e $b_0$ è 22.5°
- La differenza angolare tra $a_1$ e $b_1$ è 67.5°
Questa simmetria, con tre differenze di 22.5° e una di 67.5°, massimizza le correlazioni quantistiche che violano le disuguaglianze di Bell.
6.5.3. Visualizzazione degli angoli ottimali
6.5.3.1. Versione interattiva (Plotly - per Jupyter Notebook)
Per una visualizzazione interattiva degli angoli ottimali all’interno della sfera di Bloch possiamo usare questo codice basato Plotly (ideale per Jupyter Notebook):
import numpy as np
import plotly.graph_objects as go
def angle_to_bloch_vector(theta, phi=0):
"""Converte angoli (theta, phi) in un vettore sulla sfera di Bloch"""
theta_rad = np.radians(theta)
phi_rad = np.radians(phi)
x = np.sin(theta_rad) * np.cos(phi_rad)
y = np.sin(theta_rad) * np.sin(phi_rad)
z = np.cos(theta_rad)
return x, y, z
def create_sphere_mesh():
"""Crea la mesh per la sfera di Bloch"""
u = np.linspace(0, 2 * np.pi, 50)
v = np.linspace(0, np.pi, 50)
x = np.outer(np.cos(u), np.sin(v))
y = np.outer(np.sin(u), np.sin(v))
z = np.outer(np.ones(np.size(u)), np.cos(v))
return x, y, z
def plot_interactive_bloch_sphere():
"""Crea una visualizzazione interattiva della sfera di Bloch con angoli CHSH"""
fig = go.Figure()
# Aggiungiamo la sfera di Bloch
x_sphere, y_sphere, z_sphere = create_sphere_mesh()
fig.add_trace(go.Surface(
x=x_sphere, y=y_sphere, z=z_sphere,
opacity=0.15,
colorscale=[[0, 'lightgray'], [1, 'lightgray']],
showscale=False,
hoverinfo='skip'
))
# Aggiungiamo gli assi coordinati
axis_length = 1.3
# Asse X
fig.add_trace(go.Scatter3d(
x=[-axis_length, axis_length], y=[0, 0], z=[0, 0],
mode='lines',
line=dict(color='darkgray', width=3, dash='dash'),
showlegend=False,
hoverinfo='skip'
))
fig.add_trace(go.Scatter3d(
x=[axis_length*1.05], y=[0], z=[0],
mode='text',
text=['<b>X</b>'],
textfont=dict(size=18, color='darkgray'),
showlegend=False,
hoverinfo='skip'
))
# Asse Y
fig.add_trace(go.Scatter3d(
x=[0, 0], y=[-axis_length, axis_length], z=[0, 0],
mode='lines',
line=dict(color='darkgray', width=3, dash='dash'),
showlegend=False,
hoverinfo='skip'
))
fig.add_trace(go.Scatter3d(
x=[0], y=[axis_length*1.05], z=[0],
mode='text',
text=['<b>Y</b>'],
textfont=dict(size=18, color='darkgray'),
showlegend=False,
hoverinfo='skip'
))
# Asse Z
fig.add_trace(go.Scatter3d(
x=[0, 0], y=[0, 0], z=[-axis_length, axis_length],
mode='lines',
line=dict(color='black', width=3, dash='dash'),
showlegend=False,
hoverinfo='skip'
))
# Etichette |0⟩ e |1⟩
for z_pos, label in [(axis_length*1.05, '<b>|0⟩</b>'), (-axis_length*1.05, '<b>|1⟩</b>')]:
fig.add_trace(go.Scatter3d(
x=[0], y=[0], z=[z_pos],
mode='text',
text=[label],
textfont=dict(size=20, color='black'),
showlegend=False
))
# Angoli ottimali CHSH
alice_angles = [0, 45]
bob_angles = [22.5, -22.5]
colors_alice = ['red', 'darkred']
colors_bob = ['blue', 'darkblue']
labels_alice = ['a₀ (0°)', 'a₁ (45°)']
labels_bob = ['b₀ (22.5°)', 'b₁ (-22.5°)']
# Aggiungiamo i vettori di Alice
for i, angle in enumerate(alice_angles):
x, y, z = angle_to_bloch_vector(angle, phi=0)
fig.add_trace(go.Scatter3d(
x=[0, x], y=[0, y], z=[0, z],
mode='lines+markers',
line=dict(color=colors_alice[i], width=8),
marker=dict(size=[0, 10]),
name=labels_alice[i],
hovertemplate=f'{labels_alice[i]}<extra></extra>'
))
fig.add_trace(go.Scatter3d(
x=[x*1.25], y=[y*1.25], z=[z*1.25],
mode='text',
text=[labels_alice[i]],
textfont=dict(size=14, color=colors_alice[i]),
showlegend=False
))
# Aggiungiamo i vettori di Bob
for i, angle in enumerate(bob_angles):
x, y, z = angle_to_bloch_vector(angle, phi=0)
fig.add_trace(go.Scatter3d(
x=[0, x], y=[0, y], z=[0, z],
mode='lines+markers',
line=dict(color=colors_bob[i], width=8),
marker=dict(size=[0, 10]),
name=labels_bob[i],
hovertemplate=f'{labels_bob[i]}<extra></extra>'
))
fig.add_trace(go.Scatter3d(
x=[x*1.25], y=[y*1.25], z=[z*1.25],
mode='text',
text=[labels_bob[i]],
textfont=dict(size=14, color=colors_bob[i]),
showlegend=False
))
# Layout
fig.update_layout(
title='Sfera di Bloch Interattiva: Angoli Ottimali CHSH<br>' +
'<sub>Ruota con il mouse • Zoom con la rotellina • Pan con Shift+drag</sub>',
scene=dict(
xaxis=dict(showbackground=False, showticklabels=False, title=''),
yaxis=dict(showbackground=False, showticklabels=False, title=''),
zaxis=dict(showbackground=False, showticklabels=False, title=''),
aspectmode='cube',
camera=dict(eye=dict(x=1.5, y=1.5, z=1.2))
),
height=700,
showlegend=True
)
return fig
# Creiamo e mostra il grafico interattivo
fig = plot_interactive_bloch_sphere()
fig.show()
# fig.write_html("bloch_sphere_interactive.html")
6.5.4. Interpretazione dei grafici
Sfera di Bloch (3D e 2D): Disposizione geometrica degli angoli di misura. Si nota la simmetria della configurazione: $b_0$ (22.5°) è posizionato esattamente a metà strada tra $a_0$ (0°) e $a_1$ (45°), mentre $b_1$ (-22.5°) è simmetrico rispetto all’origine.
- Correlazione vs Differenza Angolare: Mostra come la correlazione quantistica $E(\theta) = \cos(2\theta)$ dipenda dalla differenza angolare. Gli angoli CHSH sono scelti per ottenere valori specifici di correlazione che massimizzano S.
- Ottimizzazione del valore CHSH: Dimostra visivamente che la configurazione con $a_1 = 45°$ (e conseguentemente $b_0 = 22.5°$, $b_1 = -22.5°$) massimizza effettivamente la violazione delle disuguaglianze di Bell.
Nell’esperimento CHSH le direzioni di misura sono disposte simmetricamente in modo da sfruttare al massimo le correlazioni quantistiche permesse dall’entanglement, superando il limite classico di 2 e raggiungendo il limite di Tsirelson di $2\sqrt{2}$.
6.6. Cosa significa questo risultato?
La violazione delle disuguaglianze di Bell ci dice che:
Non può esistere una descrizione del mondo fisico che soddisfi i principi di località e realismo.
In altre parole:
- O esistono “azioni a distanza” che permettono alle particelle entangled di “comunicare” istantaneamente (violazione della località)
- O le proprietà fisiche non esistono prima della misura, ma vengono create dall’atto stesso dell’osservazione (violazione del realismo)
La maggior parte dei fisici oggi accetta l’interpretazione secondo cui è il realismo ad essere violato, mentre la località è preservata (anche se in modo sottile).
6.7. Altri esperimenti interattivi
Ora che abbiamo visto il test CHSH di base, esploriamo alcuni esperimenti aggiuntivi che ci aiutano a comprendere meglio la violazione delle disuguaglianze di Bell e le differenze tra meccanica quantistica e realismo locale.
6.7.1. Variazione del valore CHSH con gli angoli
Questo esperimento mostra come il valore CHSH varia al variare dell’angolo $a_1$ di Alice, mantenendo fissi gli altri angoli. Ci permette di vedere graficamente perché 45° è l’angolo ottimale.
import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
def compute_chsh_value(a0, a1, b0, b1, shots=8192):
"""Calcola il valore CHSH per una data configurazione di angoli"""
def compute_correlation(theta_a, theta_b):
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.ry(2 * theta_a, 0)
qc.ry(2 * theta_b, 1)
qc.measure([0, 1], [0, 1])
simulator = AerSimulator()
compiled_circuit = transpile(qc, simulator)
result = simulator.run(compiled_circuit, shots=shots).result()
counts = result.get_counts()
correlation = 0
for outcome, count in counts.items():
parity = 1 if outcome[0] == outcome[1] else -1
correlation += parity * count / shots
return correlation
E_a0_b0 = compute_correlation(a0, b0)
E_a0_b1 = compute_correlation(a0, b1)
E_a1_b0 = compute_correlation(a1, b0)
E_a1_b1 = compute_correlation(a1, b1)
S = E_a0_b0 + E_a0_b1 + E_a1_b0 - E_a1_b1
return S, (E_a0_b0, E_a0_b1, E_a1_b0, E_a1_b1)
# Varia l'angolo a1 da 0 a 90 gradi
a1_values = np.linspace(0, np.pi/2, 20)
s_values_quantum = []
s_values_classical = 2 * np.ones_like(a1_values) # Limite classico
print("Calcolando valori CHSH per diversi angoli...")
for a1 in a1_values:
# Angoli fissi
a0 = 0
b0 = a1 / 2 # Ottimale: a metà strada tra a0 e a1
b1 = -a1 / 2 # Simmetrico rispetto a a0
S, _ = compute_chsh_value(a0, a1, b0, b1, shots=4096)
s_values_quantum.append(S)
print(f"a1 = {np.degrees(a1):.1f}°, S = {S:.3f}")
# Grafico
plt.figure(figsize=(12, 6))
plt.plot(np.degrees(a1_values), s_values_quantum, 'b-o',
linewidth=2, markersize=6, label='Simulazione Quantistica')
plt.axhline(y=2, color='r', linestyle='--', linewidth=2,
label='Limite Classico (|S| ≤ 2)')
plt.axhline(y=2*np.sqrt(2), color='g', linestyle='--', linewidth=2,
label=f'Limite di Tsirelson (2√2 ≈ {2*np.sqrt(2):.3f})')
plt.axvline(x=45, color='orange', linestyle=':', linewidth=2,
label='Angolo ottimale (45°)')
plt.xlabel('Angolo a₁ (gradi)', fontsize=12)
plt.ylabel('Valore CHSH (S)', fontsize=12)
plt.title('Violazione delle Disuguaglianze di Bell al Variare dell\'Angolo',
fontsize=14, fontweight='bold')
plt.legend(fontsize=10)
plt.grid(True, alpha=0.3)
plt.ylim([0, 3])
plt.tight_layout()
plt.savefig('chsh_angle_variation.png', dpi=300, bbox_inches='tight')
plt.show()
print(f"\nMassima violazione a 45°: S ≈ {max(s_values_quantum):.3f}")
print(f"Limite teorico: 2√2 ≈ {2*np.sqrt(2):.3f}")
Risultato atteso: Il grafico mostra che la massima violazione si ottiene proprio a 45°, dove S raggiunge circa 2.828.
6.7.2. Confronto quantistico vs classico: heatmap delle correlazioni
Questo esperimento visualizza le correlazioni quantistiche e classiche come heatmap, permettendo di vedere chiaramente la differenza.
import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
def compute_quantum_correlation(theta_a, theta_b, shots=8192):
"""Calcola la correlazione quantistica per due angoli"""
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.ry(2 * theta_a, 0)
qc.ry(2 * theta_b, 1)
qc.measure([0, 1], [0, 1])
simulator = AerSimulator()
compiled_circuit = transpile(qc, simulator)
result = simulator.run(compiled_circuit, shots=shots).result()
counts = result.get_counts()
correlation = 0
for outcome, count in counts.items():
parity = 1 if outcome[0] == outcome[1] else -1
correlation += parity * count / shots
return correlation
def compute_classical_correlation(theta_diff):
"""
Correlazione classica massima possibile per una differenza angolare.
Con variabili nascoste locali, la correlazione massima è limitata.
"""
# Modello classico: correlazione lineare decrescente
return 1 - 2 * abs(theta_diff) / (np.pi/2)
# Griglia di angoli
angles = np.linspace(0, np.pi/2, 12)
angles_deg = np.degrees(angles)
# Matrici per le correlazioni
quantum_corr = np.zeros((len(angles), len(angles)))
classical_corr = np.zeros((len(angles), len(angles)))
print("Calcolando correlazioni quantistiche e classiche...")
for i, theta_a in enumerate(angles):
for j, theta_b in enumerate(angles):
# Correlazione quantistica
quantum_corr[i, j] = compute_quantum_correlation(theta_a, theta_b, shots=2048)
# Correlazione classica teorica
theta_diff = abs(theta_a - theta_b)
classical_corr[i, j] = compute_classical_correlation(theta_diff)
print(f"Progresso: {i+1}/{len(angles)}")
# Visualizzazione
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(18, 5))
# Heatmap quantistica
im1 = ax1.imshow(quantum_corr, cmap='RdBu_r', aspect='auto',
vmin=-1, vmax=1, origin='lower')
ax1.set_xlabel('Angolo Bob (gradi)', fontsize=11)
ax1.set_ylabel('Angolo Alice (gradi)', fontsize=11)
ax1.set_title('Correlazioni Quantistiche\n(Simulazione)',
fontsize=12, fontweight='bold')
ax1.set_xticks(range(len(angles_deg)))
ax1.set_yticks(range(len(angles_deg)))
ax1.set_xticklabels([f'{a:.0f}' for a in angles_deg], rotation=45)
ax1.set_yticklabels([f'{a:.0f}' for a in angles_deg])
plt.colorbar(im1, ax=ax1, label='Correlazione E(a,b)')
# Heatmap classica
im2 = ax2.imshow(classical_corr, cmap='RdBu_r', aspect='auto',
vmin=-1, vmax=1, origin='lower')
ax2.set_xlabel('Angolo Bob (gradi)', fontsize=11)
ax2.set_ylabel('Angolo Alice (gradi)', fontsize=11)
ax2.set_title('Correlazioni Classiche\n(Variabili Nascoste Locali)',
fontsize=12, fontweight='bold')
ax2.set_xticks(range(len(angles_deg)))
ax2.set_yticks(range(len(angles_deg)))
ax2.set_xticklabels([f'{a:.0f}' for a in angles_deg], rotation=45)
ax2.set_yticklabels([f'{a:.0f}' for a in angles_deg])
plt.colorbar(im2, ax=ax2, label='Correlazione E(a,b)')
# Differenza
difference = quantum_corr - classical_corr
im3 = ax3.imshow(difference, cmap='seismic', aspect='auto',
vmin=-0.5, vmax=0.5, origin='lower')
ax3.set_xlabel('Angolo Bob (gradi)', fontsize=11)
ax3.set_ylabel('Angolo Alice (gradi)', fontsize=11)
ax3.set_title('Differenza\n(Quantistica - Classica)',
fontsize=12, fontweight='bold')
ax3.set_xticks(range(len(angles_deg)))
ax3.set_yticks(range(len(angles_deg)))
ax3.set_xticklabels([f'{a:.0f}' for a in angles_deg], rotation=45)
ax3.set_yticklabels([f'{a:.0f}' for a in angles_deg])
plt.colorbar(im3, ax=ax3, label='Differenza')
plt.tight_layout()
plt.savefig('correlation_heatmaps.png', dpi=300, bbox_inches='tight')
plt.show()
print("\nLe zone rosse nella mappa delle differenze mostrano dove")
print("le correlazioni quantistiche superano quelle classiche!")
Interpretazione: Le heatmap mostrano come le correlazioni quantistiche (che seguono $\cos(2\theta)$) differiscano significativamente da quelle classiche, soprattutto per angoli intermedi.
6.7.3. Esplorazione interattiva dei parametri CHSH
Questo esperimento crea un’analisi parametrica completa dello spazio degli angoli CHSH.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
def compute_single_correlation(theta_a, theta_b, shots=4096):
"""Calcola una singola correlazione"""
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.ry(2 * theta_a, 0)
qc.ry(2 * theta_b, 1)
qc.measure([0, 1], [0, 1])
simulator = AerSimulator()
compiled_circuit = transpile(qc, simulator)
result = simulator.run(compiled_circuit, shots=shots).result()
counts = result.get_counts()
correlation = 0
for outcome, count in counts.items():
parity = 1 if outcome[0] == outcome[1] else -1
correlation += parity * count / shots
return correlation
# Analisi 2D: variazione simultanea di a1 e b0
a1_range = np.linspace(0, np.pi/2, 25)
b0_range = np.linspace(0, np.pi/2, 25)
S_matrix = np.zeros((len(a1_range), len(b0_range)))
print("Esplorazione dello spazio dei parametri CHSH...")
print("Questo può richiedere qualche minuto...\n")
for i, a1 in enumerate(a1_range):
for j, b0 in enumerate(b0_range):
a0 = 0
b1 = -b0
E_a0_b0 = compute_single_correlation(a0, b0, shots=2048)
E_a0_b1 = compute_single_correlation(a0, b1, shots=2048)
E_a1_b0 = compute_single_correlation(a1, b0, shots=2048)
E_a1_b1 = compute_single_correlation(a1, b1, shots=2048)
S = E_a0_b0 + E_a0_b1 + E_a1_b0 - E_a1_b1
S_matrix[i, j] = S
if (i + 1) % 5 == 0:
print(f"Progresso: {i+1}/{len(a1_range)}")
# Visualizzazione 3D
fig = plt.figure(figsize=(16, 6))
# Subplot 1: Heatmap 2D
ax1 = fig.add_subplot(121)
im = ax1.contourf(np.degrees(b0_range), np.degrees(a1_range), S_matrix,
levels=20, cmap='RdYlGn')
ax1.contour(np.degrees(b0_range), np.degrees(a1_range), S_matrix,
levels=[2.0], colors='red', linewidths=3,
linestyles='--')
ax1.plot(22.5, 45, 'b*', markersize=20, label='Configurazione ottimale')
ax1.set_xlabel('Angolo b₀ (gradi)', fontsize=12)
ax1.set_ylabel('Angolo a₁ (gradi)', fontsize=12)
ax1.set_title('Valore CHSH nello Spazio dei Parametri',
fontsize=13, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
cbar = plt.colorbar(im, ax=ax1, label='S')
cbar.ax.axhline(y=2, color='red', linewidth=2, linestyle='--')
cbar.ax.text(1.5, 2, 'Limite classico', rotation=0, va='center', fontsize=9)
# Subplot 2: Superficie 3D
ax2 = fig.add_subplot(122, projection='3d')
B0, A1 = np.meshgrid(np.degrees(b0_range), np.degrees(a1_range))
surf = ax2.plot_surface(B0, A1, S_matrix, cmap='RdYlGn',
alpha=0.9, edgecolor='none')
# Piano del limite classico
xx, yy = np.meshgrid(np.degrees(b0_range), np.degrees(a1_range))
zz = 2 * np.ones_like(xx)
ax2.plot_surface(xx, yy, zz, alpha=0.3, color='red')
ax2.set_xlabel('Angolo b₀ (gradi)', fontsize=10)
ax2.set_ylabel('Angolo a₁ (gradi)', fontsize=10)
ax2.set_zlabel('Valore CHSH (S)', fontsize=10)
ax2.set_title('Superficie CHSH 3D', fontsize=13, fontweight='bold')
ax2.view_init(elev=25, azim=45)
fig.colorbar(surf, ax=ax2, shrink=0.5, aspect=5, label='S')
plt.tight_layout()
plt.savefig('chsh_parameter_space.png', dpi=300, bbox_inches='tight')
plt.show()
# Trova il massimo
max_idx = np.unravel_index(np.argmax(S_matrix), S_matrix.shape)
max_a1 = np.degrees(a1_range[max_idx[0]])
max_b0 = np.degrees(b0_range[max_idx[1]])
max_S = S_matrix[max_idx]
print(f"\n{'='*50}")
print(f"Configurazione ottimale trovata:")
print(f" a₁ = {max_a1:.1f}°")
print(f" b₀ = {max_b0:.1f}°")
print(f" S = {max_S:.3f}")
print(f"\nValore teorico ottimale: a₁=45°, b₀=22.5°, S=2√2≈2.828")
print(f"{'='*50}")
Risultato: Questo grafico mostra la “montagna” del valore CHSH nello spazio dei parametri, con il picco proprio alla configurazione ottimale (45°, 22.5°).
6.7.4. Simulazione con rumore realistico
Nell’ultimo esperimento, aggiungiamo rumore per simulare le imperfezioni dei computer quantistici reali.
import numpy as np
import matplotlib.pyplot as plt
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel, depolarizing_error, thermal_relaxation_error
def create_noisy_simulator(error_rate=0.01, t1=50, t2=70):
"""
Crea un simulatore con rumore realistico.
Args:
error_rate: probabilità di errore per gate (depolarizing)
t1: tempo di rilassamento T1 (microseconds)
t2: tempo di decoerenza T2 (microseconds)
"""
noise_model = NoiseModel()
# Errore di depolarizzazione sui gate
error_gate1 = depolarizing_error(error_rate, 1)
error_gate2 = depolarizing_error(error_rate * 2, 2)
# Aggiungi errori ai gate
noise_model.add_all_qubit_quantum_error(error_gate1, ['h', 'ry'])
noise_model.add_all_qubit_quantum_error(error_gate2, ['cx'])
# Errore di rilassamento termico
# gate_times = {'h': 50, 'ry': 50, 'cx': 200, 'measure': 1000} # in nanoseconds
# thermal_error = thermal_relaxation_error(t1*1000, t2*1000, gate_times['cx'])
# noise_model.add_all_qubit_quantum_error(thermal_error, ['cx'])
return noise_model
def run_chsh_with_noise(error_rate, shots=8192):
"""Esegue il test CHSH con un dato livello di rumore"""
noise_model = create_noisy_simulator(error_rate=error_rate)
simulator = AerSimulator(noise_model=noise_model)
# Angoli ottimali
a0, a1 = 0, np.pi/4
b0, b1 = np.pi/8, -np.pi/8
def compute_correlation(theta_a, theta_b):
qc = QuantumCircuit(2, 2)
qc.h(0)
qc.cx(0, 1)
qc.ry(2 * theta_a, 0)
qc.ry(2 * theta_b, 1)
qc.measure([0, 1], [0, 1])
compiled_circuit = transpile(qc, simulator)
result = simulator.run(compiled_circuit, shots=shots).result()
counts = result.get_counts()
correlation = 0
for outcome, count in counts.items():
parity = 1 if outcome[0] == outcome[1] else -1
correlation += parity * count / shots
return correlation
E_a0_b0 = compute_correlation(a0, b0)
E_a0_b1 = compute_correlation(a0, b1)
E_a1_b0 = compute_correlation(a1, b0)
E_a1_b1 = compute_correlation(a1, b1)
S = E_a0_b0 + E_a0_b1 + E_a1_b0 - E_a1_b1
return S, (E_a0_b0, E_a0_b1, E_a1_b0, E_a1_b1)
# Test con diversi livelli di rumore
error_rates = np.linspace(0, 0.10, 20)
s_values_noisy = []
s_std = []
print("Simulazione con rumore realistico...")
print("Questo simula le imperfezioni dei computer quantistici reali.\n")
for error_rate in error_rates:
# Esegui multiple volte per stimare la varianza
s_trials = []
for _ in range(5):
S, _ = run_chsh_with_noise(error_rate, shots=4096)
s_trials.append(S)
s_values_noisy.append(np.mean(s_trials))
s_std.append(np.std(s_trials))
print(f"Error rate: {error_rate*100:.1f}% → S = {np.mean(s_trials):.3f} ± {np.std(s_trials):.3f}")
# Visualizzazione
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
# Subplot 1: S vs Error Rate
s_values_noisy = np.array(s_values_noisy)
s_std = np.array(s_std)
ax1.errorbar(error_rates * 100, s_values_noisy, yerr=s_std,
fmt='o-', linewidth=2, markersize=8, capsize=5,
color='blue', label='Simulazione con rumore')
ax1.axhline(y=2, color='red', linestyle='--', linewidth=2,
label='Limite classico (S=2)')
ax1.axhline(y=2*np.sqrt(2), color='green', linestyle='--', linewidth=2,
label=f'Limite ideale (S=2√2≈{2*np.sqrt(2):.3f})')
ax1.fill_between(error_rates * 100, 2, s_values_noisy,
where=(s_values_noisy > 2), alpha=0.3, color='green',
label='Zona di violazione')
ax1.set_xlabel('Tasso di errore per gate (%)', fontsize=12)
ax1.set_ylabel('Valore CHSH (S)', fontsize=12)
ax1.set_title('Effetto del Rumore sulla Violazione di Bell',
fontsize=13, fontweight='bold')
ax1.legend(fontsize=10)
ax1.grid(True, alpha=0.3)
ax1.set_ylim([1.5, 3])
# Subplot 2: Violazione vs Error Rate
violation = s_values_noisy - 2
ax2.bar(error_rates * 100, violation, width=0.25,
color=['green' if v > 0 else 'red' for v in violation],
alpha=0.7, edgecolor='black')
ax2.axhline(y=0, color='black', linestyle='-', linewidth=1)
ax2.set_xlabel('Tasso di errore per gate (%)', fontsize=12)
ax2.set_ylabel('Violazione (S - 2)', fontsize=12)
ax2.set_title('Margine di Violazione delle Disuguaglianze di Bell',
fontsize=13, fontweight='bold')
ax2.grid(True, alpha=0.3, axis='y')
# Trova il punto critico dove S scende sotto 2
critical_idx = np.where(s_values_noisy < 2)[0]
if len(critical_idx) > 0:
critical_error = error_rates[critical_idx[0]] * 100
ax2.axvline(x=critical_error, color='red', linestyle=':', linewidth=2)
ax2.text(critical_error, ax2.get_ylim()[1] * 0.8,
f'Punto critico\n~{critical_error:.1f}%',
ha='center', fontsize=10, bbox=dict(boxstyle='round',
facecolor='wheat', alpha=0.5))
plt.tight_layout()
plt.savefig('chsh_with_noise.png', dpi=300, bbox_inches='tight')
plt.show()
print(f"\n{'='*60}")
print("RISULTATI:")
print(f" - Con rumore 0%: S ≈ {s_values_noisy[0]:.3f} (ideale)")
print(f" - Con rumore 1%: S ≈ {s_values_noisy[int(len(s_values_noisy)*0.2)]:.3f}")
print(f" - Con rumore 3%: S ≈ {s_values_noisy[int(len(s_values_noisy)*0.6)]:.3f}")
if len(critical_idx) > 0:
print(f" - Limite critico: ~{critical_error:.1f}% (S scende sotto 2)")
else:
print(f" - La violazione persiste fino a {error_rates[-1]*100:.1f}%")
print(f"{'='*60}")
Interpretazione: Questo grafico mostra quanto siano delicati i computer quantistici. Anche piccoli errori riducono la violazione di Bell, ma fortunatamente serve un errore abbastanza alto (>8%) prima che la violazione scompaia completamente.
7. Conclusioni e riflessioni filosofiche
7.1. Chi aveva ragione?
Il dibattito Einstein-Bohr è stato uno dei più affascinanti della storia della fisica. Da un punto di vista puramente scientifico, possiamo dire che Bohr aveva ragione: la meccanica quantistica è una teoria completa e corretta, e i fenomeni quantistici non possono essere spiegati con teorie a variabili nascoste locali.
Il destino di Einstein è stato per certi versi paradossale: pur essendo riconosciuto come uno dei più grandi fisici di tutti i tempi, è stato spesso incompreso ed isolato della comunità scientifica “mainstream”, sia nelle fasi iniziali della sua carriera (con la relatività) sia in quelle finali (con la meccanica quantistica).
In ogni caso, credo che la formulazione stessa del problema EPR, che poi ha portato agli studi di Bell, gli esperimenti di Aspect e di molti altri, sia stato anche stavolta un contributo enorme alla fisica e al sapere umano.
7.2. La natura della realtà
Dal punto di vista filosofico, gli esperimenti di Bell ci insegnano qualcosa di profondo sulla natura della realtà:
- Il mondo non è fatto di “cose” con proprietà definite che esistono indipendentemente dall’osservazione
- La realtà emerge dall’interazione tra sistema osservato e apparato di misura
- Non possiamo separare completamente l’osservatore dall’osservato
Questo non significa che la realtà “non esiste” o che sia puramente soggettiva, ma piuttosto che la nostra intuizione classica su cosa significhi “esistere” deve essere profondamente rivista alla luce dei fenomeni quantistici.
In un certo senso, quella che noi identifichiamo come “realtà” è un costrutto emergente e non prescinde dalle nostre interazioni con il mondo.