{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f560a2bd-78d2-45fd-8f1b-9f0a4c5e178d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Einführung in die Grundelemente\"\n",
        "description: \"Einführung in die Primitive in Qiskit und eine Erläuterung der verfügbaren Primitive\"\n",
        "---\n",
        "\n",
        "<span id=\"introduction-to-primitives\" />\n",
        "\n",
        "# Einführung in die Grundelemente\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7bfc257f-69c5-4fb1-8042-b62efa8cf64e",
      "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.3.0\n",
        "    qiskit-ibm-runtime~=0.43.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3ac7f2c2-1541-49f1-9f8f-4c0a8e3a149a",
      "metadata": {},
      "source": [
        "<span id=\"qpu-access-patterns\" />\n",
        "\n",
        "<span id=\"why-did-qiskit-introduce-primitives\" />\n",
        "\n",
        "## Warum hat Qiskit Primitive eingeführt?\n",
        "\n",
        "Ähnlich wie in den Anfängen der klassischen Computer, als Entwickler die CPU-Register direkt manipulieren mussten, lieferte die frühe Schnittstelle zu QPUs einfach die Rohdaten von der Steuerelektronik zurück.\n",
        "Dies war kein großes Problem, als die QPUs noch in Labors untergebracht waren und nur Forscher direkten Zugang hatten.\n",
        "In der Erkenntnis, dass die meisten Entwickler nicht mit der Destillation solcher Rohdaten in 0s und 1s vertraut sind und dies auch nicht sein sollten, führte Qiskit `backend.run` ein, eine erste Abstraktion für den Zugriff auf QPUs in der Cloud. Dies ermöglichte den Entwicklern mit einem vertrauten Datenformat zu arbeiten und sich auf das große Ganze zu konzentrieren.\n",
        "\n",
        "Mit der zunehmenden Verbreitung von QPUs und der Entwicklung weiterer Quantenalgorithmen entstand erneut der Bedarf an einer höheren Abstraktionsebene. Als Antwort darauf hat Qiskit die Primitivschnittstelle, die für zwei Kernaufgaben bei der Entwicklung von Quantenalgorithmen optimiert ist: schätzung von Erwartungswerten (`Estimator`) und Abtasten von Schaltkreisen (`Sampler`). Das Ziel ist einmal mehr ziel ist es, den Entwicklern zu helfen, sich mehr auf Innovationen und weniger auf die Datenkonvertierung zu konzentrieren. Die Primitivschnittstelle ersetzt die Schnittstelle `backend.run` , da `Sampler` den gleichen direkten Hardware-Zugriff bietet wie `backend.run`.\n",
        "\n",
        "<span id=\"what-is-a-primitive\" />\n",
        "\n",
        "## Was ist eine Primitive?\n",
        "\n",
        "Computersysteme sind auf mehreren Abstraktionsebenen aufgebaut. Abstraktionen ermöglichen es Ihnen, sich auf eine auf eine bestimmte, für die jeweilige Aufgabe relevante Detailstufe. Je näher man der Hardware kommt, je näher man an die Hardware herankommt, desto niedriger ist die Abstraktionsebene, die man benötigt (z. B. muss man Daten auf der CPU-Befehlsebene bewegen oder manipulieren). Je komplexer die Aufgabe ist, die Sie durchführen wollen, je komplexer die Aufgabe ist, die Sie durchführen wollen, desto höher sind die Abstraktionen (z. B. könnten Sie eine Programmierbibliothek verwenden, um algebraische Berechnungen).\n",
        "\n",
        "In diesem Zusammenhang ist ein *Primitiv* die kleinste Verarbeitungsanweisung, der einfachste Baustein, aus dem man etwas Nützliches für eine bestimmte Abstraktionsebene erstellen kann.\n",
        "\n",
        "Die jüngsten Fortschritte in der Quanteninformatik haben die Notwendigkeit erhöht, auf höheren Abstraktionsebenen zu arbeiten.\n",
        "Auf dem Weg zu größeren Quantenverarbeitungseinheiten (QPUs) und komplexeren Arbeitsabläufen verlagert sich der Schwerpunkt von der Interaktion mit einzelnen qubit-Signalen hin zur Betrachtung von Quantengeräten als Systeme, die notwendige Aufgaben erfüllen.\n",
        "\n",
        "Die beiden häufigsten Aufgaben von Quantencomputern sind das Abtasten von Quantenzuständen und die Berechnung von Erwartungswerten.\n",
        "Diese Aufgaben motivierten die Entwicklung von Qiskit primitives : **Estimator** und **Sampler**.\n",
        "\n",
        "* Der Schätzer berechnet die Erwartungswerte von Observablen in Bezug auf Zustände, die durch Quantenschaltungen vorbereitet werden.\n",
        "* Sampler sampelt das Ausgaberegister aus der Ausführung der Quantenschaltung.\n",
        "\n",
        "Kurz gesagt, das von Qiskit primitives eingeführte Berechnungsmodell bringt die Quantenprogrammierung einen Schritt näher an die dem Stand der klassischen Programmierung an, bei der der Schwerpunkt weniger auf den Hardware-Details und mehr auf den Ergebnissen liegt die man zu erreichen versucht.\n",
        "\n",
        "<span id=\"primitive-definition-and-implementations\" />\n",
        "\n",
        "## Primitive Definition und Implementierungen\n",
        "\n",
        "Es gibt zwei Arten von „ Qiskit primitives “: die Basisklassen und deren Implementierungen. Die Primitive „Estimator“ und „Sampler“ werden durch Open-Source-Basisklassen für Primitive definiert, die sich im „ Qiskit SDK “ (im Modul [`qiskit.primitives`](/docs/api/qiskit/primitives) ) befinden. Anbieter (wie beispielsweise der „ IBM Quantum Compute Service“) können diese Basisklassen nutzen, um eigene Sampler- und Estimator-Implementierungen abzuleiten.  Die meisten Benutzer werden mit den Implementierungen der Anbieter interagieren, nicht mit den Basisprimitiven.\n",
        "\n",
        "<span id=\"base-classes\" />\n",
        "\n",
        "### Basisklassen\n",
        "\n",
        "Die `Base` Primitive sind abstrakte Klassen, die eine gemeinsame Schnittstelle für die Implementierung von Primitiven definieren. Alle anderen Klassen in diesem [`qiskit.primitives`](/docs/api/qiskit/primitives) Modul erben von diesen Basisklassen. Entwickler sollten diese nutzen, wenn sie daran interessiert sind, ein eigenes, auf Primitiven basierendes Ausführungsmodell für einen bestimmten Anbieter zu erstellen. Diese Klassen könnten auch für diejenigen nützlich sein, die sehr individuelle Verarbeitungsschritte durchführen möchten und feststellen, dass die vorhandenen Implementierungen der Primitive für ihre Anforderungen zu einfach sind. Normale Benutzer werden die Basisklassen nicht direkt verwenden.\n",
        "\n",
        "[`BaseEstimatorV1`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV1) und [`BaseSamplerV1`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV1) – Obwohl die Primitive von „ V1 “ weiterhin verwendet werden können, konzentrieren sich diese Anleitungen auf die Primitive von „ V2 “, da diese aktueller sind und häufiger zum Einsatz kommen.\n",
        "\n",
        "[`BaseEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV2) und [`BaseSamplerV2`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV2) – Die Qiskit-Referenzprimitiven entsprechen diesen Schnittstellenspezifikationen.\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "### Implementierungen\n",
        "\n",
        "Alle Primitive werden aus den Basisklassen abgeleitet; daher weisen sie dieselbe allgemeine Struktur und dieselbe Verwendung auf.  Beispielsweise ist das Eingabeformat für alle Estimator-Primitive identisch.  Es gibt jedoch Unterschiede in der Umsetzung, die sie einzigartig machen.\n",
        "\n",
        "Dies sind Implementierungen der Basisklassen der Primitiven:\n",
        "\n",
        "* Die [IBM Quantum Primitive](/docs/guides/qiskit-runtime-primitives), und [`EstimatorV2`](/docs/api/qiskit-ibm-runtime/executor-estimator-estimator) bieten eine ausgefeiltere Implementierung (beispielsweise durch die Einbindung von Fehlerminderungsmaßnahmen) als cloudbasierten Dienst [`SamplerV2`](/docs/api/qiskit-ibm-runtime/executor-sampler-sampler)an. Diese Implementierung der Basisprimitive dient dem Zugriff auf „ IBM Quantum® “-Hardware.\n",
        "\n",
        "* [`StatevectorEstimator`](/docs/api/qiskit/qiskit.primitives.StatevectorEstimator) und [`StatevectorSampler`](/docs/api/qiskit/qiskit.primitives.StatevectorSampler#statevectorsampler) – Referenzimplementierungen der Primitive, die den in Qiskit integrierten Simulator nutzen. Sie wurden mit dem Qiskit-Modul [`quantum_info`](/docs/api/qiskit/quantum_info#quantum-information) erstellt und liefern Ergebnisse, die auf Simulationen mit idealen Zustandsvektoren basieren.  Der Zugriff erfolgt über Qiskit. Einzelheiten zur Verwendung finden Sie unter „[Exakte Simulation mit Qiskit SDK -Primitiven](/docs/guides/simulate-with-qiskit-sdk-primitives) “.\n",
        "\n",
        "* [`BackendEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BackendEstimatorV2) und [`BackendSamplerV2`](/docs/api/qiskit/qiskit.primitives.BackendSamplerV2) – Mit diesen Klassen können Sie beliebige Quantencomputing-Ressourcen in eine Primitive „verpacken“. Auf diese Weise können Sie Code im Primitive-Stil für Provider schreiben, die noch keine auf Primitives basierende Schnittstelle haben. Diese Klassen können genau wie der reguläre Sampler und Estimator verwendet werden, mit dem Unterschied, dass sie mit einem zusätzlichen `backend` Argument initialisiert werden müssen, um auszuwählen, auf welchem Quantencomputer sie ausgeführt werden sollen. Der Zugriff erfolgt über Qiskit. Weitere Informationen finden Sie im Leitfaden zu [Backend-Primitiven](/docs/guides/get-started-with-backend-primitives).\n",
        "\n",
        "<span id=\"options\" />\n",
        "\n",
        "## Optionen\n",
        "\n",
        "Sie können Optionen an Primitive übergeben, um diese an Ihre Bedürfnisse anzupassen. Während die Schnittstelle der Methode der `run()` Primitive in allen Implementierungen einheitlich ist, gilt dies nicht für ihre Optionen. Informieren Sie sich in den API-Referenzen zur jeweiligen Primitiv-Implementierung über die unterstützten Optionen.\n",
        "\n",
        "Lesen Sie beispielsweise die Abschnitte [„Estimator-Optionen“](/docs/guides/estimator-options) und [„Sampler-Optionen“](/docs/guides/sampler-options), um mehr über die Optionen für die „ IBM Quantum “-Primitiven zu erfahren, oder sehen Sie in den [Qiskit Aer-API-Referenzen](https://qiskit.github.io/qiskit-aer/apidocs/aer_primitives.html) nach, um mehr über die Optionen der Qiskit Aer-Primitiven zu erfahren.\n",
        "\n",
        "<span id=\"benefits-of-qiskit-primitives\" />\n",
        "\n",
        "## Vorteile von „ Qiskit primitives “\n",
        "\n",
        "Mithilfe von Primitiven können Qiskit-Anwender Quantencode für eine bestimmte QPU schreiben, ohne jedes Detail explizit\n",
        "verwalten zu müssen. Außerdem könnten Sie aufgrund der zusätzlichen Abstraktionsebene möglicherweise leichter\n",
        "auf erweiterte Hardwarefunktionen eines bestimmten Anbieters zugreifen. Bei den Primitiven von „ IBM Quantum “\n",
        "können Sie beispielsweise die neuesten Fortschritte bei der Fehlerminderung und -unterdrückung nutzen, indem Sie Optionen wie die der Primitive aktivieren oder deaktivieren [`resilience_level`](/docs/api/qiskit-ibm-runtime/options-models-estimator-options#resilience_level), anstatt eine eigene Implementierung dieser Techniken zu entwickeln.\n",
        "\n",
        "Für Hardware-Anbieter bedeutet die native Implementierung von Primitiven, dass sie ihren Nutzern eine \"out-of-the-box\"-Möglichkeit bieten können zugriff auf Ihre Hardware-Funktionen, wie z. B. erweiterte Nachbearbeitungstechniken. So ist es für Ihre Benutzer einfacher, die besten Funktionen Ihrer Hardware zu nutzen.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02dbbc7d-76e7-4a89-8739-ba7f3a5a05b8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Machen Sie sich mit den [grundlegenden Ein- und Ausgabemöglichkeiten](/docs/guides/primitive-input-output) vertraut.\n",
        "  * Sehen Sie sich detaillierte [Beispiele](/docs/guides/simulate-with-qiskit-sdk-primitives) an.\n",
        "  * Üben Sie den Umgang mit Primitiven, indem Sie die [Lektion über die Kostenfunktion](/learning/courses/variational-algorithm-design/cost-functions) auf IBM Quantum Learning durcharbeiten.\n",
        "  * Lesen Sie den [Leit](/docs/guides/create-a-provider) faden „Erstellen eines Providers“, um zu erfahren, wie Sie Ihre eigenen Sampler- und Estimator-Primitive implementieren können.\n",
        "  * Siehe die [API-Dokumentation](/docs/api/qiskit/primitives).\n",
        "  * Lesen Sie [Migrieren zu V2 primitives](/docs/guides/v2-primitives).\n",
        "  * Erfahren Sie mehr über die „ [IBM Quantum “-Primitive](/docs/guides/qiskit-runtime-primitives), die zur Ausführung von Schaltkreisen auf den QPUs von „ IBM “ verwendet werden.\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
}