Il controllo delle attuali infrastrutture informatizzate è tipicamente affidato ad una catena di strumenti. Gli anelli della catena permettono di controllare l’hardware — la parte più fisica dell’infrastruttura –, per mezzo di descrizioni linguistiche, tipicamente individuate col termine: “linguaggi di programmazione”; ciascuna descrizione linguistica è adatta a descrivere cosa debba essere eseguito durante una specifica fase per il funzionamento globale di una infrastruttura informatizzata.
Ad esempio, molto ad alto livello, un browser è un macro-anello in una catena che si avvale di un insieme di linguaggi: alcuni sono adatti alla rappresentazione delle pagine, altri al loro confezionamento, affinché le pagine possano essere trasmesse tra due nodi Internet. La trasmissione, però, è guidata da altro software orientato alla descrizione di quanto è necessario per controllare l’hardware che invia i segnali fisici lungo un canale fisico.
La catena di controllo oggi disponibile per l’uso di hardware quantistico – esso esegue computazioni in grado di sfruttare i fenomeni della meccanica quantistica, col fine di incrementare le prestazioni delle attuali infrastrutture informatizzate -, è lungi dall’essere maturo quanto le attuali tool-chain (le catene cui accennavamo sopra) che legano applicazioni software e hardware che implementa tali applicazioni.
In questo lavoro discutiamo le caratteristiche di possibili anelli in grado di costituire una catena che leghi applicazioni software a hardware quantistico.
A tal fine, con lo scopo di suggerire che: “occorre saper fare cose diverse da quanto già sappiamo fare, se vogliamo sfruttare la computazione quantistica”, cominciamo con l’illustrare le intuizioni alla base del “Teletrasporto quantistico”: è un algoritmo rilevante in grado di sfruttare le peculiarità della meccanica quantistica per trasportare informazione tra due luoghi, soddisfacendo specifici vincoli di riservatezza.
Quindi, forniamo una panoramica di alcuni degli anelli che servono per passare dalla descrizione del teletrasporto alla sua implementazione. Un primo insieme di anelli sono i linguaggi di programmazione quantistici attualmente disponibili. Un secondo insieme di anelli è costituito dai programmi in grado di trasformare, ad esempio, la descrizione ad alto livello del “Teletrasporto quantistico” in istruzioni che un hardware quantistico è in grado di eseguire, i cosiddetti compilatori.
Concludiamo con una brevissima analisi di ciò che ancora manca all’intera catena perché le macchine quantistiche diventino utilizzabili con un grado di difficoltà paragonabile a quello che affrontiamo nell’usare l’hardware attualmente ritenuto standard.
Algoritmi quantistici e Teletrasporto quantistico
Riassumere in poche righe le peculiarità degli algoritmi quantistici è molto difficile. Preferiamo utilizzare un esempio concreto e piuttosto completo: l’algoritmo per il teletrasporto quantistico, ideato da Bennet et al. nel 1993.[1]
Teletrasporto quantistico (Teleportation)
Il “teletrasporto quantistico” permette di trasmettere molto efficientemente informazioni “impacchettate” in uno stato quantistico, tipicamente identificato col nome “qubit”. La parola “impacchettare” evoca l’idea che un qubit può condensare in un unico “numero” un insieme di informazioni.
Con l’attuale tecnologia per la trasmissione dati che, per comodità diciamo essere “classica”, siamo in grado di trasmettere un insieme di informazioni o in sequenza, elemento per elemento, su un singolo canale, o in parallelo, su più canali paralleli. Invece, grazie al “teletrasporto quantistico” la trasmissione dello stesso insieme di informazioni può essere condensata, come vedremo in seguito, in un insieme molto più contenuto rispetto a quello tradizionale. Per questo, per contrapposizione, diciamo che il “teletrasporto quantistico” non fa parte della tecnologia “classica”; il motivo è che sfrutta superposition e entanglement, concetti di cui diamo conto qui di seguito a livello molto intuitivo.
Impacchettare un insieme X di informazioni in un qubit significa mettere (la rappresentazione de)gli elementi dell’insieme X in superposition (sovrapposizione), in accordo con un’opportuna rappresentazione. La trasmissione a distanza di un qubit sfrutta, invece, l’entanglement (aggrovigliamento) tra qubit. Esistono esperimenti che, realizzando il protocollo “teletrasporto quantistico”, dimostrano l’esistenza di entanglement tra coppie di qubit che “vivono” a 1400 chilometri di distanza[2].
Quantum computing, una svolta per la ricerca: lo scenario europeo e i progetti in corso
Quale problema vogliamo risolvere?
Supponiamo che due persone, per convenzione A(lice) e B(ob), possano agire a piacimento su due qubit: qA è un qubit assegnato ad A e qB a B.
Lo scopo finale è che A trasmetta a B un ulteriore qubit che chiamiamo qI(nformazione); siccome anche qI è un qubit, se trasmesso, esso trasporta efficientemente l’insieme di informazioni che impacchetta.
Il seguente paio di vincoli rende interessante il problema:
- Vincolo 1. La velocità con cui A deve comunicare qI a B deve essere la più alta possibile.
- Vincolo 2. A non conosce, e non può conoscere, alcun dettaglio su qI. Questo implica che non può fornire a B una descrizione esaustiva di qI tramite un canale di comunicazione convenzionale.
In accordo con i vincoli 1 e 2, ipotizziamo alcune strategie alternative che A potrebbe adottare per trasmettere I a B.
- La trasmissione di qI potrebbe consistere nel trasportare fisicamente qI sino a B. Se la distanza tra A e B fosse 1400 chilometri — distanza menzionata sopra –, usando mezzi adatti, il tempo di trasporto potrebbe anche essere accettabile, ma non necessariamente quello auspicato o necessario, violando il Vincolo 1. Inoltre, si tratterebbe di un metodo ampiamente sperimentato e non interessante. Non c’è alcuna novità nel trasportare una “scatola” da un posto ad un altro.
- Quasi in analogia completa con la strategia al punto precedente, A potrebbe immaginare di fare una copia qI’ di qI e di trasportare qI’ fisicamente a B. La strategia non solo non sarebbe interessante per i motivi già citati, ma proprio non sarebbe possibile. Il no-cloning theorem dimostra l’impossibilità di clonare qubit arbitrari, qI incluso. È una delle peculiarità che distingue i qubit dai bit di informazione che i sistemi attuali di trasmissione dati manipolano continuamente, in particolare, copiandoli senza alcuna limitazione, se necessario.
- Per evitare la violazione del Vincolo 1 che caratterizza i due punti precedenti, A potrebbe ingegnarsi per ricavare da qI le informazioni che, una volta trasmesse a B, permetterebbero a quest’ultimo di ricostruire qI in piena autonomia. In questo caso la velocità di trasmissione potrebbe essere la massima possibile, ad esempio quella della luce, raggiunta da trasmissioni in radiofrequenza, soddisfacendo il Vincolo 1.
Tuttavia, si violerebbe il Vincolo 2: anche A potrebbe ricostruire qI, esattamente come B. Inoltre, per ricavare le informazioni finalizzate a ricostruire qI, A dovrebbe eseguire molti esperimenti di lettura su qI, ed usare strumenti tipici della statistica per inferire il contenuto di qI. Questa necessità deriva proprio dal modo in cui qI, in quanto qubit, “impacchetta” l’insieme di informazioni. Tuttavia, leggere qI comporta la distruzione del suo stato di sovrapposizione per motivi intrinseci al funzionamento dei fenomeni fisici in gioco in un qubit. Segue che A dovrebbe clonare più volte qI per ripetere la lettura, ma il no-cloning theorem lo vieterebbe.
Intuizioni sul “teletrasporto quantistico”
Il “teletrasporto quantistico” risolve il problema iniziale di trasmettere qI da A a B, senza violare i vincoli 1 e 2, come segue.
- L’ipotesi, realizzabile concretamente, è che A e B possono operare su una coppia (qA,qB) di qubit, con A che accede solo a qA, e B solo a qB, in cui qA e qB devono essere entangled (formando uno “Stato di Bell”) e possono essere dislocati anche a grande distanza l’uno dall’altro.
- Attraverso un’operazione che in nessun modo corrisponde a leggere il contenuto di qI, A può influenzare il contenuto di qA con quello di qI. Questa operazione ha l’effetto di alterare simultaneamente sia il contenuto di qA, sia quello di qB siccome qA e qB sono entangled.
- Un ulteriore (macro) passo consiste nel distruggere, letteralmente, da parte di A, il contenuto sia di qI, sia di qA. La distruzione equivale a ricavare sia da qI, sia da qA, quel che possiamo immaginare come un “riassunto parziale” di quanto sia qI, sia qA contengono. Il riassunto parziale consiste in due bit bA e bI di informazione — non due qubit! –, da cui è impossibile ricavare sia quanto contenuto inizialmente in qA, sia, tantomeno, quanto inizialmente in qI. È il motivo per cui bA e bI sono riassunti parziali.
- Alla velocità massima possibile, A invia a B sia bA che bI.
- Ottenendo B i due bit bA e bI, e possedendo il qubit qB, alterato dal contenuto di qI al precedente passo 2, può alterare proprio qB a sua disposizione, in funzione di bA e bI, affinché qB diventi identico al contenuto iniziale di qI.
In conclusione, A non sa, e mai saprà, cosa ci fosse in qI e non può ricostruirlo, ma B può ricostruire, grazie ai riassunti parziali bA e bI, e alla variazione che qI ha apportato a qB, cosa ci fosse in qI. Il tutto senza duplicare qI, e trasmettendo a B informazioni alla massima velocità possibile.
Linguaggi di programmazione quantistici
I più comuni algoritmi sviluppati per architetture quantistiche sono descritti nel quadro del modello di computazione basato sui circuiti. Certamente tra questi, oltre al teletrasporto quantistico illustrato in precedenza, ricordiamo anche la ricerca di Grover e la fattorizzazione di Shor, che sono in grado di assicurare una notevole accelerazione rispetto ai migliori algoritmi classici che risolvono gli stessi problemi.
Come nel caso classico, gli algoritmi quantistici corrispondono essenzialmente a sequenze finite di istruzioni. In questo quadro, sono stati proposti dei linguaggi di programmazione quantistici mirati a permettere descrizioni user-friendly e ad alto livello dell’algoritmo considerato. La prima proposta in questo senso è stata avanzata nel 1996 da Knill[3] adattando il classico pseudo-codice usato, in molti testi universitari, per descrivere algoritmi classici alla possibilità di descrivere algoritmi operanti su una architettura quantistica astratta, chiamata QRAM (quantum random access machine).
Tale proposta ha fortemente influenzato tutte le proposte seguenti anzitutto in relazione alla semplicità ed alla generalità dell’architettura, che integra l’architettura classica con la possibilità di eseguire operazioni su registri quantistici (gruppi di qubit). Questi linguaggi si sono distinti dalla proposta di Knill principalmente in termini di paradigmi alternativi a quello imperativo, nella precisazione matematica della sintassi del linguaggio e nella caratterizzazione della loro semantica.
Lo sviluppo di questi linguaggi di programmazione ha molteplici obiettivi[4]: (i) facilitare lo sviluppo di nuovi algoritmi; (ii) semplificare l’insegnamento degli algoritmi sviluppati; (iii) semplificare la stima del costo computazionale degli algoritmi ed il loro confronto con la controparte classica in termini di efficienza; (iv) sviluppare implementazioni scalabili e resilienti agli errori; (v) predisporre la possibilità di analizzare e verificare il loro comportamento in maniera automatica; e così via.
Un notevole sforzo è stato speso nella ricerca di sistemi di tipi che prima dell’esecuzione (ossia, staticamente a tempo di compilazione) assicurino l’assenza di taluni errori indipendenti dall’algoritmo ed anche l’assenza di operazioni che violino le leggi della fisica quantistica. Prosaicamente, questi sistemi di tipo mirano ad impedire al programmatore un uso inappropriato della componente quantistica (come la clonazione di qubit), mirano ad assicurare le usuali verifiche sulla componente classica ed, infine, mirano a garantire una corretta interazione tra le due componenti.
Negli ultimi due decenni, in ambito accademico sono stati proposti numerosi linguaggi di programmazione quantistici prototipali che hanno individuato ed esplorato varie soluzioni ad alcune questioni accennate basandosi su raffinati approcci logico-matematici. D’altro canto, la maggior parte degli ambienti di sviluppo quantistici attualmente proposti dalle aziende (incluse IBM, Google, …) coinvolte in questa ricerca si sono appoggiate a linguaggi di programmazione classici dotati di librerie per l’utilizzo delle componenti quantistiche disponibili (simulatori e/o reali coprocessori). Una scelta motivata dall’obiettivo di facilitare l’utilizzo degli attuali algoritmi quantistici da parte degli odierni programmatori.
Purtroppo, in questo contesto non è ragionevole affrontare tutti questi linguaggi, anche volendo limitarci all’individuazione dei loro aspetti salienti. Per questo motivo ne considereremo uno solo: Q#[5]. Questo linguaggio fa parte dell’ambiente di sviluppo QDK della Microsoft, che permette tra l’altro anche l’utilizzo dei pacchetti Python per lo sviluppo di applicazioni Qiskit e Cirq (che vengono discussi in maggior dettaglio nel seguito).
Q# è un linguaggio di programmazione che opera all’interno del modello basato sui circuiti individuato da Knill, e quindi è indipendente da specifiche architetture (platform-agnostic). In questo modello il flusso di controllo è classico, ma le istruzioni possono trattare dati quantistici. Un programma Q# è costituito da funzioni classiche che quando chiamate possono interagire con il sistema quantistico. In altre parole, un programma Q# non modifica direttamente lo stato quantistico, ma piuttosto descrive le operazioni quantistiche che andranno ad agire sul registro quantistico. Quest’ultimo concettualmente può essere immaginato come un coprocessore quantistico che viene messo a disposizione del nostro programma. La retroazione del registro quantistico con il controllo classico avviene, nel rispetto delle istruzioni dell’algoritmo in questione, attraverso le misurazioni di stati quantistici che influenzano lo stato misurato in accordo con le leggi della fisica quantistica.
Una volta scritto il programma Q# questo può essere compilato in modo efficiente per specifici simulatori:
- simulatori quantistici full-state che modellano una architettura ideale;
- simulatori limitati (dotati di potenti ma limitati insiemi di porte quantistiche) come i Toffoli-simulatori (che offrono prestazioni migliori dei simulatori full-state);
- simulatori che usano rappresentazioni matematiche speciali (sparse simulator) e possono permettere una simulazione efficiente di un ampio numero di qubit;
- simulatori che coinvolgono aspetti di decoerenza e interferenza dell’informazione (noise-simulation) aderenti alle concrete dinamiche delle architetture quantistiche reali.
Q# include molti aspetti e similitudini con i linguaggi classici F#, C# e Python. Q# supporta un approccio procedurale orientato alla scrittura di programmi che includono istruzioni per la selezione di blocchi di codice condizionati da eventi, costrutti per l’iterazione e tipi di dati comuni. In aggiunta, predispone strutture dati e procedure specificamente quantistiche. In particolare, prevede esplicitamente la dichiarazione delle procedure che coinvolgono operazioni quantistiche chiamate operation, in contrapposizione alle function che invece sono procedure propriamente classiche. Per avere una idea dell’utilità di questo approccio, notiamo che quando le operation risultano unitarie allora il linguaggio fornisce alcune “facility” tipiche della programmazione reversibile, come la possibilità di generare automaticamente la procedura che inverte l’operazione.
Compilatori
Scelto un opportuno linguaggio di programmazione, è possibile descrivere una computazione quantistica a livello più o meno alto (come visto nella sezione precedente). In generale, però, si assume che sia possibile applicare gli operatori disponibili (a singolo qubit o a due qubit) a qualsiasi sottoinsieme del registro quantistico che si intende utilizzare. I qubit fisici, però, non sono tutti adiacenti tra loro, bensì rispettano una specifica “coupling map”. Un esempio è presentato nella Fig. 1 (a), dove solo uno dei cinque qubit fisici è adiacente a tutti gli altri. L’applicazione effettiva degli operatori a due qubit può avvenire solo tra coppie di qubit fisici adiacenti. Per consentire dunque l’esecuzione di un algoritmo platform-agnostic, bisogna decidere come allocare i qubit astratti in quelli fisici ed eventualmente modificare la descrizione della computazione fornita dall’utente, applicando opportuni “SWAP gate”. Lo SWAP è un operatore a 2 qubit che scambia gli stati dei due ingressi. Si consideri l’esempio della Fig. 1. il circuito “astratto” (b) consiste di un registro quantistico a 5 qubit, ai quali vengono applicati 5 “CNOT gate” in sequenza. Il CNOT è un operatore a 2 qubit (uno detto “control qubit”, l’altro detto “target qubit”), per cui lo stato finale del target qubit è influenzato dagli stati iniziali di entrambi i qubit, mentre lo stato del control qubit rimane inalterato. Si può notare come il circuito (b) possa eseguito a patto di: 1) scegliere una opportuna allocazione iniziale dei qubit logici nei qubit fisici (q0 in Q2, q1 in Q0, ecc.); 2) applicare uno SWAP gate tra Q0 e Q3 dopo i primi quattro step di computazione. L’allocazione iniziale ottimale è quella che minimizza il numero di SWAP gate da inserire nel circuito, perché ciascuno di essi “costa” come tre operatori CNOT. Queste operazioni di modifica del circuito quantistico vengono svolte da un “quantum compiler” il cui output è una versione funzionalmente equivalente – ma eseguibile sul processore prescelto – del circuito di input.
Fig. 1 – Per rispettare i vincoli imposti dalla coupling map (a), i qubit del circuito (b) devono essere opportunamente allocati nei qubit fisici (indicati con le Q maiuscole). Dopodiché, il circuito (b) deve essere trasformato nel circuito (c) dove uno SWAP gate scambia lo stato dei qubit q1 e q2, e di conseguenza l’ultimo operatore CNOT deve essere applicato non più tra q1 e q4, bensì tra q2 e q4.
Spesso si parla di compilazione in senso lato, ma bisognerebbe distinguere tra compiler e transpiler. Nel primo caso, l’input è la descrizione dell’algoritmo quantistico in un linguaggio di alto livello (ad esempio Python) e l’output è la descrizione equivalente in un linguaggio di più basso livello (QASM o, ancora più vicino all’hardware, impulsi di controllo). Nel caso del transpiler, invece, la descrizione dell’algoritmo viene riformulata usando sempre lo stesso linguaggio, ma tenendo conto di vincoli particolari, quali la coupling map dello specifico processore o la rumorosità dei qubit e dei gate.
Principali SDK ed ambienti di esecuzione
Lo sviluppo di quantum software, una volta scelto il linguaggio di alto livello (Python, Q#, ecc.), richiede l’utilizzo di Software Development Kit (SDK) specifici, che comunemente permettono di descrivere il circuito quantistico, di compilarlo e di lanciarne l’esecuzione su un dispositivo reale (accessibile attraverso servizi cloud) o su un simulatore (locale o remoto). IBM mette a disposizione degli utenti una decina di computer quantistici, caratterizzati da diverse dimensioni della memoria quantistica. I modelli a 5 qubit sono accessibili gratuitamente a tutti. I modelli con più di 5 qubit invece sono disponibili solo per gli enti di ricerca o le aziende convenzionate con IBM. Nel seguito vengono analizzati gli SDK più comuni e i relativi ambienti di esecuzione.
Rilasciato per la prima volta nel 2017, Qiskit di IBM è uno dei primi e più popolari SDK per lo sviluppo di programmi quantistici in linguaggio Python. Nella versione più recente (0.3.7), include tre API principali:
- Qiskit Terra – permette di definire circuiti quantistici e di eseguirli localmente (in simulazione) o in remoto (su nodi veri o simulati, resi disponibili da IBM)
- Qiskit Aer – include simulatori realistici (con tanto di modelli di rumore) di computer quantistici
- Qiskit IBM Quantum Provider – per creare e sottomettere job alla piattaforma cloud di IBM
Inoltre, è possibile installare i seguenti pacchetti applicativi:
- Nature – per studi di fisica e chimica quantistica
- Finance – per risolvere problemi di ambito finanziario
- Machine Learning – per sviluppare ed utilizzare reti neurali quantistiche (QNN)
- Optimization – per modellare e risolvere problemi di ottimizzazione
- Experiments – per svolgere esperimenti “standard” per la caratterizzazione, calibrazione e verifica dell’hardware quantistico
Qiskit Runtime è un ambiente di esecuzione che supporta la definizione di workflow in cui, ad esempio, l’output di una esecuzione contribuisce a definire l’input o la configurazione di una esecuzione successiva, il tutto gestito automaticamente dai servizi cloud di IBM. L’introduzione di Qiskit Runtime è stata molto apprezzata dalla comunità dei ricercatori, perché semplifica notevolmente la gestione delle esecuzioni remote, riducendo sensibilmente il numero di interazioni tra client (computer dell’utente) e server (cloud di IBM).
Cirq è una libreria open source sviluppata da Google. Permette di scrivere, manipolare e ottimizzare circuiti quantistici, usando il linguaggio Python. Questi ultimi possono essere eseguiti in simulazione (localmente) o su dispositivi reali offerti da Google (solo ai ricercatori che hanno concordato un progetto di ricerca con l’azienda) o dalle aziende partner Alpine Quantum Technologies, Pasqal, IonQ, Azure e Rigetti. Per questo motivo, oltre alla API principale (cirq) vi sono alcuni pacchetti vendor-specific. La strategia di Google è quindi diversa da quella di IBM. Se quest’ultima punta esclusivamente sulla propria tecnologia e sullo sviluppo di pacchetti applicativi avanzati, Google invece cerca di fare in modo che la propria API sia universale, cioè utilizzabile con hardware diversi dal punto di vista della tecnologia e del produttore.
Forest è l’SDK di Rigetti, azienda fondata nel 2013 da un ex dipendente di IBM, specializzata nello sviluppo di quantum hardware e quantum software. Forest include:
- PyQuil – libreria Python per scrivere ed eseguire programmi quantistici usando Quil;
- Quilc – compilatore di programmi Quil, altamente ottimizzato; produce codice eseguibile sull’hardware di Rigetti, tenendo conto anche della qualità dei singoli gate (cerca di minimizzare l’uso di gate a bassa qualità, e di massimizzare l’uso dei gate migliori);
- QVM – la Quantum Virtual Machine fornisce un ambiente di simulazione dell’hardware quantistico di Rigetti.
L’accesso ai computer quantistici di Rigetti è possibile tramite la piattaforma Quantum Cloud Services (QCS). Rigetti punta forte sul proprio linguaggio Quil. Difatti ha sviluppato componenti software che permettono agli sviluppatori Qiskit e Cirq di generare facilmente codice Quil a partire dal codice Python scritto utilizzando quelle librerie.
Altri SDK significativi sono:
- ProjectQ – progetto open source nato in ambito accademico, volto a includere diversi back-end, anche se al momento sembra comprendere solo i computer quantistici di IBM;
- Ocean – dell’azienda canadese D-Wave, produttrice di quantum annealer, che sono computer quantistici non universali ma dotati di memorie a migliaia di qubit e particolarmente adatti alla soluzione di problemi di ottimizzazione;
- Quantum Development Kit – di Microsoft, permette di sviluppare programmi in linguaggio Q# e di eseguirli nell’ambiente cloud Azure Quantum, che incorpora hardware quantistico prodotto da IonQ, Rigetti, Pasqal, e altri ancora.
L’evoluzione necessaria
Sebbene i linguaggi di programmazione inclusi negli ambienti commerciali di sviluppo stiano progressivamente assorbendo le idee derivanti dalla ricerca accademica, vi sono ancora varie idee non ancora implementate in nessuna proposta aziendale. Inoltre, anche la ricerca accademica ha molta strada da percorrere per raggiungere gli obiettivi delineati nella sezione sui linguaggi. Insomma, sono presenti larghi margini per l’individuazioni di proposte e soluzioni nei prossimi anni. In aggiunta, vale la pena rimarcare che, in relazione all’hardware quantistico in circolazione, sebbene essa risulti decisamente prematura, la ricerca sulla possibilità di sviluppare algoritmi e linguaggi orientati al controllo quantistico sono già in cantiere.
Per quanto riguarda i compilatori, non è stato ancora individuata la soluzione definitiva. Più elementi si tengono in considerazione (ad es. i parametri di rumore), più il problema si complica. Attualmente una parte della ricerca si sta concentrando sui compilatori per architetture distribuite, caratterizzate da due o più processori quantistici connessi in rete. Lo scopo di queste architetture è consentire la ripartizione su processori quantistici dotati di pochi qubit di algoritmi per il cui funzionamento sono necessari molti qubit. In questo contesto risulta fondamentale trovare la ripartizione che minimizza il numero di operazioni quantistiche “a cavallo” di due processori, perché la loro esecuzione richiede la presenza di stati entangled condivisi.
L’evoluzione dei linguaggi e dei compilatori si accompagnerà con quella di SDK e ambienti di esecuzione. Come visto sopra, la tendenza è quella di fornire, oltre alle librerie di base per la composizione di circuiti quantistici e la loro compilazione, anche librerie applicative. È necessario però un ulteriore sforzo per consentire agli sviluppatori classici di poter usare la potenza del calcolo quantistico senza dover per forza imparare le sue regole fondamentali. Questo sforzo dovrà concretizzarsi in librerie di alto livello, più vicine alla formulazione classica dei problemi che alla loro traduzione in termini quantistici.
- https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.70.1895 ↑
- https://www.nature.com/articles/nature23675 e versione liberamente accessibile https://arxiv.org/abs/1707.00934 . ↑
- https://www.osti.gov/biblio/366453 ↑
- https://www.nature.com/articles/s42254-020-00245-7 ↑
- https://docs.microsoft.com/en-us/azure/quantum/user-guide/ ↑