{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "4a4b88ed-d21f-4056-9264-0ee8c8ec4b39",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Exakte und verrauschte Simulation mit Qiskit Aer-Primitiven\"\n",
        "description: \"Erfahren Sie, wie Sie mit Qiskit Aer-Primitiven exakte und verrauschte Simulationen von Quantenprogrammen durchführen können\"\n",
        "---\n",
        "\n",
        "<span id=\"exact-and-noisy-simulation-with-qiskit-aer-primitives\" />\n",
        "\n",
        "# Exakte und verrauschte Simulation mit Qiskit Aer-Primitiven\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "678b9055-9164-417c-9897-9fde615b97ae",
      "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=\"Paketversionen\">\n",
        "    Der Code auf dieser Seite wurde unter Berücksichtigung der folgenden Anforderungen entwickelt.\n",
        "    Wir empfehlen die Verwendung dieser oder neuerer Versionen.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a0ae8b1-b413-44ac-9267-fd36345a02df",
      "metadata": {},
      "source": [
        "[Die exakte Simulation mit den „ Qiskit SDK “-Primitiven](/docs/guides/simulate-with-qiskit-sdk-primitives) veranschaulicht, wie man die in Qiskit enthaltenen Referenzprimitive nutzt, um eine exakte Simulation von Quantenschaltungen durchzuführen. Derzeitige Quantenprozessoren sind anfällig für Fehler bzw. Rauschen, sodass die Ergebnisse einer exakten Simulation nicht unbedingt den Ergebnissen entsprechen, die man erwarten würde, wenn man Schaltkreise auf echter Hardware ausführen würde. Während die Referenzprimitive in Qiskit keine Rauschmodellierung unterstützen, enthält [Qiskit Aer](https://qiskit.org/ecosystem/aer/) Implementierungen der Primitive, die eine Rauschmodellierung unterstützen. Qiskit Aer ist ein leistungsstarker Quantenkreis-Simulator, den Sie anstelle der Referenzprimitive verwenden können, um eine bessere Leistung und mehr Funktionen zu erzielen. Es ist Teil des [Qiskit-Ökosystems](https://qiskit.github.io/ecosystem/). In diesem Artikel veranschaulichen wir die Verwendung von Qiskit Aer-Primitiven für exakte und verrauschte Simulationen.\n",
        "\n",
        "<Admonition type=\"note\" title=\"Hinweise\">\n",
        "  * `qiskit-aer` v0.14 oder später ist erforderlich.\n",
        "  * Die Qiskit-Aer-Primitiven implementieren zwar die Primitivschnittstellen, bieten jedoch nicht dieselben Optionen wie die Primitive von „ IBM Quantum “. Die Resilienzstufe ist beispielsweise bei den Qiskit Aer-Primitiven nicht verfügbar.\n",
        "  * Einzelheiten zu den von Aer unterstützten Simulationsmethoden finden Sie in der [Dokumentation AerSimulator](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator).\n",
        "</Admonition>\n",
        "\n",
        "Um die genaue und verrauschte Simulation zu erkunden, erstellen Sie eine Beispielschaltung mit acht Qubits:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "df70b5fd-971d-4e7d-a23a-8df037c0fa47",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-aer/extracted-outputs/df70b5fd-971d-4e7d-a23a-8df037c0fa47-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "n_qubits = 8\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2074eaf0-746e-4a36-91d9-db9228f96a0d",
      "metadata": {},
      "source": [
        "Diese Schaltung enthält Parameter zur Darstellung der Drehwinkel für die Gatter $R_y$ und $R_z$. Bei der Simulation dieser Schaltung müssen wir explizite Werte für diese Parameter angeben. In der nächsten Zelle geben wir einige Werte für diese Parameter an und verwenden das Estimator-Primitiv von Qiskit Aer, um den genauen Erwartungswert der beobachtbaren $ZZ \\cdots Z$ zu berechnen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "40270ca7-1084-4329-aac5-28c87edc3791",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.8870140234256602"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_aer import AerSimulator\n",
        "from qiskit_aer.primitives import EstimatorV2 as Estimator\n",
        "\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)\n",
        "params = [0.1] * circuit.num_parameters\n",
        "\n",
        "exact_estimator = Estimator()\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(3, AerSimulator())\n",
        "isa_circuit = pass_manager.run(circuit)\n",
        "pub = (isa_circuit, observable, params)\n",
        "job = exact_estimator.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "exact_value = float(pub_result.data.evs)\n",
        "exact_value"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "134d97a2-8420-4931-85b4-324679655e24",
      "metadata": {},
      "source": [
        "Initialisieren wir nun ein Rauschmodell, das bei jedem CX-Gate einen Depolarisationsfehler von 2 % berücksichtigt. In der Praxis sind die Fehler, die durch die Zwei-Qubit-Gatter – in diesem Fall CX-Gatter – verursacht werden, die Hauptfehlerquelle bei der Ausführung einer Schaltung. Einen Überblick über die Erstellung von Lärmmodellen in Qiskit Aer finden Sie unter „[Lärmmodelle erstellen](/docs/guides/build-noise-models) “.\n",
        "\n",
        "In der nächsten Zelle konstruieren wir einen Schätzer, der dieses Rauschmodell einbezieht, und verwenden ihn zur Berechnung des Erwartungswerts der Beobachtungsgröße.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "82b2f19a-ba10-46a2-ba1b-89cd27bc0e63",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.7247404214143529"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_aer.noise import NoiseModel, depolarizing_error\n",
        "\n",
        "noise_model = NoiseModel()\n",
        "cx_depolarizing_prob = 0.02\n",
        "noise_model.add_all_qubit_quantum_error(\n",
        "    depolarizing_error(cx_depolarizing_prob, 2), [\"cx\"]\n",
        ")\n",
        "\n",
        "noisy_estimator = Estimator(\n",
        "    options=dict(backend_options=dict(noise_model=noise_model))\n",
        ")\n",
        "job = noisy_estimator.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "noisy_value = float(pub_result.data.evs)\n",
        "noisy_value"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6495f179-3fe6-4971-b023-700b8b2c8cbb",
      "metadata": {},
      "source": [
        "Wie Sie sehen können, ist der Erwartungswert bei Vorhandensein von Rauschen ziemlich weit vom richtigen Wert entfernt. In der Praxis können Sie eine Vielzahl von Fehlerminderungstechniken einsetzen, um den Auswirkungen des Rauschens entgegenzuwirken, aber eine Diskussion dieser Techniken würde den Rahmen dieses Artikels sprengen.\n",
        "\n",
        "Um ein grobes Gefühl dafür zu bekommen, wie sich das Rauschen auf das Endergebnis auswirkt, betrachten wir unser Rauschmodell, das jedem CX-Gate einen depolarisierenden Fehler von 2 % hinzufügt. Der depolarisierende Fehler mit der Wahrscheinlichkeit $p$ ist definiert als ein Quantenkanal $E$, der die folgende Wirkung auf eine Dichtematrix $\\rho$ hat:\n",
        "\n",
        "$$\n",
        "E(\\rho) = (1 - p) \\rho + p\\frac{I}{2^n}\n",
        "$$\n",
        "\n",
        "wobei $n$ die Anzahl der Qubits, in diesem Fall 2, ist. Das heißt, mit der Wahrscheinlichkeit $p$ wird der Zustand durch den vollständig gemischten Zustand ersetzt, und mit der Wahrscheinlichkeit $1 - p$ wird der Zustand erhalten. Nach $m$ Anwendungen des depolarisierenden Kanals wäre die Wahrscheinlichkeit, dass der Zustand erhalten bleibt, $(1 - p)^m$. Daher erwarten wir, dass die Wahrscheinlichkeit, den korrekten Zustand am Ende der Simulation beizubehalten, exponentiell mit der Anzahl der CX-Gatter in unserer Schaltung abnimmt.\n",
        "\n",
        "Zählen wir die Anzahl der CX-Gatter in unserer Schaltung und berechnen wir $(1 - p)^m$. Wir rufen `count_ops` auf, um ein Wörterbuch zu erhalten, das Gatternamen auf Zählungen abbildet, und rufen den Eintrag für das CX-Gatter ab.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3c20f7bc-203a-4f40-bb84-7cf3d231d66e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.6542558123199923"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "cx_count = circuit.count_ops()[\"cx\"]\n",
        "(1 - cx_depolarizing_prob) ** cx_count"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef506e15-7480-46ba-bce7-aa8f2fa78377",
      "metadata": {},
      "source": [
        "Dieser Wert, 65 %, gibt eine grobe Schätzung der Wahrscheinlichkeit, dass unser Endzustand korrekt ist. Es handelt sich um eine konservative Schätzung, da der Anfangszustand der Simulation nicht berücksichtigt wird.\n",
        "\n",
        "Die folgende Codezelle zeigt, wie das Sampler-Primitiv von Qiskit Aer verwendet wird, um den verrauschten Schaltkreis abzutasten. Wir müssen der Schaltung Messungen hinzufügen, bevor wir sie mit dem Sampler-Primitiv ausführen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "76c43aee-d559-4e5b-8228-e5bba3b4499c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'00000000': 69,\n",
              " '00100000': 2,\n",
              " '00000110': 1,\n",
              " '11000000': 2,\n",
              " '00010100': 1,\n",
              " '01100000': 2,\n",
              " '01010000': 3,\n",
              " '00101000': 1,\n",
              " '10100000': 2,\n",
              " '01100101': 1,\n",
              " '00001010': 1,\n",
              " '10000000': 2,\n",
              " '00000010': 3,\n",
              " '01000000': 4,\n",
              " '11100000': 1,\n",
              " '10000101': 1,\n",
              " '00110000': 1,\n",
              " '00001100': 1,\n",
              " '00011000': 2}"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_aer.primitives import SamplerV2 as Sampler\n",
        "\n",
        "measured_circuit = circuit.copy()\n",
        "measured_circuit.measure_all()\n",
        "\n",
        "noisy_sampler = Sampler(\n",
        "    options=dict(backend_options=dict(noise_model=noise_model))\n",
        ")\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(3, AerSimulator())\n",
        "isa_circuit = pass_manager.run(measured_circuit)\n",
        "pub = (isa_circuit, params, 100)\n",
        "job = noisy_sampler.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "pub_result.data.meas.get_counts()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "46a8c6b7-3f7c-48e4-9b73-b04a5458ba33",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Informationen zur Simulation kleiner, einfacher Schaltungen finden Sie unter „[Exakte Simulation mit Primitiven aus ‚ Qiskit SDK ‘](/docs/guides/simulate-with-qiskit-sdk-primitives) “.\n",
        "  * Lesen Sie die [Qiskit Aer-Dokumentation](https://qiskit.github.io/qiskit-aer/).\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": 4
}