{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "bc54d7bc-b2d8-4b30-9b0b-05689e07a463",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"回路を構成する\"\n",
        "description: \"Qiskitにおける量子回路の構築と可視化の方法\"\n",
        "---\n",
        "\n",
        "<span id=\"construct-circuits\" />\n",
        "\n",
        "# 回路を構成する\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e11dd8ad-7edc-4cf8-bc13-388fe04e84fa",
      "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.5.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "c50d8e43-ae82-4e41-8d17-a37332d1bf6d",
      "metadata": {},
      "source": [
        "このページではQiskit SDKの [`QuantumCircuit`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit) クラスについて詳しく見ていきます。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2664d407-aa95-43a3-9101-d3ad58c2df58",
      "metadata": {},
      "source": [
        "<span id=\"what-is-a-quantum-circuit\" />\n",
        "\n",
        "## 量子回路とは何か？\n",
        "\n",
        "単純な量子回路は、量子ビットの集まりと、それらの量子ビットに作用する命令のリストである。 次のセルは、2つの新しい量子ビットを持つ新しい回路を作成し、その回路の [`qubits`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#qubits) 属性を表示する。 [`Qubits`](/docs/api/qiskit/circuit#qiskit.circuit.Qubit) を最下位ビット $q_0$ から最上位ビット $q_n$ の順に表示します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "b410d397-b67d-4f31-90cf-9c1c34c157c5",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<Qubit register=(2, \"q\"), index=0>, <Qubit register=(2, \"q\"), index=1>]"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.qubits"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "392e3d6c",
      "metadata": {},
      "source": [
        "複数の `QuantumRegister` 、 `ClassicalRegister` オブジェクトを組み合わせて回路を作ることができる。 すべての [`QuantumRegister`](/docs/api/qiskit/circuit#qiskit.circuit.QuantumRegister) と [`ClassicalRegister`](/docs/api/qiskit/circuit#qiskit.circuit.ClassicalRegister) という名前もつけられる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "6160e3f7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[<Qubit register=(2, \"qreg1\"), index=0>,\n",
              " <Qubit register=(2, \"qreg1\"), index=1>,\n",
              " <Qubit register=(1, \"qreg2\"), index=0>]"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit import QuantumRegister, ClassicalRegister\n",
        "\n",
        "qr1 = QuantumRegister(2, \"qreg1\")  # Create a QuantumRegister with 2 qubits\n",
        "qr2 = QuantumRegister(1, \"qreg2\")  # Create a QuantumRegister with 1 qubit\n",
        "cr1 = ClassicalRegister(3, \"creg1\")  # Create a ClassicalRegister with 3 cbits\n",
        "\n",
        "combined_circ = QuantumCircuit(\n",
        "    qr1, qr2, cr1\n",
        ")  # Create a quantum circuit with 2 QuantumRegisters and 1 ClassicalRegister\n",
        "combined_circ.qubits"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e7b212f",
      "metadata": {},
      "source": [
        "量子ビットのインデックスとレジスタは、回路の [`find_bit`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#qiskit.circuit.QuantumCircuit.find_bit) メソッドとその属性を使用します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "faeb3fbc",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Index: 2\n",
            "Register: [(QuantumRegister(1, 'qreg2'), 0)]\n"
          ]
        }
      ],
      "source": [
        "desired_qubit = qr2[0]  # Qubit 0 of register 'qreg2'\n",
        "\n",
        "print(\"Index:\", combined_circ.find_bit(desired_qubit).index)\n",
        "print(\"Register:\", combined_circ.find_bit(desired_qubit).registers)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f5c95cb2-a94f-48f3-b2a6-8ec6c25da5cd",
      "metadata": {},
      "source": [
        "回路に命令を追加すると、その命令が回路の [`data`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#data) 属性に追加されます。 次のセル出力は、 `data` がオブジェクトのリストであることを示している。 [`CircuitInstruction`](/docs/api/qiskit/qiskit.circuit.CircuitInstruction) オブジェクトのリストであり、各オブジェクトは `operation` 属性と `qubits` 属性を持つ。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "f7b5573c-b2b2-4cbf-ba55-c53c9221ce71",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "[CircuitInstruction(operation=Instruction(name='x', num_qubits=1, num_clbits=0, params=[]), qubits=(<Qubit register=(2, \"q\"), index=0>,), clbits=())]"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc.x(0)  # Add X-gate to qubit 0\n",
        "qc.data"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "17a82d8a-b717-44b8-b3f8-ce89e2588261",
      "metadata": {},
      "source": [
        "この情報を確認する最も簡単な方法は、回路の可視化結果を返す [`draw`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#draw) メソッドを使用することです。 量子回路の表示方法については、 [「回路の可視化」](/docs/guides/visualize-circuits) をご覧ください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "43a57258-3e33-4071-8a48-2bf127c8a5be",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/43a57258-3e33-4071-8a48-2bf127c8a5be-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ab5f4bc9-7d7c-4ee7-b1bc-70a313b4fe29",
      "metadata": {},
      "source": [
        "回路命令オブジェクトは、より基本的な命令の観点から命令を記述する \"定義 \"回路を含むことができる。 例えば、 [Xゲートは](/docs/api/qiskit/qiskit.circuit.library.XGate)、より一般的な単一量子ビット・ゲートである [U3-gate](/docs/api/qiskit/qiskit.circuit.library.U3Gate) より一般的な単一量子ビット・ゲートである。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "653e2427-e301-4d2f-84de-1959185ace8e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/653e2427-e301-4d2f-84de-1959185ace8e-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Draw definition circuit of 0th instruction in `qc`\n",
        "qc.data[0].operation.definition.draw(\"mpl\")"
      ]
    },
    {
      "attachments": {},
      "cell_type": "markdown",
      "id": "ee893af1-db43-449f-bfc4-8f636bd98546",
      "metadata": {},
      "source": [
        "命令と回路は、どちらもビットや量子ビットに対する操作を記述するという点では似ているが、その目的は異なる：\n",
        "\n",
        "* 命令は固定されたものとして扱われ、そのメソッドは通常、（元のオブジェクトを変異させることなく）新しい命令を返す。\n",
        "* 回路は何行にもわたって構築されるように設計されている。 [`QuantumCircuit`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit) メソッドはしばしば既存のオブジェクトを変更する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2e451022",
      "metadata": {},
      "source": [
        "<span id=\"what-is-circuit-depth\" />\n",
        "\n",
        "### 回路深さとは何か？\n",
        "\n",
        "量子回路の[深さ（depth()）とは](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#qiskit.circuit.QuantumCircuit.depth)、その回路で定義された計算を完了するために必要な量子ゲートの「層」の数を示す尺度である。 量子ゲートの実装には時間がかかるため、回路の深さは量子コンピューターが回路を実行するのにかかる時間にほぼ対応する。 したがって、回路の深さは、量子回路がデバイス上で実行可能かどうかを測定するために使用される重要な量の1つである。\n",
        "\n",
        "このページの残りの部分では、量子回路の操作方法を説明する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ff4f08f3-48eb-454c-9647-2af505bf79bc",
      "metadata": {},
      "source": [
        "<span id=\"build-circuits\" />\n",
        "\n",
        "## 回路を構築する\n",
        "\n",
        "などの方法がある。 [`QuantumCircuit.h`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#h) や [`QuantumCircuit.cx`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#cx) などのメソッドは、回路に特定の命令を追加する。 より一般的に回路に命令を追加するには [`append`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#append) メソッドを使います。 これは命令と、命令を適用する量子ビットのリストを受け取る。 サポートされている命令のリストについては、 [Circuit Library API documentationを](/docs/api/qiskit/circuit_library)参照のこと。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "66813cae-9841-47ea-96b7-8fd7b82e9759",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/66813cae-9841-47ea-96b7-8fd7b82e9759-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import HGate\n",
        "\n",
        "qc = QuantumCircuit(1)\n",
        "qc.append(\n",
        "    HGate(),  # New HGate instruction\n",
        "    [0],  # Apply to qubit 0\n",
        ")\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bbdbef08-07c0-4fb0-ab3e-ed6efb7a3dc3",
      "metadata": {},
      "source": [
        "つの回路を組み合わせるには [`compose`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#compose) メソッドを使用します。 これは別の [`QuantumCircuit`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit) と、オプションの量子ビットマッピングのリスト。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  この [`compose`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#compose) メソッドは新しい回路を返し、それが作用するどちらの回路も変異さ**せない**。 メソッドを呼び出している回路を変異させるには、引数。 [`compose`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#compose) メソッドを呼び出す回路を変更するには、引数 `inplace=True` を使用します。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "29152dfa-2275-4bc4-aadb-82185b9e0e86",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/29152dfa-2275-4bc4-aadb-82185b9e0e86-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc_a = QuantumCircuit(4)\n",
        "qc_a.x(0)\n",
        "\n",
        "qc_b = QuantumCircuit(2, name=\"qc_b\")\n",
        "qc_b.y(0)\n",
        "qc_b.z(1)\n",
        "\n",
        "# compose qubits (0, 1) of qc_a to qubits (1, 3) of qc_b respectively\n",
        "combined = qc_a.compose(qc_b, qubits=[1, 3])\n",
        "combined.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d4529506-8397-4208-9cfd-31e1a1978741",
      "metadata": {},
      "source": [
        "また、回路を整理しておくために、回路をインストラクションにまとめるのもよいだろう。 メソッドを使って回路を命令に変換することができる。 [`to_instruction`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#to_instruction) メソッドを使用して回路を命令に変換し、他の命令と同じようにこれを別の回路に追加します。 次のセルに描かれた回路は、前のセルに描かれた回路と機能的に等価である。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "81b682dd-45cb-4492-809e-d9e8ebbf5600",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/81b682dd-45cb-4492-809e-d9e8ebbf5600-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "inst = qc_b.to_instruction()\n",
        "qc_a.append(inst, [1, 3])\n",
        "qc_a.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e81c46b-a2d2-430e-9d3d-73e5030e3548",
      "metadata": {},
      "source": [
        "回路がユニタリーの場合、それを [`Gate`](/docs/api/qiskit/qiskit.circuit.Gate) に変換できます。 [`to_gate`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#to_gate) メソッドを使用します。 [`Gate`](/docs/api/qiskit/qiskit.circuit.Gate) オブジェクトは、量子制御を追加するメソッドなど、いくつかの追加機能を持つ特定のタイプの命令である。 [`control`](/docs/api/qiskit/qiskit.circuit.Gate#control) メソッドのような、量子制御を追加する特別な機能を持つ特定のタイプの命令である。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "ed362e64-d6a4-4dfd-a5cf-5e6bdc7a81b5",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/ed362e64-d6a4-4dfd-a5cf-5e6bdc7a81b5-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "gate = qc_b.to_gate().control()\n",
        "qc_a.append(gate, [0, 1, 3])\n",
        "qc_a.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ae850362-84eb-4998-a2cf-a93a1be4ac2a",
      "metadata": {},
      "source": [
        "何が起こっているかを見るには [`decompose`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#decompose) メソッドを使って各命令をその定義に展開することができる。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  この [`decompose`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#decompose) メソッドは新しい回路を返し、それが作用する回路を変更**しない**。\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "3c0633db-929b-4428-a888-7a3d493bd6dd",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/3c0633db-929b-4428-a888-7a3d493bd6dd-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc_a.decompose().draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "87f1e053",
      "metadata": {},
      "source": [
        "<span id=\"measure-qubits\" />\n",
        "\n",
        "<span id=\"measure-qubits\" />\n",
        "\n",
        "## 量子ビットを測定する\n",
        "\n",
        "測定は、個々の量子ビットの状態をサンプリングし、その結果を古典的なレジスタに転送するために用いられる。 なお、 [Sampler](/docs/guides/get-started-with-sampler) プリミティブに回路を送信する場合は、測定値の指定が必須となります。 ただし、 [Estimator](/docs/guides/get-started-with-estimator) プリミティブに渡される回路には、測定値を含めてはなりません。\n",
        "\n",
        "量子ビットの測定には、次の3つの方法がある： [`measure`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#qiskit.circuit.QuantumCircuit.measure)、 [`measure_all`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#measure_all) および [`measure_active`](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#measure_active)。 測定結果の表示方法については、 [「結果の表示」](/docs/guides/visualize-results) ページをご覧ください。\n",
        "\n",
        "1. `QuantumCircuit.measure` これは、第一引数の各クォビットを、第二引数として与えられた古典ビットの上で測定する。 この方法では、測定結果の保存場所を完全にコントロールすることができる。\n",
        "\n",
        "2. `QuantumCircuit.measure_all` これは引数を取らず、あらかじめ定義された古典ビットを持たない量子回路に使用できる。 古典的なワイヤーを作成し、測定結果を順番に保存する。 例えば、qubit $q_i$ の測定値は cbit $meas_i$ に格納される。）また、測定の前にバリアが追加される。\n",
        "\n",
        "3. `QuantumCircuit.measure_active` `measure_all` と似ているが、演算を持つ量子ビットだけを測定する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "0cdb2273",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/0cdb2273-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 12,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc1 = QuantumCircuit(2, 2)\n",
        "qc1.measure(0, 1)\n",
        "qc1.draw(\"mpl\", cregbundle=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "6f33698c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/6f33698c-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc2 = QuantumCircuit(2)\n",
        "qc2.measure_all()\n",
        "qc2.draw(\"mpl\", cregbundle=False)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "ca3f225f",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/ca3f225f-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc3 = QuantumCircuit(2)\n",
        "qc3.x(1)\n",
        "qc3.measure_active()\n",
        "qc3.draw(\"mpl\", cregbundle=False)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "649fc3fd-caf1-45f1-ad8e-3b5d26ca859b",
      "metadata": {},
      "source": [
        "<span id=\"parameterized-circuits\" />\n",
        "\n",
        "## パラメータ化回路\n",
        "\n",
        "近い将来の量子アルゴリズムの多くは、量子回路の多くのバリエーションを実行することになる。 大規模な回路の構築と最適化には計算コストがかかるため、Qiskitは**パラメータ化された**回路をサポートしています。 これらの回路には未定義のパラメータがあり、その値は回路を実行する直前まで定義する必要はない。 これにより、回路の構築と最適化をメイン・プログラムのループから外すことができる。  次のセルはパラメータ化された回路を作成し、表示する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "a580552c-d585-4047-99f0-32aafd06e4f3",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/a580552c-d585-4047-99f0-32aafd06e4f3-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit.circuit import Parameter\n",
        "\n",
        "angle = Parameter(\"angle\")  # undefined number\n",
        "\n",
        "# Create and optimize circuit once\n",
        "qc = QuantumCircuit(1)\n",
        "qc.rx(angle, 0)\n",
        "qc = generate_preset_pass_manager(\n",
        "    optimization_level=3, basis_gates=[\"u\", \"cx\"]\n",
        ").run(qc)\n",
        "\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a174600b-8f4a-47ca-aa4c-cd16dcbecb7c",
      "metadata": {},
      "source": [
        "次のセルは、この回路の多くのバリエーションを作り、そのうちの1つを表示する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "85af6231-921a-4130-99d3-f6998f761df8",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/construct-circuits/extracted-outputs/85af6231-921a-4130-99d3-f6998f761df8-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "circuits = []\n",
        "for value in range(100):\n",
        "    circuits.append(qc.assign_parameters({angle: value}))\n",
        "\n",
        "circuits[0].draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ede2ff7c-5e68-4458-87b3-887b5b027ee1",
      "metadata": {},
      "source": [
        "回路の未定義パラメータのリストは、 `parameters` アトリビュートにあります。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "0990b840-f8c4-4416-b2b5-9861173a9471",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "ParameterView([Parameter(angle)])"
            ]
          },
          "execution_count": 17,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc.parameters"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8e415c37",
      "metadata": {},
      "source": [
        "<span id=\"change-a-parameters-name\" />\n",
        "\n",
        "### パラメータの名前を変更する\n",
        "\n",
        "デフォルトでは、パラメータ化された回路のパラメータ名には接頭辞 `x`「-」が付与されます。例えば、 `x[0]`. 定義後に名前を変更できます。次の例に示すように。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "1d3e6424",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.circuit.library import z_feature_map\n",
        "from qiskit.circuit import ParameterVector\n",
        "\n",
        "# Define a parameterized circuit with default names\n",
        "# For example, x[0]\n",
        "circuit = z_feature_map(2)\n",
        "\n",
        "# Set new parameter names\n",
        "# They will now be prefixed by `hi` instead\n",
        "# For example, hi[0]\n",
        "training_params = ParameterVector(\"hi\", 2)\n",
        "\n",
        "# Assign parameter names to the quantum circuit\n",
        "circuit = circuit.assign_parameters(parameters=training_params)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5af44bc3",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * 近い将来の量子アルゴリズムについて学ぶには、 [変分アルゴリズム設計](/learning/courses/variational-algorithm-design)コースを受講してください。\n",
        "  * [Grover's Algorithmの](/docs/tutorials/grovers-algorithm)チュートリアルで使用されている回路の例をご覧ください。\n",
        "  * [IBM Quantum Composer を使って](/docs/guides/composer)簡単な回路を作る。\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": 5
}