{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "212400e8-9fb9-4969-982c-8e13b369ef3d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Specificare gli osservabili nella base di Pauli\"\n",
        "description: \"Misurare i circuiti in diverse basi di Pauli, necessarie per misurare gli osservabili che non sono diagonali nella base computazionale.\"\n",
        "---\n",
        "\n",
        "<span id=\"specify-observables-in-the-pauli-basis\" />\n",
        "\n",
        "# Specificare gli osservabili nella base di Pauli\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "15c3654c-0235-44c4-9223-2251c24ef060",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"Versioni del pacchetto\">\n",
        "    Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti.\n",
        "    Si consiglia di utilizzare queste versioni o versioni più recenti.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a9c68a4e-189c-424b-9255-24226307c8ac",
      "metadata": {},
      "source": [
        "Nella meccanica quantistica, le osservabili corrispondono a proprietà fisiche che possono essere misurate.\n",
        "Se si considera un sistema di spin, ad esempio, si potrebbe essere interessati a misurare l'energia del sistema o a ottenere informazioni sull'allineamento degli spin, come la magnetizzazione o le correlazioni tra gli spin.\n",
        "\n",
        "Per misurare un'osservabile $n$ -qubit $O$ su un computer quantistico, è necessario rappresentarla come una somma di prodotti tensoriali di operatori di Pauli, cioè\n",
        "\n",
        "$$\n",
        "O = \\sum_{k=1}^K \\alpha_k P_k,~~ P_k \\in \\{I, X, Y, Z\\}^{\\otimes n},~~ \\alpha_k \\in \\mathbb{R},\n",
        "$$\n",
        "\n",
        "Dove\n",
        "\n",
        "$$\n",
        "I = \\begin{pmatrix}\n",
        "1 & 0 \\\\ 0 & 1\n",
        "\\end{pmatrix}\n",
        "~~\n",
        "X = \\begin{pmatrix}\n",
        "0 & 1 \\\\ 1 & 0\n",
        "\\end{pmatrix}\n",
        "~~\n",
        "Y = \\begin{pmatrix}\n",
        "0 & -i \\\\ i & 0\n",
        "\\end{pmatrix}\n",
        "~~\n",
        "Z = \\begin{pmatrix}\n",
        "1 & 0 \\\\ 0 & -1\n",
        "\\end{pmatrix}\n",
        "$$\n",
        "\n",
        "e si utilizza il fatto che un'osservabile è ermitiana, come in $O^\\dagger = O$. Se $O$ non è hermitiano, può ancora essere decomposto come una somma di Paulis, ma il coefficiente $\\alpha_k$ diventa complesso.\n",
        "\n",
        "In molti casi, l'osservabile è naturalmente specificata in questa rappresentazione dopo aver mappato il sistema di interesse in qubit.\n",
        "Ad esempio, un sistema spin-1/2 può essere mappato su un'hamiltoniana di Ising\n",
        "\n",
        "$$\n",
        "H = \\sum_{\\langle i, j\\rangle} Z_i Z_j - \\sum_{i=1}^n X_i,\n",
        "$$\n",
        "\n",
        "dove gli indici $\\langle i, j\\rangle$ si applicano agli spin interagenti e gli spin sono soggetti a un campo trasversale in $X$.\n",
        "L'indice in apice indica su quale qubit agisce l'operatore di Pauli; in altre parole, $X_i$ applica un operatore $X$ al qubit $i$ e lascia gli altri invariati.\n",
        "\n",
        "Nell'SDK di Qiskit, questa hamiltoniana può essere costruita con il seguente codice.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "7a06c7c4-582d-47ef-951e-52b40c1bfffb",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "SparsePauliOp(['IIIIIIIIIIZZ', 'IIIIIIIIIZZI', 'IIIIIIIIZZII', 'IIIIIIIZZIII', 'IIIIIIZZIIII', 'IIIIIZZIIIII', 'IIIIZZIIIIII', 'IIIZZIIIIIII', 'IIZZIIIIIIII', 'IZZIIIIIIIII', 'ZZIIIIIIIIII', 'IIIIIIIIIIIX', 'IIIIIIIIIIXI', 'IIIIIIIIIXII', 'IIIIIIIIXIII', 'IIIIIIIXIIII', 'IIIIIIXIIIII', 'IIIIIXIIIIII', 'IIIIXIIIIIII', 'IIIXIIIIIIII', 'IIXIIIIIIIII', 'IXIIIIIIIIII', 'XIIIIIIIIIII'],\n",
            "              coeffs=[ 1.+0.j,  1.+0.j,  1.+0.j,  1.+0.j,  1.+0.j,  1.+0.j,  1.+0.j,  1.+0.j,\n",
            "  1.+0.j,  1.+0.j,  1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j,\n",
            " -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j, -1.+0.j])\n"
          ]
        }
      ],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "# define the number of qubits\n",
        "n = 12\n",
        "\n",
        "# define the single Pauli terms as (\"Paulis\", [indices], coefficient)\n",
        "interactions = [\n",
        "    (\"ZZ\", [i, i + 1], 1) for i in range(n - 1)\n",
        "]  # we assume spins on a 1D line\n",
        "field = [(\"X\", [i], -1) for i in range(n)]\n",
        "\n",
        "# build the operator\n",
        "hamiltonian = SparsePauliOp.from_sparse_list(\n",
        "    interactions + field, num_qubits=n\n",
        ")\n",
        "print(hamiltonian)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a8624db2-9658-48e4-ae16-d2dcabe1d822",
      "metadata": {},
      "source": [
        "Se vogliamo misurare l'energia, l'osservabile è l'hamiltoniana stessa. In alternativa, potremmo essere misurare le proprietà del sistema, come la magnetizzazione media, contando il numero di spins allineati nella direzione $Z$ con l'osservabile\n",
        "\n",
        "$$\n",
        "O = \\frac{1}{n} \\sum_{i=1} Z_i\n",
        "$$\n",
        "\n",
        "Per le osservabili che non sono date in termini di operatori di Pauli ma in forma matriciale, dobbiamo prima riformularle in base Pauli per poterle valutare su un computer quantistico nella base di Pauli per poterli valutare su un computer quantistico.\n",
        "Siamo sempre in grado di trovare una rappresentazione di questo tipo, poiché le matrici di Pauli formano una base per le matrici Hermitiane $2^n \\times 2^n$.\n",
        "Espandiamo l'osservabile $O$ come\n",
        "\n",
        "$$\n",
        "O =\n",
        "\\frac{1}{2^n}\n",
        "\\sum_{P \\in \\{I, X, Y, Z\\}^{\\otimes n}}\n",
        "\\mathrm{Tr}(O P) P,\n",
        "$$\n",
        "\n",
        "dove la somma si estende su tutti i possibili termini di Pauli a -qubit di tipo $n$ e $\\mathrm{Tr}(\\cdot)$ è la traccia di una matrice, che funge da prodotto interno. Il fattore $1/2^n$ descrive la normalizzazione di Hilbert-Schmidt delle stringhe di Pauli a -qubit $n$.\n",
        "È possibile implementare questa scomposizione da una matrice in termini di Pauli utilizzando il `SparsePauliOp.from_operator` metodo, in questo modo:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "82856434-b283-4bb2-a9b0-300c2c9388af",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "SparsePauliOp(['IZ', 'XI', 'YY'],\n",
            "              coeffs=[-1. +0.j,  0.5+0.j,  1. -0.j])\n"
          ]
        }
      ],
      "source": [
        "import numpy as np\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "\n",
        "matrix = np.array(\n",
        "    [[-1, 0, 0.5, -1], [0, 1, 1, 0.5], [0.5, 1, -1, 0], [-1, 0.5, 0, 1]]\n",
        ")\n",
        "\n",
        "observable = SparsePauliOp.from_operator(matrix)\n",
        "print(observable)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "444aa9c6-1b6f-4834-a96d-1fcba9e0a3af",
      "metadata": {},
      "source": [
        "Ciò significa che la matrice può essere scritta in termini di Pauli come $O = -Z_1 + 0.5 X_2 + Y_2 Y_1$.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Ricordiamo che l'ordine del prodotto tensoriale mappa i qubit come $q_n \\otimes q_{n-1} \\otimes \\cdots \\otimes q_1$.\n",
        "</Admonition>\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Se l'osservabile è hermitiana (cioè $O^\\dagger = O$ ), i coefficienti di Pauli sono numeri reali.\n",
        "  Tuttavia, possiamo anche decomporre qualsiasi altra matrice complessa in termini di Paulis, se ammettiamo coefficienti di valore complesso.\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"measure-in-pauli-bases\" />\n",
        "\n",
        "## Misura nelle basi di Pauli\n",
        "\n",
        "Una misura proietta lo stato del qubit nella base computazionale $\\{|0\\rangle, |1\\rangle\\}$. Ciò implica che si possono misurare solo le osservabili che sono diagonali in questa base, come ad esempio la Paulis che consiste solo di termini $I$ e $Z$.\n",
        "La misurazione di termini di Pauli arbitrari richiede quindi un cambio di base per diagonalizzarli. A tal fine, eseguire le seguenti trasformazioni,\n",
        "\n",
        "$$\n",
        "\\begin{aligned}\n",
        "    X &\\rightarrow Z = H X H \\\\\n",
        "    Y &\\rightarrow Z = H S^\\dagger Y S H,\n",
        "\\end{aligned}\n",
        "$$\n",
        "\n",
        "dove $H$ è il gate di Hadamard e $S = \\sqrt{Z}$ è talvolta indicato come gate di fase.\n",
        "Se si utilizza un [Estimator](/docs/api/qiskit/1.4/qiskit.primitives.Estimator) per calcolare i valori di aspettativa, le trasformazioni di base vengono eseguite automaticamente.\n",
        "\n",
        "Di seguito è riportato un esempio che dimostra come preparare un circuito quantistico e misurare manualmente il qubit 0 nella base X, il qubit 1 nella base Y e il qubit 2 nella base Z.\n",
        "Applicando le trasformazioni indicate nell'equazione precedente, si ottiene il seguente circuito:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "ce4b1984-ebe0-44f6-a78c-d67b9e9bb361",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/specify-observables-pauli/extracted-outputs/ce4b1984-ebe0-44f6-a78c-d67b9e9bb361-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit import QuantumCircuit\n",
        "\n",
        "# create a circuit, where we would like to measure\n",
        "# q0 in the X basis, q1 in the Y basis and q2 in the Z basis\n",
        "circuit = QuantumCircuit(3)\n",
        "circuit.ry(0.8, 0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.cx(1, 2)\n",
        "circuit.barrier()\n",
        "\n",
        "# diagonalize X with the Hadamard gate\n",
        "circuit.h(0)\n",
        "\n",
        "# diagonalize Y with Hadamard as S^\\dagger\n",
        "circuit.sdg(1)\n",
        "circuit.h(1)\n",
        "\n",
        "# the Z basis is the default, no action required here\n",
        "\n",
        "# measure all qubits\n",
        "circuit.measure_all()\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e52d357-b225-4c50-abba-7d78211e2fa5",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Passi successivi\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Suggerimenti\">\n",
        "  * Leggete il riferimento all' [API SparsePauliOp](/docs/api/qiskit/qiskit.quantum_info.SparsePauliOp#sparsepauliop).\n",
        "</Admonition>\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
}