{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "4a4b88ed-d21f-4056-9264-0ee8c8ec4b39",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit Aerプリミティブを用いた正確かつノイズを含むシミュレーション\"\n",
        "description: \"Qiskit Aerプリミティブを用いた量子プログラムの正確なシミュレーションとノイズシミュレーションの実装方法を学ぶ\"\n",
        "---\n",
        "\n",
        "<span id=\"exact-and-noisy-simulation-with-qiskit-aer-primitives\" />\n",
        "\n",
        "# Qiskit Aerプリミティブを用いた正確かつノイズを含むシミュレーション\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "678b9055-9164-417c-9897-9fde615b97ae",
      "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": "6a0ae8b1-b413-44ac-9267-fd36345a02df",
      "metadata": {},
      "source": [
        "[Qiskit SDK プリミティブを用いた厳密シミュレーションでは、](/docs/guides/simulate-with-qiskit-sdk-primitives) Qiskitに付属する参照プリミティブを使用して量子回路の厳密シミュレーションを行う方法を示しています。 現在存在する量子プロセッサにはエラーやノイズが生じるため、厳密なシミュレーションの結果は、実際のハードウェア上で回路を実行した際に期待される結果を必ずしも反映するとは限りません。 Qiskit のリファレンスプリミティブではノイズのモデリングはサポートされていませんが、 [Qiskit Aer](https://qiskit.org/ecosystem/aer/) には、ノイズのモデリングをサポートするプリミティブの実装が含まれています。 Qiskit Aerは、リファレンスプリミティブの代わりに使用することで、より高いパフォーマンスと豊富な機能を実現できる高性能な量子回路シミュレータです。 これは [Qiskitエコシステム](https://qiskit.github.io/ecosystem/)の一部です。 本記事では、Qiskit Aerのプリミティブを用いた、正確なシミュレーションおよびノイズを含むシミュレーションの手法について解説します。\n",
        "\n",
        "<Admonition type=\"note\" title=\"ノート\">\n",
        "  * `qiskit-aer` v0.14 またはそれ以降が必要。\n",
        "  * Qiskit Aerのプリミティブはプリミティブインターフェースを実装していますが、 IBM Quantum のプリミティブと同じオプションは提供していません。 たとえば、レジリエンスレベルは、Qiskit Aerのプリミティブでは利用できません。\n",
        "  * Aerがサポートするシミュレーション方法のオプションの詳細については、 [AerSimulator のドキュメントを](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator)参照してください。\n",
        "</Admonition>\n",
        "\n",
        "厳密でノイズの少ないシミュレーションを探求するために、8量子ビットの回路例を作成する：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "df70b5fd-971d-4e7d-a23a-8df037c0fa47",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-aer/extracted-outputs/df70b5fd-971d-4e7d-a23a-8df037c0fa47-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": "2074eaf0-746e-4a36-91d9-db9228f96a0d",
      "metadata": {},
      "source": [
        "この回路には、 $R_y$ と $R_z$ ゲートの回転角度を表すパラメータが含まれている。 この回路をシミュレーションする場合、これらのパラメータに明示的な値を指定する必要がある。 次のセルでは、これらのパラメータにいくつかの値を指定し、 Qiskit AerのEstimatorプリミティブを使って、観測値 $ZZ \\cdots Z$ の正確な期待値を計算する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "40270ca7-1084-4329-aac5-28c87edc3791",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.8870140234256602"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_aer import AerSimulator\n",
        "from qiskit_aer.primitives import EstimatorV2 as Estimator\n",
        "\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)\n",
        "params = [0.1] * circuit.num_parameters\n",
        "\n",
        "exact_estimator = Estimator()\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(3, AerSimulator())\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": "134d97a2-8420-4931-85b4-324679655e24",
      "metadata": {},
      "source": [
        "それでは、すべてのCXゲートに2%の脱分極誤差を含むノイズモデルを初期化しましょう。 実際には、回路を実行する際、2量子ビットゲート（ここではCXゲート）に起因するエラーが、主なエラーの原因となります。 Qiskit Aer でのノイズモデルの構築に関する概要については、 「[ノイズモデルの構築](/docs/guides/build-noise-models) 」を参照してください。\n",
        "\n",
        "次のセルでは、このノイズモデルを組み込んだ推定器を構築し、それを使って観測可能値の期待値を計算する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "82b2f19a-ba10-46a2-ba1b-89cd27bc0e63",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.7247404214143528"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_aer.noise import NoiseModel, depolarizing_error\n",
        "\n",
        "noise_model = NoiseModel()\n",
        "cx_depolarizing_prob = 0.02\n",
        "noise_model.add_all_qubit_quantum_error(\n",
        "    depolarizing_error(cx_depolarizing_prob, 2), [\"cx\"]\n",
        ")\n",
        "\n",
        "noisy_estimator = Estimator(\n",
        "    options=dict(backend_options=dict(noise_model=noise_model))\n",
        ")\n",
        "job = noisy_estimator.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "noisy_value = float(pub_result.data.evs)\n",
        "noisy_value"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6495f179-3fe6-4971-b023-700b8b2c8cbb",
      "metadata": {},
      "source": [
        "ご覧のように、ノイズがある場合の期待値は正しい値からかなり離れている。 実際には、ノイズの影響に対抗するために様々なエラー軽減テクニックを採用することができるが、これらのテクニックについての議論はこの記事の範囲外である。\n",
        "\n",
        "ノイズが最終的な結果にどのような影響を与えるか、非常に大まかな感覚を得るために、各CXゲートに2％の脱分極誤差を加えるノイズモデルを考えてみよう。 確率 $p$ を持つ脱分極エラーは、密度行列 $\\rho$ に対して次のような作用を持つ量子チャンネル $E$ として定義される：\n",
        "\n",
        "$$\n",
        "E(\\rho) = (1 - p) \\rho + p\\frac{I}{2^n}\n",
        "$$\n",
        "\n",
        "ここで、 $n$ は量子ビット数で、この場合は2である。 すなわち、確率 $p$、状態は完全に混合された状態に置き換えられ、確率 $1 - p$、状態は保存される。 $m$ 脱分極チャネルを適用した後、状態が保存される確率は $(1 - p)^m$ となる。したがって、シミュレーションの最後に正しい状態が保持される確率は、回路のCXゲートの数に応じて指数関数的に下がると予想される。\n",
        "\n",
        "回路内のCXゲートの数を数え、 $(1 - p)^m$ を計算しよう。 `count_ops` 。ゲート名とカウント数を対応付ける辞書を取得し、CXゲートのエントリーを取り出す。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3c20f7bc-203a-4f40-bb84-7cf3d231d66e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.6542558123199923"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "cx_count = circuit.count_ops()[\"cx\"]\n",
        "(1 - cx_depolarizing_prob) ** cx_count"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef506e15-7480-46ba-bce7-aa8f2fa78377",
      "metadata": {},
      "source": [
        "この65％という値は、最終的な状態が正しい確率の大まかな推定値を示している。 シミュレーションの初期状態を考慮していないため、これは保守的な見積もりである。\n",
        "\n",
        "次のコードセルは、Qiskit AerのSamplerプリミティブを使用して、ノイズの多い回路からサンプリングする方法を示しています。 Samplerプリミティブで実行する前に、回路に測定値を追加する必要がある。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "76c43aee-d559-4e5b-8228-e5bba3b4499c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'00000000': 60,\n",
              " '00001111': 1,\n",
              " '11000000': 3,\n",
              " '10100000': 3,\n",
              " '10001111': 1,\n",
              " '00010000': 1,\n",
              " '00001010': 1,\n",
              " '00111100': 1,\n",
              " '01000000': 6,\n",
              " '10000000': 5,\n",
              " '00110000': 1,\n",
              " '00011000': 2,\n",
              " '01100000': 2,\n",
              " '00000110': 2,\n",
              " '11000100': 1,\n",
              " '10000110': 1,\n",
              " '01010000': 2,\n",
              " '00011110': 1,\n",
              " '00010100': 2,\n",
              " '01011010': 1,\n",
              " '00000010': 1,\n",
              " '00001100': 1,\n",
              " '11100000': 1}"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_aer.primitives import SamplerV2 as Sampler\n",
        "\n",
        "measured_circuit = circuit.copy()\n",
        "measured_circuit.measure_all()\n",
        "\n",
        "noisy_sampler = Sampler(\n",
        "    options=dict(backend_options=dict(noise_model=noise_model))\n",
        ")\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(3, AerSimulator())\n",
        "isa_circuit = pass_manager.run(measured_circuit)\n",
        "pub = (isa_circuit, params, 100)\n",
        "job = noisy_sampler.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "pub_result.data.meas.get_counts()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "46a8c6b7-3f7c-48e4-9b73-b04a5458ba33",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * 小規模で単純な回路をシミュレーションするには、「 [Qiskit SDK プリミティブを用いた正確なシミュレーション](/docs/guides/simulate-with-qiskit-sdk-primitives) 」を参照してください。\n",
        "  * [Qiskit Aerの](https://qiskit.github.io/qiskit-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
}