Implementazione con Qiskit
In questa sezione vedremo alcune implementazioni Qiskit dei concetti introdotti in questa lezione. Se vuoi eseguire queste implementazioni in autonomia, cosa fortemente consigliata, consulta la pagina Installa Qiskit nella documentazione IBM Quantum per i dettagli su come configurare Qiskit.
È bene tenere presente che Qiskit è in continua evoluzione e si concentra principalmente sul massimizzare le prestazioni dei computer quantistici con cui opera, i quali a loro volta continuano a evolversi. Di conseguenza, Qiskit è soggetto a modifiche che possono occasionalmente portare alla deprecazione di alcune parti del codice. Con questo in mente, eseguiremo sempre i seguenti comandi prima di presentare esempi di codice Qiskit in questo corso, in modo da rendere chiara la versione di Qiskit utilizzata. A partire da Qiskit v1.0, questo è un modo semplice per verificare quale versione di Qiskit è attualmente installata.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
2.1.1
Se stai eseguendo questo codice in un ambiente Python basato su cloud, potresti dover installare alcuni dei seguenti pacchetti:
#!pip install qiskit
#!pip install jupyter
#!pip install sympy
#!pip install matplotlib
#!pip install pylatexenc
Vettori e matrici in Python​
Qiskit utilizza il linguaggio di programmazione Python, quindi prima di parlare specificamente di Qiskit può essere utile fare una breve panoramica sui calcoli con matrici e vettori in Python.
In Python, i calcoli con matrici e vettori possono essere eseguiti usando la classe array della libreria NumPy, che offre funzionalità per molti calcoli numerici e scientifici.
Il codice seguente carica questa libreria, definisce due vettori colonna, ket0 e ket1, corrispondenti ai vettori di stato del qubit e e ne stampa la media.
import numpy as np
ket0 = np.array([[1], [0]])
ket1 = np.array([[0], [1]])
print(ket0 / 2 + ket1 / 2)
[[0.5]
[0.5]]
Possiamo usare array anche per creare matrici che rappresentano operazioni.
M1 = np.array([[1, 1], [0, 0]])
M2 = np.array([[1, 0], [0, 1]])
M = M1 / 2 + M2 / 2
print(M)
[[1. 0.5]
[0. 0.5]]
Tieni presente che tutto il codice presente all'interno di una data lezione di questo corso deve essere eseguito in sequenza.
Pertanto, non è necessario importare NumPy di nuovo qui, poiché è già stato importato in precedenza.
La moltiplicazione tra matrici, inclusa la moltiplicazione matrice-vettore come caso particolare, può essere eseguita usando la funzione matmul di NumPy.
print(np.matmul(M1, ket1))
print(np.matmul(M1, M2))
print(np.matmul(M, M))
[[1]
[0]]
[[1 1]
[0 0]]
[[1. 0.75]
[0. 0.25]]
Questa formattazione dell'output lascia un po' a desiderare dal punto di vista visivo.
Una soluzione, per situazioni in cui è richiesta una presentazione più curata, è usare la funzione array_to_latex di Qiskit, dal modulo qiskit.visualization.
Nota che nel codice che segue stiamo usando la funzione generica display di Python.
Al contrario, il comportamento specifico di print può variare a seconda di cosa viene stampato, come accade per gli array definiti da NumPy.
from qiskit.visualization import array_to_latex
display(array_to_latex(np.matmul(M1, ket1)))
display(array_to_latex(np.matmul(M1, M2)))
display(array_to_latex(np.matmul(M, M)))