{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "116af785-a9b7-4eaf-8a86-b1eeb235da18",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Bruchgatter\"\n",
        "description: \"Verwenden Sie fraktionierte Gatter, um Einzel- und Zwei-Qubit-Rotationen auszuführen\"\n",
        "---\n",
        "\n",
        "<span id=\"fractional-gates\" />\n",
        "\n",
        "# Bruchgatter\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5d679872",
      "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-ibm-runtime~=0.47.0\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f0d7fa16",
      "metadata": {},
      "source": [
        "Auf dieser Seite werden zwei neue Gattertypen vorgestellt, die von der IBM Quantum® QPU-Flotte unterstützt werden. Diese *gebrochenen* Gatter werden auf den [Heron QPUs](/docs/guides/processor-types#heron) in Form von unterstützt:\n",
        "\n",
        "* $R_{ZZ}(\\theta)$ für $0 \\lt \\theta \\leq \\pi/2$\n",
        "* $R_X(\\theta)$ für jede $\\theta$\n",
        "\n",
        "Auf dieser Seite werden die Anwendungsfälle erörtert, in denen die Implementierung von fraktionalen Gattern die Effizienz Ihrer Arbeitsabläufe verbessern kann, und es wird erläutert, wie diese Gatter auf IBM Quantum QPUs verwendet werden können.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee241e99-d095-4cb5-9506-da3d92c32e1c",
      "metadata": {},
      "source": [
        "<span id=\"how-to-use-fractional-gates\" />\n",
        "\n",
        "## Verwendung von Bruchteil-Gates\n",
        "\n",
        "Intern funktionieren diese Bruchteilgatter, indem sie direkt eine $R_{ZZ}(\\theta)$ und $R_X(\\theta)$ Rotation für einen beliebigen Winkel ausführen. Die Verwendung des „ $R_X(\\theta)$ “-Gatters kann die Dauer und Fehlerquote bei Einzelqubit-Rotationen mit beliebigem Winkel um bis zu den Faktor zwei reduzieren. Die direkte Ausführung der Gate-Rotation „ $R_{ZZ}(\\theta)$ “ vermeidet die Zerlegung in mehrere `CZGate` Objekte und reduziert so ebenfalls die Dauer und Fehler einer Schaltung. Dies ist besonders nützlich für Schaltungen, die viele Einzel- und Zwei-Qubit-Rotationen enthalten, beispielsweise bei der Simulation der Dynamik eines Quantensystems oder bei der Verwendung eines Variationsansatzes mit vielen Parametern.\n",
        "\n",
        "Diese Gattertypen sind zwar in der [Bibliothek der Standardgatter](/docs/guides/circuit-library) enthalten, über die ein System verfügen `QuantumCircuit` kann, sie können jedoch nur auf bestimmten QPUs von IBM Quantum verwendet werden, die mit dem auf gesetzten `use_fractional_gates` Flag `True` geladen werden müssen (siehe unten). Dieses Flag sorgt dafür, dass Bruchteilsgatter in die Backend-Implementierung `Target` des Transpilers aufgenommen werden.\n",
        "\n",
        "```python\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.backend('ibm_torino', use_fractional_gates=True)\n",
        "```\n",
        "\n",
        "Dieses Codebeispiel demonstriert die Verwendung von fraktionierten Gattern im Rahmen eines Arbeitsablaufs, der die Dynamik einer Ising-Kette mit Hilfe von fraktionierten Gattern simuliert. Die Dauer der Schaltung wird dann mit einem Backend verglichen, das keine gebrochenen Gatter verwendet.\n",
        "\n",
        "<Admonition title=\"Hinweis zu den gemeldeten Fehlerquoten\" type=\"note\">\n",
        "  Der Fehlerwert, der in der `Target` eines Backends mit aktivierten fraktionalen Gattern gemeldet wird, ist lediglich eine Kopie des Gegenstücks des nicht-fraktionalen Gatters (das möglicherweise nicht dasselbe ist). Der Grund dafür ist, dass die Meldung von Fehlerquoten bei den fraktionierten Gates noch nicht unterstützt wird.\n",
        "\n",
        "  Da jedoch die Gatterzeit von fraktionierten und nicht-fraktionierten Gattern gleich ist, ist es eine vernünftige Annahme, dass ihre Fehlerraten vergleichbar sind - vor allem, wenn die dominierende Fehlerquelle in einer Schaltung auf Relaxation zurückzuführen ist.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "9cb7f696-dec0-4393-9320-fe945326c893",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/9cb7f696-dec0-4393-9320-fe945326c893-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",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple\n",
        "\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "\n",
        "num_qubits = 5\n",
        "num_time_steps = 3\n",
        "rx_angle = 0.1\n",
        "rzz_angle = 0.1\n",
        "\n",
        "ising_circuit = QuantumCircuit(num_qubits)\n",
        "for i in range(num_time_steps):\n",
        "    # rx layer\n",
        "    for q in range(num_qubits):\n",
        "        ising_circuit.rx(rx_angle, q)\n",
        "    for q in range(1, num_qubits - 1, 2):\n",
        "        ising_circuit.rzz(rzz_angle, q, q + 1)\n",
        "    # 2nd rzz layer\n",
        "    for q in range(0, num_qubits - 1, 2):\n",
        "        ising_circuit.rzz(rzz_angle, q, q + 1)\n",
        "    ising_circuit.barrier()\n",
        "ising_circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "983bbe11-fa20-4043-a146-66af18cae054",
      "metadata": {},
      "source": [
        "Geben Sie zwei Backend-Objekte an: eines mit aktivierten und eines mit deaktivierten Fractional Gates, und transpilieren Sie dann beide.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "09ef3ed0-7126-45a2-a876-35a4f540c949",
      "metadata": {},
      "outputs": [],
      "source": [
        "service = QiskitRuntimeService()\n",
        "backend_name = service.least_busy(operational=True, simulator=False).name\n",
        "backend_fractional = service.backend(backend_name, use_fractional_gates=True)\n",
        "backend_conventional = service.backend(\n",
        "    backend_name, use_fractional_gates=False\n",
        ")\n",
        "\n",
        "pm_fractional = generate_preset_pass_manager(\n",
        "    optimization_level=3, backend=backend_fractional, scheduling_method=\"alap\"\n",
        ")\n",
        "pm_conventional = generate_preset_pass_manager(\n",
        "    optimization_level=3,\n",
        "    backend=backend_conventional,\n",
        "    scheduling_method=\"alap\",\n",
        ")\n",
        "\n",
        "ising_circuit_fractional = pm_fractional.run(ising_circuit)\n",
        "ising_circuit_conventional = pm_conventional.run(ising_circuit)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cf108858-b8ee-44a8-b252-3e7748b691f8",
      "metadata": {},
      "source": [
        "Zeigen Sie die Zeitachse der Schaltung mit den beiden Gattertypen an.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "0013f5fa-4072-4aa4-94fe-7e195435f828",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/0013f5fa-4072-4aa4-94fe-7e195435f828-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw timeline of circuit with conventional gates\n",
        "draw_timeline(\n",
        "    ising_circuit_conventional,\n",
        "    idle_wires=False,\n",
        "    target=backend_conventional.target,\n",
        "    time_range=(0, 500),\n",
        "    style=IQXSimple(),\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "08dd1cdf-8b34-47c2-8324-f3538c9d1ab6",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/08dd1cdf-8b34-47c2-8324-f3538c9d1ab6-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw timeline of circuit with fractional gates\n",
        "draw_timeline(\n",
        "    ising_circuit_fractional,\n",
        "    idle_wires=False,\n",
        "    target=backend_fractional.target,\n",
        "    time_range=(0, 500),\n",
        "    style=IQXSimple(),\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "76f9f94e-f402-4519-b991-708b74a4f88c",
      "metadata": {},
      "source": [
        "<span id=\"angle-constraints\" />\n",
        "\n",
        "### Winkelbeschränkungen\n",
        "\n",
        "Für das Zwei-Qubit- $R_{ZZ}(\\theta)$ -Gatter können auf der Hardware von IBM Quantum nur Winkel zwischen $0$ und $\\pi/2$ ausgeführt werden. Enthält eine Schaltung „ $R_{ZZ}(\\theta)$ “-Gatter mit einem Winkel außerhalb dieses Bereichs, wird dies von der Standard-Transpilations-Pipeline in der Regel durch eine entsprechende Schaltungstransformation (im Pass [`FoldRzzAngle`](../api/qiskit-ibm-runtime/transpiler-passes-fold-rzz-angle) ) korrigiert.  Für jedes „ $R_{ZZ}(\\theta)$ “-Gatter, das ein oder mehrere [`Parameter`](/docs/api/qiskit/qiskit.circuit.Parameter)„s“ enthält, geht der Transpiler jedoch davon aus, dass diesen Parametern zur Laufzeit Winkel innerhalb dieses Bereichs zugewiesen werden. Der Auftrag schlägt fehl, wenn einer der im „ PUB “ angegebenen Parameterwerte, der an den „ IBM Quantum Compute Service“ übermittelt wurde, außerhalb dieses Bereichs liegt.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "48bad5e6-3c7a-4bd0-b050-e440c3257be2",
      "metadata": {},
      "source": [
        "<span id=\"where-to-use-fractional-gates\" />\n",
        "\n",
        "## Wo fraktionierte Gates verwendet werden sollten\n",
        "\n",
        "In der Vergangenheit waren die auf IBM Quantum QPUs verfügbaren Basisgatter **`CZ`**, **`X`**, **`RZ`**, **`SX`**, und \\*\\*`ID`\\*\\*die nicht in der Lage sind, Schaltungen mit Ein- und Zwei-Qubit-Rotationen, die keine Vielfachen von $\\pi / 2$ sind, effizient darzustellen. Beispielsweise muss ein $R_X(\\theta)$ -Gatter, wenn es transpiliert wird, in eine Reihe von $RZ$ - und $\\sqrt{X}$ -Gattern zerlegt werden, wodurch eine Schaltung mit zwei Gattern von endlicher Dauer anstelle von einem entsteht.\n",
        "\n",
        "Wenn Zwei-Qubit-Rotationen, wie z. B. ein $R_{ZZ}(\\theta)$ -Gatter, transponiert werden, erfordert die Zerlegung ebenfalls zwei **`CZ`** gatter und mehrere Ein-Qubit-Gatter, was die Schaltungstiefe erhöht. Diese Zerlegungen sind im folgenden Code dargestellt.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "11b003ee-aa8e-4794-a84a-b6870d15fa11",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/11b003ee-aa8e-4794-a84a-b6870d15fa11-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc = QuantumCircuit(1)\n",
        "param = Parameter(\"θ\")\n",
        "qc.rx(param, 0)\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "5da9bba4-9a3b-4569-9997-c5b9ccf87b6a",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/5da9bba4-9a3b-4569-9997-c5b9ccf87b6a-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)\n",
        "optimization_level = 3\n",
        "pm = generate_preset_pass_manager(optimization_level, backend=backend)\n",
        "transpiled_circuit = pm.run(qc)\n",
        "transpiled_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "6b256201-0237-4f63-91ff-fde1bb884804",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/6b256201-0237-4f63-91ff-fde1bb884804-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.circuit import Parameter\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "param = Parameter(\"θ\")\n",
        "qc.rzz(param, 0, 1)\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "f07217b9-a6f0-4adf-b341-6da447535c33",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/fractional-gates/extracted-outputs/f07217b9-a6f0-4adf-b341-6da447535c33-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.least_busy(operational=True, simulator=False)\n",
        "optimization_level = 3\n",
        "pm = generate_preset_pass_manager(optimization_level, backend=backend)\n",
        "transpiled_circuit = pm.run(qc)\n",
        "transpiled_circuit.draw(\"mpl\", idle_wires=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5bc4f276-80e4-49af-bd5c-d9dceedc9aa3",
      "metadata": {},
      "source": [
        "Bei Arbeitsabläufen, die viele Ein-Qubit- $R_X(\\theta)$ oder Zwei-Qubit-Rotationen erfordern (z. B. in einem Variationsansatz oder bei der Simulation der zeitlichen Entwicklung von Quantensystemen), führt diese Einschränkung dazu, dass die Schaltungstiefe schnell wächst. Mit fraktionierten Gattern entfällt diese Anforderung jedoch, da die Ein- und Zwei-Qubit-Drehungen direkt ausgeführt werden und eine effizientere (und damit fehlerunterdrückte) Quantenschaltung entsteht.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c601cc20-be04-45b6-9917-e8fe2925d36b",
      "metadata": {},
      "source": [
        "<span id=\"when-not-to-use\" />\n",
        "\n",
        "<span id=\"when-not-to-use-fractional-gates\" />\n",
        "\n",
        "<span id=\"when-*not*-to-use-fractional-gates\" />\n",
        "\n",
        "## Wann man *keine* fraktionierten Gates verwenden sollte\n",
        "\n",
        "Es ist wichtig zu beachten, dass „Fractional Gates“ eine *experimentelle* Funktion sind und sich das Verhalten des Flags `use_fractional_gates` in Zukunft ändern kann. Weitere Informationen finden Sie `qiskit-ibm-runtime` in den [Versionshinweisen](/docs/api/qiskit-ibm-runtime/release-notes) zu den neuen Versionen von. Siehe auch die API-Referenzdokumentation zu „ [QiskitRuntimeService](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#backend).backend“, in der dies beschrieben wird `use_fractional_gates`.\n",
        "\n",
        "Außerdem kann der Qiskit-Transpiler in seinen Optimierungsläufen nur begrenzt $R_{ZZ}(\\theta)$ verwenden. Daher müssen Sie bei der Erstellung und Optimierung von Schaltungen, die diese Anweisungen enthalten, mehr Sorgfalt walten lassen.\n",
        "\n",
        "Schließlich wird die Verwendung von Fractional Gates nicht unterstützt für:\n",
        "\n",
        "* [Pauli-Twirling](/docs/guides/error-mitigation-and-suppression-techniques#pauli-twirling) - allerdings *wird* das [Messungs-Twirling mit TREX](/docs/guides/error-mitigation-and-suppression-techniques#twirled-readout-error-extinction-trex) unterstützt.\n",
        "* [Probabilistische Fehleraufhebung](/docs/guides/error-mitigation-and-suppression-techniques#probabilistic-error-cancellation-pec)\n",
        "* [Null-Rausch-Extrapolation (mit probabilistischer Fehlerverstärkung)](/docs/guides/error-mitigation-and-suppression-techniques#probabilistic-error-amplification-pea)\n",
        "\n",
        "Lesen Sie den Leitfaden zu den [primitiven Optionen](/docs/guides/runtime-options-overview), um mehr über die Anpassung der Fehlerbegrenzungs- und -unterdrückungstechniken für eine bestimmte Quantenarbeitslast zu erfahren.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "58fba520-5d6e-4647-8cb7-2c8790eb8127",
      "metadata": {},
      "source": [
        "<span id=\"which-backends-support-fractional-gates\" />\n",
        "\n",
        "## Welche Backends unterstützen fraktionierte Gates?\n",
        "\n",
        "Nicht alle Backends unterstützen fraktionierte Gates. Lauf los, `service.backends(use_fractional_gates=True)` um diejenigen zu finden, die es tun. Mit der Veröffentlichung von „ v0.48`qiskit-ibm-runtime` “ können Sie außerdem den Befehl ausführen, um `service.least_busy(fractional_gates=True)` das am wenigsten ausgelastete Backend zu finden, das fraktionierte Gatter unterstützt. Ein simuliertes Backend unterstützt Bruchgates nur dann, wenn das zugehörige „echte“ Backend diese ebenfalls unterstützt.\n",
        "\n",
        "Beachten Sie, dass gefälschte Backends standardmäßig keine Bruchgates unterstützen, da diese standardmäßig deaktiviert sind. Um Fractional Gates auf einem Fake-Backend zu aktivieren, das diese unterstützt, aktualisieren Sie dessen Konfiguration.\n",
        "\n",
        "Beispiel:\n",
        "\n",
        "```python\n",
        "service = QiskitRuntimeService()\n",
        "fake_backend = FakeBoston()\n",
        "fake_backend.refresh(service=service, use_fractional_gates=True)\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bf0a38a6-60d1-4848-bbde-df19bb496510",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Nächste Schritte\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Empfehlungen\">\n",
        "  * Weitere Informationen zur Transpilation finden Sie auf der Seite [Einführung in die Transpilation](/docs/guides/transpile).\n",
        "  * Lesen Sie über das [Schreiben eines benutzerdefinierten Transpiler-Passes](/docs/guides/custom-transpiler-pass).\n",
        "  * Erfahren Sie, wie Sie [die Fehlerbehebung konfigurieren](/docs/guides/configure-error-mitigation).\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": 2
}