{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "116af785-a9b7-4eaf-8a86-b1eeb235da18",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"分断ゲート\"\n",
        "description: \"分数ゲートを用いて単一量子ビットおよび二量子ビットの回転を実行する\"\n",
        "---\n",
        "\n",
        "<span id=\"fractional-gates\" />\n",
        "\n",
        "# 分断ゲート\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=\"パッケージ・バージョン\">\n",
        "    このページのコードは、以下の要件に基づいて開発された。\n",
        "    これらのバージョンまたは新しいバージョンの使用をお勧めします。\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.3.1\n",
        "    qiskit-ibm-runtime~=0.45.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f0d7fa16",
      "metadata": {},
      "source": [
        "このページでは、 IBM Quantum® QPUで新たにサポートされた2つのゲートタイプを紹介します。 これらの*分数*ゲートは、 [Heron QPUでは](/docs/guides/processor-types#heron)以下のような形でサポートされている：\n",
        "\n",
        "* $R_{ZZ}(\\theta)$ にとって $0 \\lt \\theta \\leq \\pi/2$\n",
        "* $R_X(\\theta)$ どんな $\\theta$\n",
        "\n",
        "このページでは、分数ゲートを実装することでワークフローの効率を改善できる使用例と、 IBM Quantum QPUでこれらのゲートを使用する方法について説明します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee241e99-d095-4cb5-9506-da3d92c32e1c",
      "metadata": {},
      "source": [
        "<span id=\"how-to-use-fractional-gates\" />\n",
        "\n",
        "## フラクショナルゲートの使用方法\n",
        "\n",
        "内部的には、これらのフラクショナルゲートは、任意の角度に対する $R_{ZZ}(\\theta)$ および $R_X(\\theta)$ の回転を直接実行することで機能する。 $R_X(\\theta)$ ゲートを使用することで、任意の角度の単一量子ビット回転の所要時間と誤差を最大2倍まで削減できる。 $R_{ZZ}(\\theta)$ ゲート回転の直接実行により、複数の `CZGate` オブジェクトへの分解が回避され、同様に回路の持続時間と誤差が低減される。 これは特に、量子システムのダイナミクスをシミュレートする場合や、多くのパラメータを持つ変分アンザッツを使用する場合など、単一量子ビットおよび二量子ビット回転を多く含む回路において有用である。\n",
        "\n",
        "これらのタイプのゲートは、QPU [が ](/docs/guides/circuit-library)`QuantumCircuit` 保有できる標準ゲートのライブラリに含まれていますが、特定の IBM Quantum QPUでのみ使用可能であり、かつフラグが（以下に `use_fractional_gates` 示す `True` ように）に設定された状態でロードされている必要があります。 このフラグを設定すると、トランスパイラ用の `Target` バックエンドに小数点ゲートが確実に含まれるようになります。\n",
        "\n",
        "```python\n",
        "service = QiskitRuntimeService()\n",
        "backend = service.backend('ibm_torino', use_fractional_gates=True)\n",
        "```\n",
        "\n",
        "このコード例では、分数ゲートを使用してイジング鎖のダイナミクスをシミュレートするワークフローの中で、分数ゲートを使用する方法を示します。 そして、分数ゲートを使用しないバックエンドと回路の持続時間を比較する。\n",
        "\n",
        "<Admonition title=\"報告されたエラー率に関する注意\" type=\"note\">\n",
        "  分数ゲートが有効になっているバックエンドの `Target` に報告されるエラー値は、分数ゲートでない方のエラー値のコピーに過ぎない（同じではないかもしれない）。 これは、分数ゲートのエラー率の報告がまだサポートされていないためである。\n",
        "\n",
        "  しかし、分数ゲートと非分数ゲートのゲート時間は同じであるため、両者のエラー率が同等であるというのは妥当な仮定である。\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": [
        "分数ゲートが有効なバックエンドオブジェクトと無効なバックエンドオブジェクトを指定し、両者をトランスパイルする。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "09ef3ed0-7126-45a2-a876-35a4f540c949",
      "metadata": {},
      "outputs": [],
      "source": [
        "service = QiskitRuntimeService()\n",
        "backend_fractional = service.backend(\"ibm_torino\", use_fractional_gates=True)\n",
        "backend_conventional = service.backend(\n",
        "    \"ibm_torino\", 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": [
        "2種類のゲートを使用した回路のタイムラインを表示する。\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",
        "### 角度制約\n",
        "\n",
        "2量子ビットの $R_{ZZ}(\\theta)$ ゲートについては、 IBM Quantum ハードウェア上では、 $0$ と $\\pi/2$ の間の角度のみを実行可能です。 回路内に、この範囲外の角度を持つ $R_{ZZ}(\\theta)$ ゲートが含まれている場合、標準的なトランスピレーション・パイプラインは、通常、適切な回路変換（パス [`FoldRzzAngle`](../api/qiskit-ibm-runtime/transpiler-passes-fold-rzz-angle) を通じて）を行うことでこれを修正します。  ただし、1つ以上の「 [`Parameter`](/docs/api/qiskit/qiskit.circuit.Parameter)s」を含む $R_{ZZ}(\\theta)$ ゲートについては、トランスパイラーは、実行時にこれらのパラメータにこの範囲内の角度が割り当てられるものとみなします。 IBM Quantum Compute Service に送信された `PUB` で指定されたパラメータ値のいずれかがこの範囲外の場合、ジョブは失敗します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "48bad5e6-3c7a-4bd0-b050-e440c3257be2",
      "metadata": {},
      "source": [
        "<span id=\"where-to-use-fractional-gates\" />\n",
        "\n",
        "## フラクショナルゲートはどこで使用するか\n",
        "\n",
        "歴史的に、 IBM Quantum QPUで利用可能な基底ゲートは次のとおりです。 **`CZ`**, **`X`**, **`RZ`**, \\*\\*`SX`\\*\\*であった。 **`ID`**$\\pi / 2$ 例えば、 $R_X(\\theta)$ ゲートは、トランスパイルすると、 $RZ$ と $\\sqrt{X}$ の一連のゲートに分解する必要があり、1つのゲートではなく、有限時間の2つのゲートを持つ回路を作成します。\n",
        "\n",
        "同様に、 $R_{ZZ}(\\theta)$ ゲートのような2量子ビットの回転がトランスパイルされる場合、分解には2つのゲートといくつかの1量子ビットゲートが必要となる。 **`CZ`** ゲートと複数の単一量子ビットゲートが必要となり、回路深度が深くなる。 これらの分解を以下のコードに示す。\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.backend(\"ibm_torino\")\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.backend(\"ibm_torino\")\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": [
        "多くの1量子ビット（ $R_X(\\theta)$ ）や2量子ビットの回転を必要とするワークフロー（変分アナザッツや量子系の時間発展をシミュレーションする場合など）では、この制約により回路の深さが急激に増大する。 しかし、分数ゲートは、1量子ビットと2量子ビットの回転を直接実行するため、この要件がなくなり、より効率的な（つまりエラーが抑制された）量子回路を作ることができる。\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",
        "## フラクショナルゲートを使用*すべきでない*場合\n",
        "\n",
        "フラクショナルゲートは*実験的な*機能であり、この `use_fractional_gates` フラグの動作は将来変更される可能性があることに留意してください。 詳細 `qiskit-ibm-runtime` については、新バージョンの[リリースノート](/docs/api/qiskit-ibm-runtime/release-notes)をご覧ください。 [QiskitRuntimeService](/docs/api/qiskit-ibm-runtime/qiskit-runtime-service#backend).backend の API リファレンスドキュメントも参照してください。そこには、以下の内容が記載されています `use_fractional_gates`。\n",
        "\n",
        "さらに、Qiskitトランスパイラには、最適化パスで $R_{ZZ}(\\theta)$。 このため、これらの命令を含む回路の設計や最適化には、より慎重を期す必要がある。\n",
        "\n",
        "最後に、分数ゲートの使用はサポートされていない：\n",
        "\n",
        "* [パウリツワーリング](/docs/guides/error-mitigation-and-suppression-techniques#pauli-twirling) - ただし、 [TREXによる測定ツワーリングは](/docs/guides/error-mitigation-and-suppression-techniques#twirled-readout-error-extinction-trex)サポート*されて*いる。\n",
        "* [確率的エラー・キャンセル](/docs/guides/error-mitigation-and-suppression-techniques#probabilistic-error-cancellation-pec)\n",
        "* [ゼロノイズ外挿（確率的誤差増幅を使用）](/docs/guides/error-mitigation-and-suppression-techniques#probabilistic-error-amplification-pea)\n",
        "\n",
        "[プリミティブ・オプションの](/docs/guides/runtime-options-overview)ガイドを読んで、特定の量子ワークロード用にエラー緩和と抑制技術をカスタマイズする方法について詳しく学んでください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "58fba520-5d6e-4647-8cb7-2c8790eb8127",
      "metadata": {},
      "source": [
        "<span id=\"which-backends-support-fractional-gates\" />\n",
        "\n",
        "## どのバックエンドが小数ゲートをサポートしていますか？\n",
        "\n",
        "すべてのバックエンドが小数点以下のゲートをサポートしているわけではありません。 そうしている人たちを見つけるために走り出そう `service.backends(use_fractional_gates=True)` 。 偽のバックエンドが分数ゲートをサポートするのは、関連する「実際の」バックエンドがそれをサポートしている場合に限られます。\n",
        "\n",
        "なお、偽のバックエンドは、デフォルトで分数ゲートをサポートしていません。これは、分数ゲートがデフォルトで無効になっているためです。 フラクショナルゲートをサポートするフェイクバックエンドでフラクショナルゲートを有効にするには、その設定を更新してください。\n",
        "\n",
        "例:\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",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * 移籍について詳しくは、 [移籍入門の](/docs/guides/transpile)ページをご覧ください。\n",
        "  * [カスタム・トランスパイラー・パスの書き方について](/docs/guides/custom-transpiler-pass)読む。\n",
        "  * [エラー緩和](/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
}