{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "d518f5b4-a19b-4419-b615-59caae67c080",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"OpenQASM 3 と Qiskit SDK\"\n",
        "description: \"OpenQASM 3と Qiskit SDK 間のコード変換方法\"\n",
        "---\n",
        "\n",
        "<span id=\"openqasm-3-and-the-qiskit-sdk\" />\n",
        "\n",
        "# OpenQASM 3 と Qiskit SDK\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a86fc5a5-cc81-40e8-96ab-54841218f619",
      "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": "232070ea-8685-4638-ba9d-7b52a123fd2e",
      "metadata": {},
      "source": [
        "Qiskit SDKは、量子プログラムの OpenQASM 表現と QuantumCircuit クラスの間で変換するためのいくつかのツールを提供します。 なお、これらのツールはまだ探索的な開発段階であり、 OpenQASM 3によって表現される動的回路機能に対するQiskitのサポートが増加するにつれて進化し続ける。\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  この機能はまだ試行段階である。  したがって、シンタックスや能力は進化していくだろう。\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"import-an-openqasm-3-program-into-qiskit\" />\n",
        "\n",
        "## OpenQASM 3プログラムをQiskitにインポートする\n",
        "\n",
        "この機能を使用するには、 `qiskit_qasm3_import ` パッケージをインストールする必要があります。 以下のコマンドでインストールする。\n",
        "\n",
        "```bash\n",
        "pip install qiskit-qasm3-import\n",
        "```\n",
        "\n",
        "現在、 OpenQASM 3からQiskitにインポートするために2つの高レベル関数が利用可能です。 これらの関数は、ファイル名を受け取る `load()` と、プログラム自体を文字列として受け取る `loads()` である：\n",
        "\n",
        "```python\n",
        "import qiskit.qasm3\n",
        "qiskit.qasm3.load(file_name)\n",
        "qiskit.qasm3.loads(program_string)\n",
        "```\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d3adad38-7523-427e-a358-b7068423f59c",
      "metadata": {},
      "source": [
        "この例では、 OpenQASM 3 を使って量子プログラムを定義し、 `loads()` を使ってそれを直接 QuantumCircuit:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "e805197c-51fb-4216-8d24-ae26633d29bc",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/interoperate-qiskit-qasm3/extracted-outputs/e805197c-51fb-4216-8d24-ae26633d29bc-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "import qiskit.qasm3\n",
        "\n",
        "program = \"\"\"\n",
        "    OPENQASM 3.0;\n",
        "    include \"stdgates.inc\";\n",
        "\n",
        "    input float[64] a;\n",
        "    qubit[3] q;\n",
        "    bit[2] mid;\n",
        "    bit[3] out;\n",
        "\n",
        "    let aliased = q[0:1];\n",
        "\n",
        "    gate my_gate(a) c, t {\n",
        "      gphase(a / 2);\n",
        "      ry(a) c;\n",
        "      cx c, t;\n",
        "    }\n",
        "    gate my_phase(a) c {\n",
        "      ctrl @ inv @ gphase(a) c;\n",
        "    }\n",
        "\n",
        "    my_gate(a * 2) aliased[0], q[{1, 2}][0];\n",
        "    measure q[0] -> mid[0];\n",
        "    measure q[1] -> mid[1];\n",
        "\n",
        "    while (mid == \"00\") {\n",
        "      reset q[0];\n",
        "      reset q[1];\n",
        "      my_gate(a) q[0], q[1];\n",
        "      my_phase(a - pi/2) q[1];\n",
        "      mid[0] = measure q[0];\n",
        "      mid[1] = measure q[1];\n",
        "    }\n",
        "\n",
        "    if (mid[0]) {\n",
        "      let inner_alias = q[{0, 1}];\n",
        "      reset inner_alias;\n",
        "    }\n",
        "\n",
        "    out = measure q;\n",
        "\"\"\"\n",
        "circuit = qiskit.qasm3.loads(program)\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a81fcee5-a89c-4e6d-8a9d-53c7da1e6c0d",
      "metadata": {},
      "source": [
        "<span id=\"export-to-openqasm-3\" />\n",
        "\n",
        "## OpenQASM 3にエクスポート\n",
        "\n",
        "Qiskitコードを OpenQASM 3にエクスポートするには、文字列にエクスポートする `dumps()`、またはファイルにエクスポートする `dump()`。\n",
        "\n",
        "<span id=\"example-with-dumps\" />\n",
        "\n",
        "### 例： `dumps()`\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "68e8d8b2-468b-4a70-903a-679355f9b7ee",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "'OPENQASM 3.0;\\ninclude \"stdgates.inc\";\\nbit[2] meas;\\nqubit[2] q;\\nh q[0];\\ncx q[0], q[1];\\nbarrier q[0], q[1];\\nmeas[0] = measure q[0];\\nmeas[1] = measure q[1];\\n'"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.qasm3 import dumps\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "dumps(qc)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b7a54ec7-c08d-4390-8ce8-b5008c8312d3",
      "metadata": {},
      "source": [
        "<span id=\"example-with-dump\" />\n",
        "\n",
        "### 例： `dump()`\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "cc93cc6f-08e0-420f-8fb4-64620a53dc5a",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.qasm3 import dump\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.h(0)\n",
        "qc.cx(0, 1)\n",
        "qc.measure_all()\n",
        "\n",
        "f = open(\"my_file.txt\", \"w\")\n",
        "dump(qc, f)\n",
        "f.close()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef8e59ee-2889-4b73-9fe6-30d5e69f7164",
      "metadata": {},
      "source": [
        "詳細については、APIリファレンスの「 [OpenQASM 3へのエクスポート](/docs/api/qiskit/qasm3#exporting-to-openqasm-3) 」セクションを参照のこと。\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [IBM Quantum Composerの](/docs/guides/composer)ガイドで、 OpenQASM コードを生成する方法を学んでください。\n",
        "  * [OpenQASM 3 Qiskit API](/docs/api/qiskit/qasm3) リファレンスを確認してください。\n",
        "  * [「プログラムの確認」](/docs/guides/debugging-tools) のトピックをご覧ください。\n",
        "  * [OpenQASM ライブ仕様を](https://openqasm.com/)確認する。\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
}