{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "e6d26387-f218-4f62-80c4-792103129b99",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit Aerプリミティブを用いた安定化回路の効率的なシミュレーション\"\n",
        "description: \"Qiskit Aerプリミティブを用いた安定化回路の効率的なシミュレーション方法\"\n",
        "---\n",
        "\n",
        "<span id=\"efficient-simulation-of-stabilizer-circuits-with-qiskit-aer-primitives\" />\n",
        "\n",
        "# Qiskit Aerプリミティブを用いた安定化回路の効率的なシミュレーション\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f1bcbbdb-965d-41f0-88dd-bb42834b35b9",
      "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",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "386709ed-183b-4759-bb1b-56cdedf80539",
      "metadata": {},
      "source": [
        "このページでは、Qiskit Aerプリミティブを使って、パウリノイズを含むスタビライザー回路を効率的にシミュレーションする方法を紹介します。\n",
        "\n",
        "安定化回路はクリフォード回路とも呼ばれ、古典的に効率よくシミュレーションできる量子回路の重要な限定クラスである。 スタビライザー回路を定義するには、いくつかの等価な方法がある。 一つの定義として、スタビライザー回路とは、以下のゲートのみで構成される量子回路である：\n",
        "\n",
        "* [CX](../api/qiskit/qiskit.circuit.library.CXGate)\n",
        "* [ハダマルド](../api/qiskit/qiskit.circuit.library.HGate)\n",
        "* [S](../api/qiskit/qiskit.circuit.library.SGate)\n",
        "* [寸法](../api/qiskit/circuit#qiskit.circuit.Measure)\n",
        "\n",
        "ハダマードとSを用いて、任意のパウリ回転ゲート( [$R_x$](/docs/api/qiskit/qiskit.circuit.library.RXGate), [$R_y$](/docs/api/qiskit/qiskit.circuit.library.RYGate) と [$R_z$](/docs/api/qiskit/qiskit.circuit.library.RZGate) )の集合 $\\{0, \\frac{\\pi}{2}, \\pi, \\frac{3\\pi}{2}\\}$ (グローバル位相まで)に含まれる角度を持つ任意のパウリ回転ゲートを構成することができるので、これらのゲートも定義に含めることができる。\n",
        "\n",
        "安定化回路は量子エラー訂正の研究にとって重要である。 古典的なシミュレーションが可能なため、量子コンピュータの出力を検証するのにも役立つ。 例えば、100量子ビットを使う量子回路を量子コンピューターで実行したいとする。 量子コンピューターが正しく動作していることをどうやって確認するのですか？ 100量子ビットの量子回路は、ブルートフォース（総当り）の古典的シミュレーションの域を出ない。 スタビライザー回路になるように回路を修正すれば、量子コンピュータ上で、目的の回路と似た構造を持ちながら古典コンピュータ上でシミュレーションできる回路を実行できる。 スタビライザー回路で量子コンピュータの出力をチェックすることで、非スタビライザー回路でも量子コンピュータが正しく動作していることを確信できる。 この考え方が実際に使われている例については、「 [*フォールト・トレランス以前の量子コンピューティングの有用性の証拠*](https://www.nature.com/articles/s41586-023-06096-3) 」を参照されたい。\n",
        "\n",
        "[Qiskit Aerプリミティブによる厳密でノイズの少ないシミュレーションでは](simulate-with-qiskit-aer)、 [Qiskit Aerを](https://qiskit.org/ecosystem/aer/)使用して一般的な量子回路の厳密でノイズの少ないシミュレーションを実行する方法を示しています。 その記事で使われた回路例、 [efficient\\_su2を](../api/qiskit/qiskit.circuit.library.efficient_su2)使った8量子ビット回路を考えてみよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "2d26ac3e-2a6a-4d73-900f-470200a63154",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-stabilizer-circuits/extracted-outputs/2d26ac3e-2a6a-4d73-900f-470200a63154-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "n_qubits = 8\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9f72e683-a828-456d-a5d4-910758cc9add",
      "metadata": {},
      "source": [
        "Qiskit Aerを使って、この回路を簡単にシミュレーションすることができた。 しかし、量子ビット数を500に設定したとしよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "43c8277f-3f0d-4d31-a1c2-e4c541083f5d",
      "metadata": {},
      "outputs": [],
      "source": [
        "n_qubits = 500\n",
        "circuit = efficient_su2(n_qubits)\n",
        "# don't try to draw the circuit because it's too large"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ecd975b0-2ec0-4a99-a0f6-790d43af19fb",
      "metadata": {},
      "source": [
        "量子回路のシミュレーション・コストは量子ビット数によって指数関数的に増大するため、このような大規模な回路は一般に、Qiskit Aerのような高性能シミュレータの能力を超えてしまう。 一般的な量子回路の古典的シミュレーションは、量子ビット数がおよそ50から100量子ビットを超えると実行不可能になる。 ただし、 efficient\\_su2 回路は、 $R_y$ と $R_z$ ゲートの角度によってパラメータ化されていることに注意。 これらの角度がすべて集合 $\\{0, \\frac{\\pi}{2}, \\pi, \\frac{3\\pi}{2}\\}$ に含まれる場合、その回路はスタビライザー回路であり、効率的にシミュレーションできる！\n",
        "\n",
        "次のセルでは、回路がスタビライザー回路であることが保証されるようにランダムに選ばれたパラメータを使用して、スタビライザー回路シミュレータにバックアップされたサンプラー・プリミティブで回路を実行する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "2210bbe3-1a89-48fe-a4ea-f3c9b1cd37d0",
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_aer import AerSimulator\n",
        "from qiskit_aer.primitives import SamplerV2 as Sampler\n",
        "\n",
        "measured_circuit = circuit.copy()\n",
        "measured_circuit.measure_all()\n",
        "\n",
        "rng = np.random.default_rng(1234)\n",
        "params = rng.choice(\n",
        "    [0, np.pi / 2, np.pi, 3 * np.pi / 2],\n",
        "    size=circuit.num_parameters,\n",
        ")\n",
        "\n",
        "# Initialize a Sampler backed by the stabilizer circuit simulator\n",
        "exact_sampler = Sampler(\n",
        "    options=dict(backend_options=dict(method=\"stabilizer\"))\n",
        ")\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(\n",
        "    1, AerSimulator(method=\"stabilizer\")\n",
        ")\n",
        "isa_circuit = pass_manager.run(measured_circuit)\n",
        "pub = (isa_circuit, params)\n",
        "job = exact_sampler.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "counts = pub_result.data.meas.get_counts()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "445694b0-3e5b-4fc2-a610-f86674065045",
      "metadata": {},
      "source": [
        "スタビライザー回路シミュレーターはノイズ・シミュレーションもサポートしているが、限られたクラスのノイズ・モデルに対してのみである。 具体的には、量子ノイズは[パウリ誤差](https://qiskit.org/ecosystem/aer/stubs/qiskit_aer.noise.pauli_error.html#qiskit_aer.noise.pauli_error)チャネルによって特徴付けられなければならない。 [脱分極エラーも](https://qiskit.org/ecosystem/aer/stubs/qiskit_aer.noise.depolarizing_error.html)このカテゴリーに入るので、シミュレートすることができる。 [読み出し誤差の](https://qiskit.org/ecosystem/aer/stubs/qiskit_aer.noise.ReadoutError.html)ような古典的なノイズチャンネルもシミュレートできる。\n",
        "\n",
        "次のコード・セルは、前回と同じシミュレーションを実行しますが、今回は、各CXゲートに2％の脱分極誤差を加えるノイズ・モデルと、各測定ビットを5％の確率で反転させる読み出し誤差を指定します。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "71dd8d78-6efd-4c4e-900a-1d73deafe46e",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit_aer.noise import NoiseModel, depolarizing_error, ReadoutError\n",
        "\n",
        "noise_model = NoiseModel()\n",
        "cx_depolarizing_prob = 0.02\n",
        "bit_flip_prob = 0.05\n",
        "noise_model.add_all_qubit_quantum_error(\n",
        "    depolarizing_error(cx_depolarizing_prob, 2), [\"cx\"]\n",
        ")\n",
        "noise_model.add_all_qubit_readout_error(\n",
        "    ReadoutError(\n",
        "        [\n",
        "            [1 - bit_flip_prob, bit_flip_prob],\n",
        "            [bit_flip_prob, 1 - bit_flip_prob],\n",
        "        ]\n",
        "    )\n",
        ")\n",
        "\n",
        "noisy_sampler = Sampler(\n",
        "    options=dict(\n",
        "        backend_options=dict(method=\"stabilizer\", noise_model=noise_model)\n",
        "    )\n",
        ")\n",
        "job = noisy_sampler.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "counts = pub_result.data.meas.get_counts()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "01b3e796-bd06-419f-a2fc-55c8603f662f",
      "metadata": {},
      "source": [
        "ここで、スタビライザー・シミュレータに裏付けされた Estimator プリミティブを使用して、観測値 $ZZ \\cdots Z$ の期待値を計算してみましょう。スタビライザー回路の特殊な構造により、結果は0になる可能性が非常に高いです。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "57fb0674-5bd2-44b0-a28e-e73deff455cf",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.0"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "from qiskit_aer.primitives import EstimatorV2 as Estimator\n",
        "\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)\n",
        "\n",
        "exact_estimator = Estimator(\n",
        "    options=dict(backend_options=dict(method=\"stabilizer\")),\n",
        ")\n",
        "isa_circuit = pass_manager.run(circuit)\n",
        "pub = (isa_circuit, observable, params)\n",
        "job = exact_estimator.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "exact_value = float(pub_result.data.evs)\n",
        "exact_value"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9d5e6593-06f0-4e1b-a4f0-7b640a74f6c5",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * Qiskit Aer を使用して回路をシミュレーションするには、 [「Qiskit Aer プリミティブによる正確なシミュレーションとノイズを含むシミュレーション」](/docs/guides/simulate-with-qiskit-sdk-primitives) を参照してください。\n",
        "  * [Qiskit Aerの](https://qiskit.org/ecosystem/aer/)ドキュメントを確認してください。\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
}