{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "3b140909-ace6-4665-a0bf-f3bb9bd094c0",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Exakte Simulation mit Primitiven der „ Qiskit SDK “\"\n",
        "description: \"Wie man mit Primitiven in Qiskit eine exakte Simulation von Quantenschaltungen durchführt.\"\n",
        "---\n",
        "\n",
        "<span id=\"exact-simulation-with-qiskit-sdk-primitives\" />\n",
        "\n",
        "# Exakte Simulation mit Primitiven der „ Qiskit SDK “\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b820ca5f-60cc-41c7-98db-4b41df4534cc",
      "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",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "867f73c6-dd57-4755-9bbd-55ffffe7e09e",
      "metadata": {},
      "source": [
        "Die Referenzprimitive im „ Qiskit SDK “ führen lokale Zustandsvektor-Simulationen durch. Diese Simulationen unterstützen zwar keine\n",
        "Modellierung von Geräuschrauschen der Geräte, eignen sich jedoch gut für die schnelle Prototypenerstellung von Algorithmen, bevor man sich mit fortgeschritteneren Simulationstechniken\n",
        "( [unter Verwendung von Qiskit Aer](/docs/guides/simulate-stabilizer-circuits) ) befasst oder die Algorithmen auf echten Geräten ausführt ( [mit IBM Quantum -Primitiven](primitives) ).\n",
        "\n",
        "Das Estimator-Primitiv kann die Erwartungswerte von Schaltkreisen berechnen, und das Sampler-Primitiv kann Stichproben von Ausgangsverteilungen von Schaltkreisen.\n",
        "\n",
        "In den folgenden Abschnitten wird gezeigt, wie Sie die Referenzprimitive verwenden, um Ihren Workflow lokal auszuführen.\n",
        "\n",
        "<span id=\"use-the-reference-estimator\" />\n",
        "\n",
        "## Verwenden Sie den Referenzschätzer\n",
        "\n",
        "Die Referenzimplementierung von `EstimatorV2` in `qiskit.primitives` , die auf einem lokalen Zustandsvektor läuft simulatoren läuft, ist die [`StatevectorEstimator`](../api/qiskit/qiskit.primitives.StatevectorEstimator) klasse. Sie kann Schaltkreise, Beobachtungswerte und Parameter als Eingaben annehmen und gibt die lokal berechneten Erwartungswerte zurück.\n",
        "\n",
        "Der folgende Code bereitet die Eingaben vor, die in den nachfolgenden Beispielen verwendet werden. Der erwartete Eingabetyp für die\n",
        "Observables ist [`qiskit.quantum_info.SparsePauliOp`](../api/qiskit/qiskit.quantum_info.SparsePauliOp). Beachten Sie, dass\n",
        "die Schaltung im Beispiel parametrisiert ist, Sie Estimator jedoch auch auf nicht parametrisierten Schaltungen ausführen können.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  Jede Schaltung, die an einen Estimator weitergegeben wird, darf **keine** **Messungen** enthalten.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "5b41a52d-8f15-4ce4-b3f6-effd91946d9c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-sdk-primitives/extracted-outputs/5b41a52d-8f15-4ce4-b3f6-effd91946d9c-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.circuit import Parameter\n",
        "\n",
        "# circuit for which you want to obtain the expected value\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.ry(Parameter(\"theta\"), 0)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.draw(\"mpl\", style=\"iqp\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "18658518-304a-49a7-8958-82adef366de6",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "import numpy as np\n",
        "\n",
        "# observable(s) whose expected values you want to compute\n",
        "\n",
        "observable = SparsePauliOp([\"II\", \"XX\", \"YY\", \"ZZ\"], coeffs=[1, 1, -1, 1])\n",
        "\n",
        "# value(s) for the circuit parameter(s)\n",
        "parameter_values = [[0], [np.pi / 6], [np.pi / 2]]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4c39904c-d586-41b9-ade0-e6a508ef7c2e",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\" title=\"Transpile zu ISA-Schaltungen und Observablen\">\n",
        "  Der „ IBM Quantum “-Primitives-Workflow erfordert, dass Schaltkreise und Observables so umgewandelt werden, dass sie ausschließlich von der QPU unterstützte Befehle verwenden (diese werden als *„Instruction Set Architecture“ (ISA)* -Schaltkreise und -Observables bezeichnet). Die Referenzprimitive akzeptieren nach wie vor abstrakte Befehle, da sie auf Simulationen mit lokalen Zustandsvektoren basieren; dennoch könnte das Transpiling der Schaltung im Hinblick auf die Schaltungsoptimierung von Vorteil sein.\n",
        "\n",
        "  ```python\n",
        "  # Generate a pass manager without providing a backend\n",
        "  from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "  pm = generate_preset_pass_manager(optimization_level=1)\n",
        "  isa_circuit = pm.run(circuit)\n",
        "  isa_observable = observable.apply_layout(isa_circuit.layout)\n",
        "  ```\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"initialize-estimator\" />\n",
        "\n",
        "### Initialisieren Sie den Schätzer\n",
        "\n",
        "A instanziieren [`qiskit.primitives.StatevectorEstimator`](../api/qiskit/qiskit.primitives.StatevectorEstimator).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "56f39026-7874-4f14-8529-b97df373eaf5",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.primitives import StatevectorEstimator\n",
        "\n",
        "estimator = StatevectorEstimator()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9c4c81b1-8b87-450d-9a93-4f209364ee83",
      "metadata": {},
      "source": [
        "<span id=\"run-and-get-results\" />\n",
        "\n",
        "### Laufen und Ergebnisse erzielen\n",
        "\n",
        "Dieses Beispiel verwendet nur einen Stromkreis (vom Typ [`QuantumCircuit`](../api/qiskit/qiskit.circuit.QuantumCircuit)) und eine beobachtbar.\n",
        "\n",
        "Führen Sie die Schätzung aus, indem Sie die [`StatevectorEstimator.run`](../api/qiskit/qiskit.primitives.StatevectorEstimator#run) methode, die eine Instanz eines [`PrimitiveJob`](/docs/api/qiskit/qiskit.primitives.PrimitiveJob) objekts zurückgibt. Sie können die Ergebnisse des Auftrags (als [`qiskit.primitives.PrimitiveResult`](../api/qiskit/qiskit.primitives.PrimitiveResult) objekt) mit der [`qiskit.primitives.PrimitiveJob.result`](../api/qiskit/qiskit.primitives.PrimitiveJob#result) methode.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "0c424291-abb3-420c-80e1-a09ecbd6c035",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Result class: <class 'qiskit.primitives.containers.primitive_result.PrimitiveResult'>\n"
          ]
        }
      ],
      "source": [
        "job = estimator.run([(circuit, observable, parameter_values)])\n",
        "result = job.result()\n",
        "print(f\" > Result class: {type(result)}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "871ce7d6-402c-417f-8a83-805d92fa0298",
      "metadata": {},
      "source": [
        "<span id=\"get-the-expected-value-from-the-result\" />\n",
        "\n",
        "#### Den erwarteten Wert aus dem Ergebnis ermitteln\n",
        "\n",
        "Das Ergebnis der Primitive gibt ein Array von [`PubResult`](/docs/api/qiskit/qiskit.primitives.PubResult#pubresult) Objekten aus, wobei jedes Element des Arrays ein `PubResult` Objekt ist, das in seinen Daten das Array der Auswertungen enthält, die jeder Kombination von Schaltkreisen und Beobachtungsgrößen in der PUB entsprechen.\n",
        "\n",
        "Um die Erwartungswerte und Metadaten für die erste (und in diesem Fall einzige) Schaltkreisauswertung abzurufen, müssen wir auf die Auswertung zugreifen [`data`](/docs/api/qiskit/qiskit.primitives.PubResult#data) für PUB 0 zugreifen:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "145b3f62-dfaf-4288-8764-f2ecb90e38a1",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Expectation value: [4.         3.73205081 2.        ]\n",
            " > Metadata: {'target_precision': 0.0, 'circuit_metadata': {}}\n"
          ]
        }
      ],
      "source": [
        "print(f\" > Expectation value: {result[0].data.evs}\")\n",
        "print(f\" > Metadata: {result[0].metadata}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e29ec8cc-2c38-464a-a8b3-8f05b282c807",
      "metadata": {},
      "source": [
        "<span id=\"set-estimator-run-options\" />\n",
        "\n",
        "### Optionen für die Ausführung des Schätzer-Sets festlegen\n",
        "\n",
        "Standardmäßig führt der Reference Estimator eine exakte Zustandsvektorberechnung auf der Grundlage des [`quantum_info.Statevector`](../api/qiskit/qiskit.quantum_info.Statevector) klasse.\n",
        "Dies kann jedoch geändert werden, um den Effekt des Sampling-Overheads (auch bekannt als \"Shot Noise\") einzuführen.\n",
        "\n",
        "Estimator akzeptiert ein `precision` Argument, das die Fehlerbalken ausdrückt, die die primitive Implementierung für Erwartungswertschätzungen anstreben sollte.  Dies ist der Stichproben-Overhead und wird ausschließlich in der Methode `.run()` definiert. Auf diese Weise können Sie die Option bis hin zur Ebene PUB feineinstellen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "04047e7a-23f4-431b-8e3a-11edf035e8fc",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Estimate expectation values for two PUBs, both with 0.05 precision.\n",
        "precise_job = estimator.run(\n",
        "    [(circuit, observable, parameter_values)], precision=0.05\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d54f110f-004a-4337-8b4d-7d4287f22be9",
      "metadata": {},
      "source": [
        "Ein vollständiges Beispiel finden Sie auf der Seite [mit den Estimator-Beispielen](/docs/guides/estimator-examples).\n",
        "\n",
        "<span id=\"use-the-reference-sampler\" />\n",
        "\n",
        "## Verwenden Sie den Referenz-Sampler\n",
        "\n",
        "Die Referenzimplementierung von `SamplerV2` in `qiskit.primitives` ist die [`StatevectorSampler`](../api/qiskit/qiskit.primitives.StatevectorSampler) klasse. Es nimmt Schaltkreise und Parameter als Eingaben und liefert die Ergebnisse der Stichproben aus den Wahrscheinlichkeitsverteilungen der Ausgänge als Quasi-Wahrscheinlichkeitsverteilung der Ausgangszustände.\n",
        "\n",
        "Der folgende Code bereitet die Eingaben vor, die in den nachfolgenden Beispielen verwendet werden. Beachten Sie, dass\n",
        "diese Beispiele eine einzelne parametrisierte Schaltung ausführen, Sie Sampler jedoch auch\n",
        "auf nicht-parametrisierten Schaltungen ausführen können.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "d4c0ac3b-8e5b-4cde-bb26-256324982c2c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-sdk-primitives/extracted-outputs/d4c0ac3b-8e5b-4cde-bb26-256324982c2c-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure_all()\n",
        "circuit.draw(\"mpl\", style=\"iqp\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34ae490-9efb-45f5-937d-3ce86afa445f",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  Jeder Quantenkreis, der an einen Sampler übergeben wird **, muss** Messungen enthalten.\n",
        "</Admonition>\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Transpile zu ISA-Schaltungen und Observablen\">\n",
        "  Der „ IBM Quantum “-Primitives-Workflow erfordert, dass Schaltkreise so umgewandelt werden, dass sie ausschließlich von der QPU unterstützte Befehle verwenden (sogenannte ISA-Schaltkreise). Die Referenzprimitive akzeptieren nach wie vor abstrakte Befehle, da sie auf Simulationen mit lokalen Zustandsvektoren basieren; dennoch könnte das Transpiling der Schaltung im Hinblick auf die Schaltungsoptimierung von Vorteil sein.\n",
        "\n",
        "  ```python\n",
        "  # Generate a pass manager without providing a backend\n",
        "  from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "  pm = generate_preset_pass_manager(optimization_level=1)\n",
        "  isa_circuit = pm.run(qc)\n",
        "  ```\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"initialize-samplerv2\" />\n",
        "\n",
        "### Initialisieren `SamplerV2`\n",
        "\n",
        "Instanziieren [`qiskit.primitives.StatevectorSampler`](../api/qiskit/qiskit.primitives.StatevectorSampler):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "626177e7-f06a-4216-89c8-daf703520457",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.primitives import StatevectorSampler\n",
        "\n",
        "sampler = StatevectorSampler()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "626fb8d6-75ae-47b2-ac0b-00acc4ce5afe",
      "metadata": {},
      "source": [
        "<span id=\"run-and-get-results\" />\n",
        "\n",
        "### Laufen und Ergebnisse erzielen\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "19659756-a01d-42ec-8fa7-d7a1bf2303d5",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Result class: <class 'qiskit.primitives.containers.sampler_pub_result.SamplerPubResult'>\n"
          ]
        }
      ],
      "source": [
        "# execute 1 circuit with Sampler\n",
        "job = sampler.run([circuit])\n",
        "pub_result = job.result()[0]\n",
        "print(f\" > Result class: {type(pub_result)}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee6d88f3-0115-4ea9-a2c5-633906841d9f",
      "metadata": {},
      "source": [
        "Primitive akzeptieren mehrere PUBs als Eingaben, und jedes PUB erhält sein eigenes Ergebnis. Daher können Sie verschiedene Schaltkreise mit unterschiedlichen Kombinationen von Parametern/Beobachtungswerten ausführen und die Ergebnisse von PUB abrufen:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "fb91dbfc-0340-4ea6-8d33-95357d7907e3",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Result class: <class 'qiskit.primitives.containers.sampler_pub_result.SamplerPubResult'>\n"
          ]
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "# create two circuits\n",
        "circuit1 = circuit.copy()\n",
        "circuit2 = circuit.copy()\n",
        "\n",
        "# transpile circuits\n",
        "pm = generate_preset_pass_manager(optimization_level=1)\n",
        "isa_circuit1 = pm.run(circuit1)\n",
        "isa_circuit2 = pm.run(circuit2)\n",
        "# execute 2 circuits using Sampler\n",
        "job = sampler.run([(isa_circuit1), (isa_circuit2)])\n",
        "pub_result_1 = job.result()[0]\n",
        "pub_result_2 = job.result()[1]\n",
        "print(f\" > Result class: {type(pub_result)}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e7b2199-3c00-477a-a248-824b442431b5",
      "metadata": {},
      "source": [
        "<span id=\"get-the-probability-distribution-or-measurement-outcome\" />\n",
        "\n",
        "### Die Wahrscheinlichkeitsverteilung oder das Messergebnis ermitteln\n",
        "\n",
        "Stichproben von Messergebnissen werden als **Bitstrings** oder **Zählungen** zurückgegeben. Die Bitstrings zeigen die Messergebnisse unter Beibehaltung der Schussreihenfolge, in der sie gemessen wurden. Die Sampler-Ergebnisobjekte organisieren die Daten in Form der klassischen Registernamen ihrer Eingangsschaltungen, um mit dynamischen Schaltungen kompatibel zu sein.\n",
        "\n",
        "<Admonition>\n",
        "  Der Name des klassischen Registers lautet standardmäßig `\"meas\"`. Dieser Name wird später für den Zugriff auf die Messungs-Bitstrings verwendet.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "1dc395b4-5716-44be-9622-7c99df95616b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "        ┌───┐      ░ ┌─┐   \n",
              "   q_0: ┤ H ├──■───░─┤M├───\n",
              "        └───┘┌─┴─┐ ░ └╥┘┌─┐\n",
              "   q_1: ─────┤ X ├─░──╫─┤M├\n",
              "             └───┘ ░  ║ └╥┘\n",
              "meas: 2/══════════════╩══╩═\n",
              "                      0  1 "
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Define quantum circuit with 2 qubits\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure_all()\n",
        "circuit.draw()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "27a2847b-6553-4c73-9b8a-85ba28725ed8",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of bitstrings is: 1024\n",
            "The counts are: {'00': 513, '11': 511}\n"
          ]
        }
      ],
      "source": [
        "# Transpile circuit\n",
        "pm = generate_preset_pass_manager(optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "# Run using Sampler\n",
        "result = sampler.run([circuit]).result()\n",
        "# Access result data for PUB 0\n",
        "data_pub = result[0].data\n",
        "# Access bitstring for the classical register \"meas\"\n",
        "bitstrings = data_pub.meas.get_bitstrings()\n",
        "print(f\"The number of bitstrings is: {len(bitstrings)}\")\n",
        "# Get counts for the classical register \"meas\"\n",
        "counts = data_pub.meas.get_counts()\n",
        "print(f\"The counts are: {counts}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "de705fab-e718-4924-a03f-f19bdf6578d8",
      "metadata": {},
      "source": [
        "<span id=\"change-run-options\" />\n",
        "\n",
        "### Ausführungsoptionen ändern\n",
        "\n",
        "Standardmäßig führt der Referenz-Sampler eine exakte Zustandsvektorberechnung auf der Grundlage des [`quantum_info.Statevector`](../api/qiskit/qiskit.quantum_info.Statevector) klasse.\n",
        "Dies kann jedoch geändert werden, um den Effekt des Sampling-Overheads (auch bekannt als \"Shot Noise\") einzuführen. Um diesen Overhead zu verwalten, akzeptiert die Sampler-Schnittstelle ein `shots` Argument, das auf der PUB Ebene definiert werden kann.\n",
        "\n",
        "In diesem Beispiel wird davon ausgegangen, dass Sie zwei Stromkreise definiert haben.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "927faaab-60c0-4b73-bf53-72f7c4c9ad65",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<qiskit.primitives.primitive_job.PrimitiveJob at 0x1297391d0>"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Sample two circuits at 128 shots each.\n",
        "sampler.run([isa_circuit1, isa_circuit2], shots=128)\n",
        "# Sample two circuits at different amounts of shots. The \"None\"s are necessary\n",
        "# as placeholders\n",
        "# for the lack of parameter values in this example.\n",
        "sampler.run([(isa_circuit1, None, 123), (isa_circuit2, None, 456)])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1c0e76fe-4b5d-4fd4-9eec-da5332d76cfb",
      "metadata": {},
      "source": [
        "Ein vollständiges Beispiel finden Sie auf der Seite [mit den Sampler-Beispielen](/docs/guides/sampler-examples).\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Für eine leistungsstärkere Simulation, die größere Schaltungen verarbeiten kann, oder um Rauschmodelle in Ihre Simulation einzubeziehen, siehe [Exakte und verrauschte Simulation mit Qiskit Aer-Primitiven](simulate-with-qiskit-aer).\n",
        "  * Wie Sie Quantum Composer für die Simulation verwenden, erfahren Sie in der Anleitung [IBM Quantum Composer](/docs/guides/composer).\n",
        "  * Lesen Sie die [Qiskit Estimator API-Referenz](/docs/api/qiskit/1.4/qiskit.primitives.Estimator).\n",
        "  * Lesen Sie die [Qiskit Sampler API-Referenz](/docs/api/qiskit/1.4/qiskit.primitives.Sampler).\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
}