INFORMATICA - QUANTUM COMPUTING - REGISTER

Febbraio 2024

1. I qbit in forma vettoriale e i registri

Senza scendere nei dettagli matematici alla base della fisica quantistica andiamo a considerare 1 qbit in forma vettoriale, considereremo la cosa, informaticamente e ingegneristicamente come una sorta di definizione. Dopotutto, al momento non sono necessari ulteriori approfondimenti per lo scopo di questa pagina, ossia vedere cos'è un registro quantistico e come può essere usato in confronto ai registri di memoria dei classici calcolatori digitali (così potremo anche vedere l'esempio dell'algoritmo quantistico per la somma di due numeri binari).

In particolare il quantum-zero |0> è il seguente vettore colonna:





mentre il quantum-one |1> è il seguente altro vettore:





Definiamo quindi registro di memoria quantistico a 1 qbit il sistema in grado di memorizzare e gestire (quale suo stato quantistico) il generico vettore |v> dato dalla combinazione lineare di quantum-zero e quantum-one:

|v> = a0|0> + a1|1>

dove a0 e a1 sono numeri complessi del tipo x+iy. Il vettore |v>, stato quantistico del registro e quindi suo contenuto di memoria, si può rappresentare in forma vettoriale come segue:






Dovrebbe balzare agli occhi la prima differenza con un registro tradizionale ad un bit. Infatti, alla domanda quanti stati ammette una cella di memoria digitale (un registro ad un bit classico), la risposta è 2 (identificati in 0 ed 1). In questo caso, invece, il numero di stati rappresentabili da un registro quantistico è per sua natura infinito (ossia tutti i valori che possono assumere i numeri reali x0,x1,y0 e y1).

Proviamo ora a considerare un registro quantistico a 2 qbit partendo da quello a 1 qbit. Dovremo fare ricorso ad un'operazione particolare tra vettori/matrici detta prodotto tensoriale. Il nome è altisonante ma l'operazione in questione è semplice da capire e vedremo qui sotto degli esempi. Naturalmente trattando 2 qbit potremo avere: |00>, |01>, |10> e |11>, ora la questione è solo capire quale relazione c'è tra ognuno di essi e quantum-zero/quantum-one. Partiamo con |00>:






Andando avanti per i rimanenti:






Definiamo quindi registro di memoria quantistico a 2 qbit il sistema in grado di memorizzare e gestire (quale suo stato quantistico) il generico vettore |v> dato dalla combinazione lineare:

|v> = a00|00> + a01|01> + a10|10> + a11|11>

dove a00, a01, a10 e a11 sono numeri complessi. Il vettore |v>, stato quantistico del registro e quindi suo contenuto di memoria, si può rappresentare in forma vettoriale come segue:









Si può procedere con un metodo analogo a definire un registro quantistico di memoria a 3 qbit, poi a 4 qbit, ecc. fino a n qbit.

Tutti i registri quantistici sono predisposti per gestire infiniti valori per i parametri "a" complessi nella combinazione lineare. La differenza è che per 1 qbit i parametri (come visto) sono solo 2, per 2 qbit i parametri (come visto) sono 4, per 3 qbit i parametri sono 8 (provate a fare il prodotto tensoriale da soli...), per n qbit i parametri sono 2n. Questo significa che (come anticipato nella pagina di premessa sul quantum computing) al crescere dei qbit la capacità di memorizzazione dei registri quantistici cresce esponenzialmente (secondo una potenza di 2).

2. Un esercizio: la somma di 2 numeri

Sempre facendo riferimento alle risorse IBM (https://quantum-computing.ibm.com) proviamo a impostare dei registri di alcuni qbit e realizziamo una somma. Per assurdo vedremo che innanzitutto la "costruzione" del software è molto complessa e naturalmente vi invito a trovare soluzioni alternative alla mia. Ma il problema fondamentale, piuttosto comune purtroppo nel quantum computing, sarà interagire con l'algoritmo quantistico cercando il calcolo stesso della somma.

















Le due porte di Hadamard [H] impostano il registro q[0] e il registro q[1] al valore:
|v> = (0.5)1/2(|0>+|1>)
e quindi, come visto nella pagina del primo programma elementare affrontato, rendono equiprobabili il verificarsi di |0> o |1> ad una eventuale misura (dal punto di vista classico/macroscopico è come se randomizzasse i registri ma questo ricordiamo per favore che è solo un esempio per capire la sovrapposizione degli stati |0> e |1>, tecnicamente non è corretto!). I due ulteriori registri q[2] e q[3], impostati inizialmente a |0>, sono i portatori del risultato della somma binaria di q[0] e q[1]. Le porte [CNOT] impiegate [+] sono ad un controllo (se il registro di controllo è |1> la porta inverte altrimenti non fa nulla) e a due controlli (se tutti e due i registri di controllo sono a |1> la porta inverte altrimenti non fa nulla).

Sul funzionamento dell'algoritmo:

(i) se le due [H] rilasciano entrambi |1> tutte le [CNOT] si attivano e quindi il risultato a destra sarebbe 10 (ossia 2 in decimale = 1+1) (q[2] = 0 e q[3] = 1);

(ii) se le due [H] rilasciano entrambi |0> nessuna delle [CNOT] si attiva per cui il risultato a destra sarebbe 00 (ossia 0 in decimale = 0+0) (q[2] = 0 e q[3] = 0);

(iii) se la [H] su q[0] rilascia |1> e l'altra porta [H] rilascia |0> il risultato a destra sarebbe 01 (ossia 1 in decimale = 1+0) (q[2] = 1 e q[3] = 0);

(iv) se la [H] su q[0] rilascia |0> e l'altra porta [H] rilascia |1> il risultato a destra sarebbe di nuovo 01 (ossia 1 in decimale = 1+0) (q[2] = 1 e q[3] = 0).

Mandando in esecuzione il software appena descritto, il composer di IBM riporta il seguente dettaglio delle probabilità dei registri d'uscita a destra:

Come si può vedere l'uscita è equiprobabile (25%) tra le seguenti stringhe:

|0000>, |0101>, |0110> e |1011>

che rappresentano rispettivamente (in binario):

0+0=00, 0+1=01, 1+0=01 e 1+1=10

ossia il circuito (il software) realizzato si comporta come un oracolo che quando viene interrogato svolge una delle possibili somme per poi produrne il risultato. Ma come si può comandarlo di svolgere una specifica somma? Semplicemente non si può. Come ogni oracolo si deve continuare a interrogarlo (ossia misurare i risultati dopo un'esecuzione) fino a quando non propone proprio la somma che cercavamo... Lo so che sembra strano ma è quantistico!!! In definitiva, svolgere la somma con un circuito quantistico non è solo difficile ma anche poco pratico, inoltre è assolutamente inefficiente! Sebbene il circuito al suo interno faccia tutte le somme praticamente in simultanea (difficile questo sia da capire che da accettare) ad un utente esterno macroscopico che misura i risultati appare che l'oracolo prova coppie di bit (praticamente) a caso e quindi bisogna interrogarlo una serie di volte prima di avere il risultato cercato. Eppure, qualsiasi sommatore digitale classico svolge l'operazione citata in un solo passo; in questo caso, invece, essendo fortunati il risultato può arrivare in un passo, ma essendo sfortunati potrebbe arrivare anche dopo molti passi.

3. Conclusioni di oggi

I computer quantistici non sanno fare le somme come i computer classici... non è vero, diciamo che ci sono problemi nel misurarne i risultati (nel vederli e capirli). Poi, romanticamente, vorrei dire che l'alta complessità dei computer quantistici non è fatta per operazioni come la somma, più in generale essi non sono fatti per svolgere attività deterministiche strutturalmente semplici e seriali (adorate invece dai computer classici). Per assurdo, invece, in una pagina successiva a questa vedremo che sono straordinariamente validi nello svolgere attività estremamente parallele e distribuite nonchè di natura probabilistica. Non a caso gli elaboratori quantistici promettono molto bene per le reti neurali e anche l'attuale machine learning.

Ma dopotutto: nessuno di noi ricorda quanto è stato complicato imparare a fare somme, differenze moltiplicazioni, ecc. da piccoli? Eppure il cervello umano ha una complessità enorme e sebbene riesca sin da piccino a individuare dettagli minimi in una foto e mutuarne concetti (cosa complicatissima) trova difficile fare somme e usare cifre numeriche... Si, il nostro cervello ha sicuramente natura quantistica.