{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "49f6841f-a9e9-4a44-a162-a0147bd2f300",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Diagonalizzazione quantistica basata su campioni\"\n",
        "description: \"Vengono discussi i componenti importanti della diagonalizzazione quantistica basata su campioni (SQD) e le migliori pratiche. Il metodo è implementato nella seguente lezione.\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore PVDZ eigvals eigvecs eigh */}\n",
        "\n",
        "<span id=\"sample-based-quantum-diagonalization-sqd\" />\n",
        "\n",
        "# Diagonalizzazione quantistica basata su campioni (SQD)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "65614f74-fe5b-4b8b-8118-ef9ac0847f34",
      "metadata": {},
      "source": [
        "La diagonalizzazione quantistica basata su campioni (SQD) combina l'algebra lineare classica e la potenza del calcolo quantistico per diagonalizzare una matrice hamiltoniana e calcolarne gli autovalori e gli autovettori. La diagonalizzazione delle matrici è un'importante operazione matematica, poiché molti problemi scientifici, di calcolo e di ottimizzazione utilizzano questo metodo.\n",
        "\n",
        "Il video che segue offre una panoramica dell'SQD, dei fattori che ne determinano l'utilità e che lo rendono più veloce di molti altri approcci. Il testo successivo fornisce maggiori dettagli.\n",
        "\n",
        "<IBMVideo id=\"134325501\" title=\"In questo video, Chris Porter fornisce una panoramica sulla diagonalizzazione quantistica del sottospazio. Descrive quali fattori ne influenzano l'efficienza e l'utilità. Spiega cosa lo rende più veloce di altri approcci. Il testo che segue fornisce maggiori dettagli.\" />\n",
        "\n",
        "<span id=\"1-introduction-and-motivation\" />\n",
        "\n",
        "## 1. Introduzione e motivazione\n",
        "\n",
        "Consideriamo l'equazione degli autovalori dell'energia resa famosa da Schrödinger, come esempio.\n",
        "\n",
        "$$\n",
        "H \\vert \\psi \\rangle = E \\vert \\psi \\rangle\n",
        "$$\n",
        "\n",
        "$H$ è l'hamiltoniana di un sistema, $|\\psi\\rangle$ è la funzione d'onda (nota anche come autostato) e $E$ è un autovalore. Gli autovalori della matrice $H$ rappresentano i livelli energetici del sistema. Ad esempio, se il sistema è una molecola, l'autovalore più basso rappresenta l'energia di stato fondamentale della molecola. In molti problemi, siamo interessati alla stima dell'energia dello stato fondamentale.\n",
        "\n",
        "Applicando le tecniche di diagonalizzazione esatta dell'algebra lineare, è possibile diagonalizzare l'intera matrice $H$. Tuttavia, l'approccio diventa computazionalmente costoso (o addirittura impossibile) quando la matrice diventa più grande. Ad esempio, anche per piccole molecole chimiche, $H$ può essere proibitivamente grande (ad esempio, l'hamiltoniana per la molecola $N_2$ con una base cc-PVDZ ha una dimensione di $65780 \\times 65780).$\n",
        "\n",
        "Fortunatamente, non sempre abbiamo bisogno di tutti gli autovalori e gli autovettori di un'hamiltoniana $H$, e quindi la diagonalizzazione dell'intera matrice non è necessaria in molti casi pratici. Ad esempio, nel caso della stima dello stato fondamentale, siamo interessati all'autovalore più basso e all'autovettore corrispondente. Questo ci permette di applicare il concetto di proiezione su un sottospazio (utile).\n",
        "\n",
        "Si consideri una matrice $N \\times N$, $H$, dove lo spazio vettoriale completo (spazio di Hilbert) ha una dimensione di $N$ ( $N$ è grande). Quindi, selezioniamo un sottospazio ( $\\mathcal{S}$ ) - che è un sottoinsieme dell'intero spazio di Hilbert - di dimensione $M$, dove $M$ è sufficientemente piccolo. Dopo aver proiettato $H$ su questo sottospazio, la matrice proiettata (ad esempio, $H_\\mathcal{S}$ ) sarà più piccola ( $M \\times M$ ). La matrice più piccola $H_\\mathcal{S}$ può essere diagonalizzata con un metodo numerico classico adeguato e generare autovalori e autovettori per quel sottospazio.\n",
        "\n",
        "**Si noti che il sottospazio deve essere a *supporto* del nostro autostato target (ad esempio, il terreno).** In altre parole, l'hamiltoniana proiettata $H_\\mathcal{S}$ deve trovarsi in un sottospazio che include l'autovalore più basso.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7f39fb3a",
      "metadata": {},
      "source": [
        "<span id=\"2-projection-and-diagonalization\" />\n",
        "\n",
        "## 2. Proiezione e diagonalizzazione\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f8afe151-c2cf-4184-92c7-6a679f6be6e0",
      "metadata": {},
      "source": [
        "Consideriamo di voler trovare l'autovalore minimo e l'autovettore corrispondente per la seguente matrice hamiltoniana $8 \\times 8$ $H$.\n",
        "\n",
        "$$\n",
        "H = \\begin{bmatrix}\n",
        " 0.2235 & -0.0390 & -0.1035 & -0.0818 &  0.1746 &  0.1091 &  0.1165 & -0.0104 \\\\\n",
        "-0.0390 &  0.6621 &  0.0706 & -0.1964 & -0.0782 &  0.2619 &  0.1095 &  0.0029 \\\\\n",
        "-0.1035 &  0.0706 &  0.9961 &  0.1724 &  0.1067 & -0.2299 & -0.1817 &  0.1571 \\\\\n",
        "-0.0818 & -0.1964 &  0.1724 & -0.1773 &  0.1019 & -0.4778 & -0.1272 & -0.0414 \\\\\n",
        " 0.1746 & -0.0782 &  0.1067 &  0.1019 &  0.1418 & -0.1359 & -0.1793 & -0.0766 \\\\\n",
        " 0.1091 &  0.2619 & -0.2299 & -0.4778 & -0.1359 &  0.1014 &  0.1696 &  0.0552 \\\\\n",
        " 0.1165 &  0.1095 & -0.1817 & -0.1272 & -0.1793 &  0.1696 &  0.4227 &  0.2702 \\\\\n",
        "-0.0104 &  0.0029 &  0.1571 & -0.0414 & -0.0766 &  0.0552 &  0.2702 &  0.4456 \\\\\n",
        "\\end{bmatrix}\n",
        "$$\n",
        "\n",
        "Verrà diagonalizzata la matrice completa insieme a diverse versioni proiettate ( $H_\\mathcal{S}$ ) per diversi sottospazi per dimostrare la scalabilità e l'importanza della scelta del sottospazio.\n",
        "\n",
        "L'energia dello stato fondamentale (minimo autovalore) della matrice $H$ è $-0.5357$ e la funzione d'onda *esatta* dello stato fondamentale (autovettore) è:\n",
        "\n",
        "$$\n",
        "\\text{GS}_{\\text{exact}} = 0.8 * |011\\rangle + 0.6 * |101\\rangle.\n",
        "$$\n",
        "\n",
        "cioè, lo stato fondamentale della matrice è compreso tra due stati base computazionali (vettori) $\\vert 011 \\rangle$ e $\\vert 101 \\rangle$.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "b663cbd4-7836-4ec5-9236-fd8299f86fac",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Eigenvalues:\n",
            "[-0.5357 -0.1321  0.1049  0.1258  0.3616  0.6405  0.947   1.3039]\n",
            "Minimum eigenvalue: -0.5356560029438817\n",
            "\n",
            "Eigenvectors (columns represent vectors):\n",
            "[[-0.     -0.5612  0.098  -0.0024  0.8051 -0.0806  0.0643  0.1288]\n",
            " [-0.     -0.1403 -0.1985 -0.4249 -0.0092  0.585  -0.5952  0.2526]\n",
            " [ 0.      0.0416  0.3041  0.2122  0.1509 -0.0139 -0.5794 -0.7086]\n",
            " [ 0.8    -0.1936 -0.0127 -0.4376 -0.1081 -0.0838  0.1557 -0.2966]\n",
            " [ 0.      0.6716 -0.3535 -0.2552  0.5395  0.0954  0.1449 -0.1941]\n",
            " [ 0.6     0.258   0.017   0.5834  0.1441  0.1118 -0.2076  0.3954]\n",
            " [ 0.      0.3088  0.5504 -0.4197  0.0626 -0.468  -0.2625  0.3657]\n",
            " [-0.     -0.1146 -0.6559  0.0356 -0.0394 -0.6352 -0.3856  0.0418]]\n",
            "\n",
            "Eigenvector for the minimum eigenvalue (ground state)\n",
            "[-0.  -0.   0.   0.8  0.   0.6  0.  -0. ]\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from scipy.linalg import eigh\n",
        "\n",
        "np.set_printoptions(precision=4, sign=\"-\", suppress=True, linewidth=100)\n",
        "\n",
        "H = np.array(\n",
        "    [\n",
        "        [0.2235, -0.039, -0.1035, -0.0818, 0.1746, 0.1091, 0.1165, -0.0104],\n",
        "        [-0.0390, 0.6621, 0.0706, -0.1964, -0.0782, 0.2619, 0.1095, 0.0029],\n",
        "        [-0.1035, 0.0706, 0.9961, 0.1724, 0.1067, -0.2299, -0.1817, 0.1571],\n",
        "        [-0.0818, -0.1964, 0.1724, -0.1773, 0.1019, -0.4778, -0.1272, -0.0414],\n",
        "        [0.1746, -0.0782, 0.1067, 0.1019, 0.1418, -0.1359, -0.1793, -0.0766],\n",
        "        [0.1091, 0.2619, -0.2299, -0.4778, -0.1359, 0.1014, 0.1696, 0.0552],\n",
        "        [0.1165, 0.1095, -0.1817, -0.1272, -0.1793, 0.1696, 0.4227, 0.2702],\n",
        "        [-0.0104, 0.0029, 0.1571, -0.0414, -0.0766, 0.0552, 0.2702, 0.4456],\n",
        "    ]\n",
        ")\n",
        "eigvals, eigvecs = eigh(H)\n",
        "\n",
        "print(\"Eigenvalues:\")\n",
        "print(eigvals)\n",
        "print(f\"Minimum eigenvalue: {eigvals.min()}\")\n",
        "\n",
        "print(\"\\nEigenvectors (columns represent vectors):\")\n",
        "print(eigvecs)\n",
        "print(\"\\nEigenvector for the minimum eigenvalue (ground state)\")\n",
        "print(eigvecs[:, np.argmin(eigvals)])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cfaa9d24",
      "metadata": {},
      "source": [
        "Successivamente, proietteremo la matrice $H$ su diversi sottospazi e verificheremo se è possibile ottenere lo stato fondamentale esatto. In particolare, proietteremo la matrice su un sottospazio compreso tra:\n",
        "\n",
        "1. vettori esatti dello stato fondamentale ( $\\vert 011 \\rangle$ e $\\vert 101 \\rangle$ ).\n",
        "2. che esclude alcuni o tutti i vettori esatti dello stato fondamentale (ad esempio, $\\vert 000 \\rangle$, $\\vert 011 \\rangle$ e $\\vert 110 \\rangle$ ).\n",
        "3. vettori che includono sia lo stato di terra esatto sia lo stato fuori terra (ma non tutti i vettori possibili nello spazio di Hilbert).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8dc65713-f90d-4376-a3e3-d5a91d1c48a9",
      "metadata": {},
      "source": [
        "<span id=\"21-case-1-subspace-includes-ground-state\" />\n",
        "\n",
        "### 2.1 Case-1: Il sottospazio include lo stato fondamentale\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ceaef659-9aff-436b-a3bb-67a7e71f86e6",
      "metadata": {},
      "source": [
        "Supponiamo di voler proiettare $H$ in un sottospazio ( $\\mathcal{S}$ ) spaziato da due vettori $x_1 = |011\\rangle$ e $x_2 = |101\\rangle$. L'hamiltoniana proiettata è definita da:\n",
        "\n",
        "$$\n",
        "H_\\mathcal{S} = \\begin{bmatrix}\n",
        "\\langle x1 | H | x1 \\rangle & \\langle x1 | H | x2 \\rangle \\\\\n",
        "\\langle x2 | H | x1 \\rangle & \\langle x2 | H | x2 \\rangle\n",
        "\\end{bmatrix}\n",
        "$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "284bcb6a-1e59-4d8c-a2bb-ac8c6c6ee480",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[[-0.1773 -0.4778]\n",
            " [-0.4778  0.1014]]\n"
          ]
        }
      ],
      "source": [
        "x1 = np.zeros(8)\n",
        "x1[3] = 1  # binary 011 is 3 in decimal. |011> = |3> = [0,0,0,1,0,0,0,0]\n",
        "\n",
        "x2 = np.zeros(8)\n",
        "x2[5] = 1  # binary 101 is 5 in decimal\n",
        "\n",
        "Hs = np.array([[x1 @ H @ x1.T, x1 @ H @ x2.T], [x2 @ H @ x1.T, x2 @ H @ x2.T]])\n",
        "print(Hs)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "86324b23-c718-4d58-afda-528b25fc1907",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Minimum eigenvalue: -0.535656000064295\n",
            "Eigenvector for minimum eigenvalue: [-0.8 -0.6]\n"
          ]
        }
      ],
      "source": [
        "eigvals, eigvecs = eigh(Hs)\n",
        "print(f\"Minimum eigenvalue: {eigvals.min()}\")\n",
        "print(f\"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f86d7235-a177-40c5-9852-7a1652c90997",
      "metadata": {},
      "source": [
        "A questo proposito possiamo fare alcune osservazioni fondamentali.\n",
        "\n",
        "* Poiché abbiamo spaziato il sottospazio con due vettori, la dimensione della matrice proiettata ( $H_\\mathcal{S}$ ) è $2 \\times 2$, che è più piccola della matrice completa $H$ ( $8 \\times 8$ ).\n",
        "* L'autovalore minimo della matrice proiettata corrisponde all'autovalore esatto dello stato fondamentale.\n",
        "* I valori della variabile `eigvecs` denotano l'ampiezza dei vettori di estensione del sottospazio e, grazie ad essi, è possibile ricostruire l'autostato (stato fondamentale). In questo caso, si ottiene l'esatto stato fondamentale (fino a una fase globale):\n",
        "\n",
        "$$\n",
        "|\\psi \\rangle = - (0.8 |011\\rangle + 0.6 |101\\rangle)\n",
        "$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "927650d6-0b89-4356-b7a1-9106c43123a0",
      "metadata": {},
      "source": [
        "<span id=\"22-case-2-subspace-excludes-some-or-all-ground-state-vectors\" />\n",
        "\n",
        "### 2.2 Case-2: Il sottospazio esclude alcuni o tutti i vettori dello stato fondamentale\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8d88696d-bc3d-4df1-9475-760ddaf89341",
      "metadata": {},
      "source": [
        "Quindi, proiettiamo $H$ su un sottospazio delimitato da tre vettori $x_1 = |000\\rangle$, $x_2 = |011\\rangle$ e $x_3 = |110\\rangle$. Scegliamo deliberatamente i vettori in modo da escludere un vettore di stato fondamentale ( $\\vert 101 \\rangle$ ). L'hamiltoniana proiettata è definita da:\n",
        "\n",
        "$$\n",
        "H_\\mathcal{S} = \\begin{bmatrix}\n",
        "\\langle x1 | H | x1 \\rangle & \\langle x1 | H | x2 \\rangle & \\langle x1 | H | x3 \\rangle\\\\\n",
        "\\langle x2 | H | x1 \\rangle & \\langle x2 | H | x2 \\rangle & \\langle x2 | H | x3 \\rangle \\\\\n",
        "\\langle x3 | H | x1 \\rangle & \\langle x3 | H | x2 \\rangle & \\langle x3 | H | x3 \\rangle \\\\\n",
        "\\end{bmatrix}\n",
        "$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "bb6a7677-d840-4d89-bf46-8522774f071f",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[[ 0.2235 -0.0818  0.1165]\n",
            " [-0.0818 -0.1773 -0.1272]\n",
            " [ 0.1165 -0.1272  0.4227]]\n"
          ]
        }
      ],
      "source": [
        "x1 = np.zeros(8)\n",
        "x1[0] = 1\n",
        "\n",
        "x2 = np.zeros(8)\n",
        "x2[3] = 1\n",
        "\n",
        "x3 = np.zeros(8)\n",
        "x3[6] = 1\n",
        "\n",
        "Hs = np.array(\n",
        "    [\n",
        "        [x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],\n",
        "        [x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],\n",
        "        [x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],\n",
        "    ]\n",
        ")\n",
        "print(Hs)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "48472db8-6d73-46f6-a332-c0185e2b6792",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Minimum eigenvalue: -0.21108858736702252\n"
          ]
        }
      ],
      "source": [
        "eigvals, eigvecs = eigh(Hs)\n",
        "print(f\"Minimum eigenvalue: {eigvals.min()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "224ec6f4-2f0d-49bc-8810-bf9b34c59f71",
      "metadata": {},
      "source": [
        "L'autovalore $-0.2111$ in questo caso non corrisponde all'autovalore minimo $-0.5357$ dell'hamiltoniana completa. L'osservazione chiave è: se proiettiamo su un sottospazio che esclude gli stati base del nostro stato target (terreno) - parzialmente o completamente - lo stato terreno stimato sarà diverso da quello esatto.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a50be3fa-dade-4c76-ba07-29cea5a4cc64",
      "metadata": {},
      "source": [
        "<span id=\"23-case-3-subspace-includes-both-ground-state-and-non-ground-state-vectors\" />\n",
        "\n",
        "### 2.3 Case-3: Il sottospazio include sia i vettori dello stato fondamentale che quelli non fondamentali\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f954b02e-a807-4c7f-9ec8-02d825430311",
      "metadata": {},
      "source": [
        "Successivamente, mostriamo un caso in cui il sottospazio è attraversato da vettori che includono vettori esatti dello stato fondamentale insieme a vettori indesiderati. Supponiamo che il nostro sottospazio sia spaziato da $x_1 = |011\\rangle$, $x_2 = |101\\rangle$ (presente nello stato fondamentale esatto) e $x_3 = |111\\rangle$ (assente nello stato fondamentale esatto).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "a317bd5b-c8ad-4578-b288-e5dd234a9330",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[[-0.1773 -0.4778 -0.0414]\n",
            " [-0.4778  0.1014  0.0552]\n",
            " [-0.0414  0.0552  0.4456]]\n"
          ]
        }
      ],
      "source": [
        "x1 = np.zeros(8)\n",
        "x1[3] = 1\n",
        "\n",
        "x2 = np.zeros(8)\n",
        "x2[5] = 1\n",
        "\n",
        "x3 = np.zeros(8)\n",
        "x3[7] = 1\n",
        "\n",
        "Hs = np.array(\n",
        "    [\n",
        "        [x1 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],\n",
        "        [x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],\n",
        "        [x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],\n",
        "    ]\n",
        ")\n",
        "print(Hs)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "f3e65657-b373-4a97-8b9b-42c47aaaca24",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Minimum eigenvalue: -0.53565600006461\n",
            "Eigenvector for minimum eigenvalue: [ 0.8  0.6 -0. ]\n"
          ]
        }
      ],
      "source": [
        "eigvals, eigvecs = eigh(Hs)\n",
        "print(f\"Minimum eigenvalue: {eigvals.min()}\")\n",
        "print(f\"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "88dfda4c-102e-4597-8a81-243df6a03641",
      "metadata": {},
      "source": [
        "In questo caso, otteniamo ancora una volta $-0.5357$ come autovalore minimo che corrisponde alla matrice completa (cioè allo stato fondamentale esatto). Un altro risultato interessante è l'ampiezza di $x_3$ restituita dal processo di proiezione e diagonalizzazione. L'ampiezza è $0$, e quando ricostruiamo la funzione d'onda (autostato) con le ampiezze e i vettori calcolati, otteniamo:\n",
        "\n",
        "$$\n",
        "\\vert \\psi \\rangle = 0.8 |011\\rangle + 0.6 |101\\rangle + 0.0 |111\\rangle = 0.8 |011\\rangle + 0.6 |101\\rangle \\left( \\text{exact ground state} \\right)\n",
        "$$\n",
        "\n",
        "Pertanto, anche se il nostro sottospazio include alcuni vettori non bersaglio (insieme all'insieme completo dei vettori bersaglio), possiamo calcolare l'autovalore e l'autostato corretti, poiché il processo di proiezione e diagonalizzazione filtra i vettori non bersaglio impostando le loro ampiezze su $0$. Questa proprietà di SQD fornisce una tolleranza intrinseca al rumore.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4730d906-3503-4a6c-951c-a1984bfb4238",
      "metadata": {},
      "source": [
        "<span id=\"3-role-of-quantum-in-sqd\" />\n",
        "\n",
        "## 3. Il ruolo della meccanica quantistica nella SQD\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3aa30fe6",
      "metadata": {},
      "source": [
        "Le analisi precedenti stabiliscono l'importanza dei vettori spanning del sottospazio, che devono essere a *sostegno dello stato target*. Ciò solleva una questione importante: **Come scegliere i vettori con il supporto dello stato target per la costruzione del sottospazio?**\n",
        "\n",
        "È qui che entrano in gioco **i computer quantistici**. La sinergia quantistica-classica funziona come segue nel paradigma SQD:\n",
        "\n",
        "1. Utilizzando un circuito quantistico adeguato, cerchiamo di preparare uno stato su un computer quantistico che generi stati base su cui la funzione d'onda target (ad esempio, lo stato fondamentale) abbia un supporto significativo. Gli stati base campionati (bitstring) copriranno il sottospazio per la proiezione hamiltoniana.\n",
        "2. Un computer classico proietta l'hamiltoniana nel sottospazio (attraversato dai campioni/vettori del computer quantistico) e la diagonalizza per calcolare autovalori e autovettori utilizzando metodi numerici appropriati.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2fdcc9e5-ca63-4a97-8a28-330cd81c95dc",
      "metadata": {},
      "source": [
        "![Uno schema delle componenti quantistiche e classiche dell'SQD. Nella meccanica quantistica, si prepara e si effettua un campionamento dal supporto di riferimento; poi, in modo classico, si proietta la matrice sul sottospazio campionato e si diagonalizza la matrice proiettata.](https://quantum.cloud.ibm.com/learning/images/courses/quantum-diagonalization-algorithms/sqd1/sqd1-fig1.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4ffbfb55-863f-480e-a21c-d929c810396b",
      "metadata": {},
      "source": [
        "Ci possono essere diversi modi per preparare tale stato quantistico, che possono essere variazionali o non variazionali a seconda del problema.\n",
        "\n",
        "Nelle prossime due lezioni mostreremo due esempi specifici di preparazione degli stati e di campionamento da essi.\n",
        "\n",
        "1. Nella Lezione 4, utilizzeremo un ansatz unitario locale parametrizzato di Jastrow (LUCJ) per generare campioni per un problema di chimica (stima dell'energia di stato fondamentale della molecola $N_2$ ). Inizializzeremo l'ansatz LUCJ con i parametri del classico calcolo accoppiato di cluster singoli e doppi (CCSD).\n",
        "2. Nella Lezione 5, campioneremo gli stati della base di Krylov per coprire il sottospazio di un problema di fisica della materia condensata. Questo approccio è di natura non variazionale.\n",
        "\n",
        "Oltre agli approcci specifici al problema, un approccio generico per la preparazione degli stati prevede un ansatz variazionale, in cui aggiorneremo iterativamente i parametri dell'ansatz utilizzando un ottimizzatore classico.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1aa0044f-d798-4510-bd67-736a3e574695",
      "metadata": {},
      "source": [
        "![Un diagramma di flusso che illustra il percorso da un circuito quantistico variazionale, passando per il campionamento quantistico, fino al calcolo classico, in cui la matrice viene proiettata e diagonalizzata. I risultati vengono quindi inseriti in un ottimizzatore classico che seleziona nuovi parametri variazionali, dopodiché si ritorna al circuito quantistico variazionale.](https://quantum.cloud.ibm.com/learning/images/courses/quantum-diagonalization-algorithms/sqd1/sqd1-fig2.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5addd026",
      "metadata": {},
      "source": [
        "I campioni provenienti da computer quantistici con tolleranza ai guasti precedente possono essere rumorosi. L'SQD impiega un processo di recupero della configurazione autoconsistente per correggere i campioni rumorosi [\\[1\\]](#references). Discuteremo il processo di recupero della configurazione in modo più dettagliato e lo applicheremo per correggere i campioni rumorosi in modo iterativo per affinare la stima dell'energia dello stato fondamentale in un problema di chimica nella Lezione 4.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4af71b3d-2749-417f-b42d-4d7bbc4930b6",
      "metadata": {},
      "source": [
        "<span id=\"31-notes-on-ground-state-support\" />\n",
        "\n",
        "### 3.1 Note sul supporto dello stato fondamentale\n",
        "\n",
        "Spieghiamo meglio il concetto di *supporto di stato a terra*. Il supporto dello stato fondamentale può essere definito come l'insieme degli stati base in cui lo stato fondamentale ha ampiezza non nulla (fino a una soglia di cutoff).\n",
        "\n",
        "Supponiamo che lo stato fondamentale esatto di un problema di $3$ -qubit sia\n",
        "\n",
        "$$\n",
        "\\vert \\psi \\rangle = \\frac{1}{\\sqrt{2}} \\vert 000 \\rangle + \\frac{1}{\\sqrt{2}} \\vert 111 \\rangle\n",
        "$$\n",
        "\n",
        "Se campioniamo lo stato di cui sopra, dovremmo ottenere un insieme di stati base computazionali $\\{\\vert 000 \\rangle$, $\\vert 111 \\rangle \\}$ (altri stati base computazionali hanno ampiezza zero allo stato fondamentale e quindi, idealmente, non appariranno durante il campionamento).\n",
        "\n",
        "Idealmente, l'insieme dei vettori base per questo stato è costituito da $\\{ \\vert 000 \\rangle, \\vert 111 \\rangle \\}$ (in altre parole, il sottospazio di questo stato è attraversato da questi due vettori base).\n",
        "\n",
        "In pratica, non è necessario preparare l'esatto stato fondamentale, poiché il campionamento di molti altri stati può fornire lo stesso insieme di vettori. Ad esempio:\n",
        "\n",
        "$$\n",
        "\\begin{align}\n",
        "\\vert \\psi_a \\rangle = 0.8 \\vert 000 \\rangle + 0.6 \\vert 111 \\rangle &\\xrightarrow{\\text{Sampling}} \\{ \\vert 000 \\rangle, \\vert 111 \\rangle \\} \\\\\n",
        "\\vert \\psi_b \\rangle = \\frac{1}{2} \\vert 000 \\rangle + \\frac{\\sqrt{3}}{2} \\vert 111 \\rangle &\\xrightarrow{\\text{Sampling}} \\{ \\vert 000 \\rangle, \\vert 111 \\rangle \\} \\\\\n",
        "\\vert \\psi_c \\rangle = \\frac{1}{2} \\vert 000 \\rangle + \\frac{1}{2} \\vert 111 \\rangle + \\frac{1}{\\sqrt{2}} \\vert 101 \\rangle &\\xrightarrow{\\text{Sampling}} \\{ \\vert 000 \\rangle, \\vert 101 \\rangle, \\vert 111 \\rangle \\}\n",
        "\\end{align}\n",
        "$$\n",
        "\n",
        "La preparazione e il campionamento da uno qualsiasi dei suddetti stati genererà vettori con ampiezza non nulla allo stato fondamentale, e tutti si qualificheranno come aventi *supporto allo stato fondamentale*. Si noti che il campionamento $\\vert \\psi_c \\rangle$ include un vettore extra $\\vert 101 \\rangle$ che ha $0$ ampiezza nello stato fondamentale esatto. Tuttavia, in precedenza abbiamo dimostrato che l'inclusione di tali vettori nel sottospazio non è problematica, poiché l'operazione di proiezione e diagonalizzazione imposta l'ampiezza dei vettori indesiderati a $0$, e possiamo ottenere l'autovalore previsto e ricostruire l'autostato corretto.\n",
        "\n",
        "![Schemi che illustrano i supporti di ansatz corretti e quelli errati. Un buon ansatz ha uno spazio di supporto che contiene interamente lo spazio di supporto dello stato fondamentale. Un ansatz inadeguato contiene solo una parte o nessuna componente del supporto dello stato fondamentale.](https://quantum.cloud.ibm.com/learning/images/courses/quantum-diagonalization-algorithms/sqd1/sqd1-fig3.avif)\n",
        "\n",
        "Pertanto, non è necessario preparare e campionare dallo stato fondamentale esatto. In realtà, farlo può essere difficile, poiché lo stato fondamentale esatto non è noto *a priori*, e spesso è vantaggioso **non** preparare e campionare dallo stato fondamentale esatto, soprattutto se la funzione d'onda (stato) è skewed con alcuni stati base che hanno probabilità molto elevate. Si consideri la seguente funzione d'onda:\n",
        "\n",
        "$$\n",
        "\\vert \\psi \\rangle = 0.7 \\vert 000 \\rangle - 0.7 \\vert 010 \\rangle + 0.1 \\vert 101 \\rangle - 0.01 \\vert 111 \\rangle\n",
        "$$\n",
        "\n",
        "Si tratta di una funzione d'onda obliqua, in cui gli stati base $\\vert 000 \\rangle$ e $\\vert 010 \\rangle$ hanno ampiezze molto maggiori rispetto a $\\vert 101 \\rangle$ e $\\vert 111 \\rangle$. Quando si campiona, si otterranno $\\vert 000 \\rangle$ e $\\vert 010 \\rangle$ più frequentemente ( $\\text{sampling probability} = \\vert \\text{amplitude} \\vert^{2}$ $\\approx 49\\%$ per $\\vert 000 \\rangle$ e $\\vert 010 \\rangle$ ciascuno, $\\approx 1\\%$ per $\\vert 101 \\rangle$, e $\\approx 0.01\\%$ per $\\vert 111 \\rangle$ ). Con un budget di campionamento finito (*scatti* ), è molto probabile che il nostro insieme campionato contenga solo $\\vert 000 \\rangle$ e $\\vert 010 \\rangle$. Come mostrato in precedenza, se si estende il sottospazio con un tale insieme di vettori mancanti, non si riuscirà a trovare il vero autovalore minimo. Pertanto, sarà utile (e necessario) campionare da uno stato con supporto allo stato di terra.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "127754c4-74e1-4583-b252-ddd07cef23cd",
      "metadata": {},
      "source": [
        "<span id=\"32-a-case-against-uniform-sampling\" />\n",
        "\n",
        "### 3.2 Un caso contro il campionamento uniforme\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5a51c9ce-356d-4ff0-956e-3fd42654d974",
      "metadata": {},
      "source": [
        "Si può essere tentati di estrarre campioni da una distribuzione uniforme per coprire il sottospazio. Sebbene possa funzionare per piccoli problemi, inizierà a fallire per problemi più grandi e pratici. Per problemi di grandi dimensioni con molti qubit, lo spazio di Hilbert può essere proibitivo. Ad esempio, uno spazio di Hilbert a 32 qubit ha più di $4$ miliardi di possibili vettori base ( $2^{32} = 4,294,967,296$ ). Se campioniamo uniformemente da questo spazio con un budget di campionamento finito (diciamo $10000$ vettori per mantenere il processo di diagonalizzazione fattibile), il sottospazio può escludere più spesso i vettori con supporto allo stato fondamentale, poiché il processo sarà casuale. **Pertanto, abbiamo bisogno di un modo sistematico per campionare dal supporto dello stato fondamentale sfruttando i circuiti quantistici.**\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7ad257c8-834e-4343-b37a-5ff7d082b778",
      "metadata": {},
      "source": [
        "<span id=\"4-sqd-and-sparsity-of-the-wave-function\" />\n",
        "\n",
        "## 4. SQD e sparsità della funzione d'onda\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5094d2ae-c6fc-4e13-b476-ca7ebfd0c356",
      "metadata": {},
      "source": [
        "Il divario tra le dimensioni dell'intero spazio di Hilbert e quelle del sottospazio fattibile porta con sé un altro aspetto importante della SQD, ovvero la sparsità della funzione d'onda. L'approccio SQD funziona bene per funzioni d'onda rade o concentrate, dove una piccola frazione di stati base ha ampiezze non trascurabili. Le ragioni sono due:\n",
        "\n",
        "1. Se la funzione d'onda è ampia (cioè molti stati base hanno ampiezze non trascurabili) e non includiamo nel sottospazio i vettori con il supporto dello stato target, potremmo ottenere autovalori ed autovettori errati.\n",
        "2. Per evitare questo problema, è necessario includere molti vettori nel sottospazio. Tuttavia, la dimensione dell'hamiltoniana proiettata è direttamente correlata alla dimensione del sottospazio. Un sottospazio più ampio significa un'Hamiltoniana più grande, che potrebbe diventare impossibile da diagonalizzare.\n",
        "\n",
        "Mostriamo il problema con la seguente matrice ( $H_{new}$ ). L'autovalore più basso di $H_{new}$ è $-2.2081$, e la funzione d'onda corrispondente (autostato) è ampia:\n",
        "\n",
        "$$\n",
        "|\\psi\\rangle = \\frac{|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle}{\\sqrt{8}}\n",
        "$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "0a53cd27-478c-44e8-907e-9dc67093bc95",
      "metadata": {},
      "outputs": [],
      "source": [
        "H_new = np.array(\n",
        "    [\n",
        "        [-0.958, 0.1853, -0.2663, -0.3875, -0.0524, -0.3779, -0.0145, -0.3369],\n",
        "        [0.1853, -0.4081, -0.8549, -0.2312, 0.0615, -0.2493, -0.3804, -0.3312],\n",
        "        [-0.2663, -0.8549, -0.6929, -0.0063, -0.0478, -0.0236, -0.2494, -0.0669],\n",
        "        [-0.3875, -0.2312, -0.0063, -0.4468, -0.6301, -0.4627, -0.1188, 0.0753],\n",
        "        [-0.0524, 0.0615, -0.0478, -0.6301, -0.6664, -0.1514, -0.3571, -0.3644],\n",
        "        [-0.3779, -0.2493, -0.0236, -0.4627, -0.1514, -0.9605, 0.0137, 0.0035],\n",
        "        [-0.0145, -0.3804, -0.2494, -0.1188, -0.3571, 0.0137, -1.1449, 0.0433],\n",
        "        [-0.3369, -0.3312, -0.0669, 0.0753, -0.3644, 0.0035, 0.0433, -1.2307],\n",
        "    ]\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "751bd77e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Minimum eigenvalue: -2.208137504726661\n",
            "Eigenvector for minimum eigenvalue: [0.3536 0.3536 0.3536 0.3536 0.3535 0.3536 0.3535 0.3535]\n"
          ]
        }
      ],
      "source": [
        "eigvals, eigvecs = eigh(H_new)\n",
        "print(f\"Minimum eigenvalue: {eigvals.min()}\")\n",
        "print(f\"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "331030ee-7831-4b41-8863-e9c8647124a9",
      "metadata": {},
      "source": [
        "Supponiamo di proiettare il $H_{new}$ su un sottospazio spaziato da quattro vettori: $|000\\rangle$, $|010\\rangle$, $|101\\rangle$, e $|110\\rangle$ e calcoliamo l'autovalore.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "2591384f-ba2e-46ee-a607-4ac401f342a9",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[[-0.958  -0.2663 -0.3779 -0.0145]\n",
            " [-0.2663 -0.6929 -0.0236 -0.2494]\n",
            " [-0.3779 -0.0236 -0.9605  0.0137]\n",
            " [-0.0145 -0.2494  0.0137 -1.1449]]\n"
          ]
        }
      ],
      "source": [
        "x1 = np.zeros(8)\n",
        "x1[0] = 1\n",
        "\n",
        "x2 = np.zeros(8)\n",
        "x2[2] = 1\n",
        "\n",
        "x3 = np.zeros(8)\n",
        "x3[5] = 1\n",
        "\n",
        "x4 = np.zeros(8)\n",
        "x4[6] = 1\n",
        "\n",
        "H_new_s = np.array(\n",
        "    [\n",
        "        [x1 @ H_new @ x1.T, x1 @ H_new @ x2.T, x1 @ H_new @ x3.T, x1 @ H_new @ x4.T],\n",
        "        [x2 @ H_new @ x1.T, x2 @ H_new @ x2.T, x2 @ H_new @ x3.T, x2 @ H_new @ x4.T],\n",
        "        [x3 @ H_new @ x1.T, x3 @ H_new @ x2.T, x3 @ H_new @ x3.T, x3 @ H_new @ x4.T],\n",
        "        [x4 @ H_new @ x1.T, x4 @ H_new @ x2.T, x4 @ H_new @ x3.T, x4 @ H_new @ x4.T],\n",
        "    ]\n",
        ")\n",
        "print(H_new_s)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "0f388339-cf0b-4584-bf83-90afb3ec13cc",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Minimum eigenvalue: -1.4266552340586673\n"
          ]
        }
      ],
      "source": [
        "eigvals, eigvecs = eigh(H_new_s)\n",
        "print(f\"Minimum eigenvalue: {eigvals.min()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "27b0d944-57a8-4cf5-a207-2363fa69a298",
      "metadata": {},
      "source": [
        "L'esempio precedente mostra che quando la funzione d'onda è ampia e non si includono gli stati base nel sottospazio, il calcolo degli autovalori diventa errato.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9cbdb4ce-fb6f-49e4-8eff-649d40345366",
      "metadata": {},
      "source": [
        "<span id=\"5-sqd-vs-vqe\" />\n",
        "\n",
        "## 5. SQD contro VQE\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8abdcd50-617b-40a6-82db-f1495078ca4e",
      "metadata": {},
      "source": [
        "Come già detto, la SQD può richiedere un circuito quantistico variazionale e aggiornamenti iterativi dei parametri per preparare e campionare il supporto dello stato fondamentale. Poiché questa routine di aggiornamento iterativo dei parametri è simile a VQE, ci si può chiedere in cosa differiscano questi metodi e quali siano i vantaggi di SQD rispetto a VQE In questa sezione, confrontiamo i metodi e discutiamo i vantaggi di SQD con un esempio di molecola $N_2$ descritta con un set di basi minimo (`sto-3g`).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0de2cec1-65b2-4186-9ea1-fab2fd48f413",
      "metadata": {},
      "source": [
        "|                               | VQE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | SQD                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |\n",
        "| :---------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n",
        "| Spese generali di misurazione | **Molti termini di Pauli, molti circuiti di misura:** L'hamiltoniana della molecola ha $2951$ termini di Pauli unici. Poiché i termini di Pauli possono contenere termini $X$ e $Y$ e le misure quantistiche tipiche sono effettuate nella base $Z$, è necessario cambiare la base di misura per valutare questi termini. Quando sono ottimizzati per le misure, i termini di $2951$ possono essere raggruppati in gruppi di $1187$, dove ogni gruppo può essere valutato utilizzando un singolo circuito. Pertanto, abbiamo bisogno di almeno $1187$ circuiti unici per valutare tutti i termini di Pauli. **Molti colpi per circuito per una varianza più stretta**. Anche in questo caso, il valore di aspettativa valutato di ogni termine di Pauli ha una varianza che dipende inversamente da $\\sqrt{shots}$. Pertanto, per stimare accuratamente ogni termine, dobbiamo assegnare molti scatti per circuito. Ad esempio, per ottenere l'accuratezza chimica ( $1$ kcal/mol), in genere sono necessari scatti dell'ordine di $10^5$ - $10^7$ per circuito. Pertanto, il VQE necessita di molti circuiti di misura e di un certo numero di scatti per ogni circuito. Nei casi pratici, questo overhead di misurazione può essere limitante. | In SQD non sono necessari circuiti di misura diversi per ogni termine di Pauli raggruppato. In genere, si misura un singolo circuito per un numero fisso di scatti. Anche se il numero di scatti può essere impostato su un valore elevato a seconda del problema, l'overhead rimane molto inferiore a quello di VQE. Inoltre, le stime dell'energia che utilizzano il processo di diagonalizzazione sono esatte, il che significa che gli autovalori calcolati sono esatti in quel sottospazio e non hanno una varianza associata ad essi come il VQE. (Nel caso del campionamento degli stati con base di Krylov (Lezione 5), è necessario misurare più circuiti, ma il numero di circuiti rimane molto più piccolo del VQE). |\n",
        "| Energia stimata vincolata     | In VQE, le stime di energia non sono vincolate e possono essere inferiori ai valori minimi reali a causa del rumore.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             | Il processo di stima dell'energia in SQD produce sempre un limite superiore all'energia dello stato fondamentale e l'energia stimata non sarà mai inferiore alla vera energia dello stato fondamentale.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n",
        "| Tolleranza al rumore          | La stima dell'energia VQE è suscettibile al rumore dei computer quantistici pre-fault-tolerant.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | L'SQD ha una tolleranza intrinseca al rumore. I computer quantistici pre-fault-tolerant possono produrre campioni rumorosi. Anche se includiamo questi campioni nel sottospazio, la successiva diagonalizzazione può sopprimere questi campioni azzerando le loro ampiezze. Inoltre, discuteremo un metodo chiamato *recupero della configurazione* in relazione all'SQD che migliora ulteriormente la tolleranza al rumore dell'SQD.                                                                                                                                                                                                                                                                                           |\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "de8f1df2-1ef9-4eea-9621-e17db8489c4c",
      "metadata": {},
      "source": [
        "<span id=\"6-summary\" />\n",
        "\n",
        "## 6. Riepilogo\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "103dfaf0-89c9-4b5d-bd70-fcdba4b5b4da",
      "metadata": {},
      "source": [
        "1. Nella SQD, un computer quantistico genera dei campioni e un computer classico proietta un'hamiltoniana su un sottospazio attraversato dai campioni e la diagonalizza per calcolare autovalori e autovettori.\n",
        "2. I campioni generati devono provenire dal supporto di stato target (ground).\n",
        "3. A seconda del problema, il flusso di preparazione dello stato quantistico e di generazione del campione può essere iterativo o non iterativo.\n",
        "4. L'SQD funziona meglio per le funzioni d'onda rade. Una funzione d'onda ampia richiede un ampio sottospazio per soluzioni accurate, il che rende costose le operazioni classiche di proiezione e diagonalizzazione.\n",
        "5. L'SQD presenta diversi vantaggi rispetto al VQE, come un minore overhead di misura e un limite superiore all'energia di stato fondamentale stimata, che lo rendono più scalabile.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "56c2ca63",
      "metadata": {},
      "source": [
        "<span id=\"references\" />\n",
        "\n",
        "## Riferimenti\n",
        "\n",
        "\\[1] J. Robledo-Moreno e altri, \"Chimica oltre le soluzioni esatte su un supercomputer incentrato sui quanti\" (2024). [arXiv:quant-ph/2405.05068](https://arxiv.org/abs/2405.05068).\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}