{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f560a2bd-78d2-45fd-8f1b-9f0a4c5e178d",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"プリミティブの紹介\"\n",
        "description: \"Qiskitのプリミティブの概要と、利用可能なプリミティブの説明\"\n",
        "---\n",
        "\n",
        "<span id=\"introduction-to-primitives\" />\n",
        "\n",
        "# プリミティブの紹介\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7bfc257f-69c5-4fb1-8042-b62efa8cf64e",
      "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.0\n",
        "    qiskit-ibm-runtime~=0.43.1\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3ac7f2c2-1541-49f1-9f8f-4c0a8e3a149a",
      "metadata": {},
      "source": [
        "<span id=\"qpu-access-patterns\" />\n",
        "\n",
        "<span id=\"why-did-qiskit-introduce-primitives\" />\n",
        "\n",
        "## Qiskitはなぜプリミティブを導入したのか？\n",
        "\n",
        "開発者がCPUのレジスタを直接操作しなければならなかった古典的なコンピューターの初期と同様、QPUへの初期のインターフェースは、単に制御電子機器から生のデータを返すだけだった。\n",
        "QPUが研究室に設置され、研究者だけが直接アクセスできた時代には、これは大きな問題ではなかった。\n",
        "ほとんどの開発者は、このような生データを 0s や 1s に抽出することに慣れていないし、慣れていないはずであることを認識し、Qiskitは、クラウド上のQPUにアクセスするための最初の抽象化である `backend.run` を導入した。 これにより開発者は 使い慣れたデータ・フォーマットで操作し、全体像に集中できるようになった。\n",
        "\n",
        "QPUへのアクセスが普及し、より多くの量子アルゴリズムが開発されるにつれて、より高度な抽象化の必要性が再び浮上した、 より高度な抽象化の必要性が出てきた。 これに対してQiskitは プリミティブインターフェースを導入しました： 期待値推定 (`Estimator`) と回路サンプリング (`Sampler`) です。その目的は 開発者がより技術革新に集中し、データ変換に専念できるようにすることである。 プリミティブ・インターフェースは、 `backend.run` インターフェースに取って代わるもので、 `Sampler` は、 `backend.run` で提供されていたものと同じハードウェアへの直接アクセスを提供する。\n",
        "\n",
        "<span id=\"what-is-a-primitive\" />\n",
        "\n",
        "## プリミティブとは何か？\n",
        "\n",
        "コンピューティング・システムは、複数の抽象化されたレイヤーの上に構築されている。 抽象化することで 目の前のタスクに関連する特定の詳細レベルに焦点を当てることができる。 ハードウェアに近づけば近づくほど 必要な抽象度は低くなる（例えば、CPUの命令レベルでデータを移動したり操作したりする必要があるかもしれない）。 実行したいタスクが複雑であればあるほど、抽象度は高くなる、 実行したいタスクが複雑であればあるほど、抽象度は高くなる。 を使うようなものだ）。\n",
        "\n",
        "この文脈では、 *プリミティブとは*最小の処理命令であり、ある抽象化レベルに対して有用なものを作ることができる最も単純な構成要素である。 プリミティブとは、最小の処理命令のことである。\n",
        "\n",
        "最近の量子コンピューティングの進歩は、より高い抽象度での作業の必要性を高めている。\n",
        "量子プロセッシング・ユニット（QPU）が大型化し、ワークフローが複雑化するにつれて、量子デバイスを個々の量子ビット信号と相互作用させることから、必要なタスクを実行するシステムとして捉えることに焦点が移っている。 量子デバイスを、必要なタスクを実行するシステムとして捉えるようになる。\n",
        "\n",
        "量子コンピュータの最も一般的なタスクは、量子状態のサンプリングと期待値の計算の2つである。\n",
        "これらのタスクは、 Qiskit primitives : **Estimator** and **Samplerの**設計の動機となった。\n",
        "\n",
        "* エスティメーターは、量子回路によって準備された状態に関する観測値の期待値を計算する。\n",
        "* サンプラーは量子回路の実行から出力レジスタをサンプリングする。\n",
        "\n",
        "要するに、 Qiskit primitives によって導入された計算モデルは、量子プログラミングを現在の古典的なプログラミングに一歩近づけたのである。 そこでは、ハードウェアの詳細よりも、あなたが達成しようとしている結果に焦点が当てられている。 に焦点を当てている。\n",
        "\n",
        "<span id=\"primitive-definition-and-implementations\" />\n",
        "\n",
        "## プリミティブの定義と実装\n",
        "\n",
        "Qiskit primitives には、基底クラスとその実装という 2 種類があります。 Estimator および Sampler プリミティブは、 Qiskit SDK （module [`qiskit.primitives`](/docs/api/qiskit/primitives) 内）にあるオープンソースのプリミティブ基底クラスによって定義されています。 プロバイダー（ IBM Quantum Compute Service など）は、これらの基底クラスを使用して、独自の Sampler および Estimator の実装を派生させることができます。  ほとんどのユーザーは、基本プリミティブそのものではなく、プロバイダの実装とやり取りすることになります。\n",
        "\n",
        "<span id=\"base-classes\" />\n",
        "\n",
        "### 基本クラス\n",
        "\n",
        "プリミティブ `Base` は、プリミティブを実装するための共通インターフェースを定義する抽象クラスです。 この [`qiskit.primitives`](/docs/api/qiskit/primitives) モジュール内のその他のすべてのクラスは、これらの基底クラスを継承しています。 開発者は、特定のプロバイダー向けに独自のプリミティブベースの実行モデルを作成したい場合、これらを使用すべきです。 これらのクラスは、高度にカスタマイズされた処理を行いたいが、既存のプリミティブの実装では自分のニーズに対して単純すぎると感じる人にとっても役立つかもしれません。 一般ユーザーは、基底クラスを直接使用することはありません。\n",
        "\n",
        "[`BaseEstimatorV1`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV1) なお [`BaseSamplerV1`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV1) 、 V1 のプリミティブも引き続き使用可能ですが、本ガイドでは、最新かつより一般的に使用されている V2 のプリミティブに焦点を当てています。\n",
        "\n",
        "[`BaseEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BaseEstimatorV2) および [`BaseSamplerV2`](/docs/api/qiskit/qiskit.primitives.BaseSamplerV2) - Qiskitのリファレンスプリミティブは、これらのインターフェース仕様に準拠しています。\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "<span id=\"implementations\" />\n",
        "\n",
        "### 実装\n",
        "\n",
        "すべてのプリミティブは基底クラスから派生しているため、一般的な構造や使い方は同じです。  たとえば、すべてのEstimatorプリミティブの入力形式は同じです。  しかし、実装にはそれぞれ独自の特徴がある。\n",
        "\n",
        "これらはプリミティブの基本クラスの実装です：\n",
        "\n",
        "* [IBM Quantum](/docs/guides/qiskit-runtime-primitives) のプリミティブである [`EstimatorV2`](/docs/api/qiskit-ibm-runtime/estimator-v2) および は、クラウドベースのサービスとして [`SamplerV2`](/docs/api/qiskit-ibm-runtime/sampler-v2)、より洗練された実装（例えば、エラー緩和機能の組み込みなど）を提供します。 この基本プリミティブの実装は、 IBM Quantum® ハードウェアにアクセスするために使用されます。\n",
        "\n",
        "* [`StatevectorEstimator`](/docs/api/qiskit/qiskit.primitives.StatevectorEstimator) および [`StatevectorSampler`](/docs/api/qiskit/qiskit.primitives.StatevectorSampler#statevectorsampler) - Qiskitに組み込まれたシミュレータを使用したプリミティブの参照実装。 これらはQiskit [`quantum_info`](/docs/api/qiskit/quantum_info#quantum-information) モジュールを使用して構築されており、理想的な状態ベクトルのシミュレーションに基づいて結果を算出します。  これらはQiskitを通じて利用できます。 使用方法の詳細については、「 [Qiskit SDK プリミティブを用いた正確なシミュレーション](/docs/guides/simulate-with-qiskit-sdk-primitives)」 を参照してください。\n",
        "\n",
        "* [`BackendEstimatorV2`](/docs/api/qiskit/qiskit.primitives.BackendEstimatorV2) また [`BackendSamplerV2`](/docs/api/qiskit/qiskit.primitives.BackendSamplerV2) 、これらのクラスを使用すれば、あらゆる量子コンピューティングリソースをプリミティブとして「ラップ」することができます。 これにより、まだプリミティブベースのインターフェースを持たないプロバイダーに対して、プリミティブ形式のコードを記述できるようになります。 これらのクラスは、通常のSamplerやEstimatorと同じように使用できますが、実行する量子コンピュータを選択するための追加の `backend` 引数を指定して初期化する必要があります。 これらはQiskitを使用してアクセスします。 詳細については[、バックエンドプリミティブ](/docs/guides/get-started-with-backend-primitives)のガイドを参照してください。\n",
        "\n",
        "<span id=\"options\" />\n",
        "\n",
        "## オプション\n",
        "\n",
        "プリミティブにオプションを渡すことで、必要に応じてカスタマイズすることができます。 プリミティブ `run()` のメソッドのインターフェースはすべての実装で共通していますが、そのオプションは共通ではありません。 特定のプリミティブの実装がサポートするオプションについては、APIリファレンスを参照してください。\n",
        "\n",
        "たとえば、 IBM Quantum プリミティブのオプションについては、「 [Estimatorオプション](/docs/guides/estimator-options) 」および [「Samplerオプション」](/docs/guides/sampler-options) のトピックを参照してください。また、Qiskit Aerプリミティブのオプションについては、 [Qiskit Aer APIリファレンス](https://qiskit.github.io/qiskit-aer/apidocs/aer_primitives.html)を参照してください。\n",
        "\n",
        "<span id=\"benefits-of-qiskit-primitives\" />\n",
        "\n",
        "## Qiskit primitives のメリット\n",
        "\n",
        "プリミティブを使用することで、Qiskitユーザーは、細部まで明示的に\n",
        "管理することなく、特定のQPU向けの量子コードを記述することができます。 また、抽象化のレイヤーが追加されることで、特定のプロバイダーが提供する高度なハードウェア機能に、\n",
        "より容易にアクセスできるようになる可能性があります。 たとえば、 IBM Quantum プリミティブを使用すれば、\n",
        "これらの手法を独自に実装する代わりに [`resilience_level`](/docs/api/qiskit-ibm-runtime/options-estimator-options#resilience_level)、プリミティブのオプションを切り替えることで、エラーの軽減や抑制に関する最新の進歩を活用することができます。\n",
        "\n",
        "ハードウェア・プロバイダにとって、プリミティブをネイティブに実装することは、高度な後処理技術などのハードウェア機能にアクセスするための、より「すぐに使える」方法をユーザに提供できることを意味します。 プリミティブをネイティブに実装することは、高度な後処理技術などのハードウェア機能にアクセスするための、より「すぐに使える」方法をユーザーに提供できることを意味します。 そのため、ユーザーはハードウェアの能力を最大限に活用しやすくなります。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "02dbbc7d-76e7-4a89-8739-ba7f3a5a05b8",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 次のステップ\n",
        "\n",
        "<Admonition type=\"tip\" title=\"推奨事項\">\n",
        "  * [基本的な](/docs/guides/primitive-input-output)入出力について理解する。\n",
        "  * 具体的な[例](/docs/guides/simulate-with-qiskit-sdk-primitives)を確認してください。\n",
        "  * IBM Quantum Learning の[コスト関数のレッスンを通して](/learning/courses/variational-algorithm-design/cost-functions)、プリミティブの練習をしましょう。\n",
        "  * 「[プロバイダーの作成](/docs/guides/create-a-provider) 」を参照し、独自のSamplerおよびEstimatorプリミティブを実装する方法を確認してください。\n",
        "  * [APIリファレンス](/docs/api/qiskit/primitives)をご覧ください。\n",
        "  * [V2 プリミティブへの移行を](/docs/guides/v2-primitives)読む。\n",
        "  * IBM のQPU上で回路を実行するために使用される、 [IBM Quantum プリミティブ](/docs/guides/qiskit-runtime-primitives)について学びましょう。\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
}