{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "4046fd82",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskitによる重ね合わせ\"\n",
        "description: \"量子コンピュータにおける重ね合わせと測定の意味について学びましょう。\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore nflips fliplist qcoin squareroot qnot qsqrtnot qphase qhadamard */}\n",
        "\n",
        "<span id=\"quantum-coins-—-a-module-on-superposition-and-interference\" />\n",
        "\n",
        "# 量子コイン — 重ね合わせと干渉に関するモジュール\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bc3346f6",
      "metadata": {},
      "source": [
        "このQiskit in Classroomsモジュールでは、以下のパッケージがインストールされた Python 環境が必要です：\n",
        "\n",
        "* `qiskit` v2.1.0 または新しい\n",
        "* `qiskit-ibm-runtime` v0.40.1 または新しい\n",
        "* `qiskit-aer` v0.17.0 または新しい\n",
        "* `qiskit.visualization`\n",
        "* `numpy`\n",
        "* `pylatexenc`\n",
        "\n",
        "上記のパッケージをセットアップしてインストールするには、 [Qiskitのインストール](/docs/guides/install-qiskit)ガイドをご覧ください。\n",
        "実際の量子コンピュータでジョブを実行するには、 IBM Quantum® のアカウントを設定する必要があります。 [IBM Cloud アカウントの設定](/docs/guides/cloud-setup)ガイドの手順に従ってください。\n",
        "\n",
        "このモジュールはテストされ、47秒のQPU時間を使用した。 これはあくまでも目安である。 実際の使用方法は異なる場合があります。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "3cf87503",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Uncomment and modify this line as needed to install dependencies\n",
        "#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fba0059c-4008-4076-95f2-18dab949ca9e",
      "metadata": {},
      "source": [
        "ケイティ博士（ McCormick ）によるモジュールのウォークスルーを以下でご覧いただくか、 [こちらを](https://www.youtube.com/watch?v=TZ-sUHK8vVQ\\&list=PLOFEBzvs-Vvrs2fuvsuT039ariYPsua3d\\&index=6)クリックして YouTube でご覧ください。\n",
        "\n",
        "***\n",
        "\n",
        "<IBMVideo id=\"134413671\" title=\"ケイティ McCormick、量子の重ね合わせについて説明し、実際の量子コンピューターでの測定を探求する。\" />\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8ef56d8f-1358-4c3e-b1be-f56597a5ee89",
      "metadata": {
        "jp-MarkdownHeadingCollapsed": true
      },
      "source": [
        "<span id=\"introduction\" />\n",
        "\n",
        "## 概要\n",
        "\n",
        "このモジュールでは、量子論の核となる原理のひとつである「重ね合わせ」を探求する。 私たちの日常経験において、物体は常に明確な特徴を持っている。 その位置、大きさ、形、色、それらに関するすべてのことは、たとえ私たち観察者がまだ測定していなくても、決定されていて確実なのだ。 量子の世界では必ずしもそうではない。 量子の物体は、古典的に許容される複数の状態の「重ね合わせ」と呼ばれる状態になることがある。 重ね合わせ状態を測定すると、ランダムにそれらの状態のいずれかに「崩壊」する。\n",
        "\n",
        "ある意味では、重ね合わせ状態を測定することは、コインを裏返すようなもので、コインの表裏を前もって知る方法はない。 この根本的な不確定性は、量子力学の不快な側面であり、アインシュタインでさえも苦手としていた。 彼はこのランダム性について「神はサイコロを振らない」と言った。 しかし、後述するように、神は実際にサイコロを振ったり、コインをひっくり返したりする。\n",
        "\n",
        "古典的なコイン・フリップを重ね合わせ状態の測定に例えて考えてみる。 そして--Qiskitと IBM® 量子プロセッサー上の量子ビットを使って「量子コイン」で遊ぶことで、そのアナロジーの限界がすぐにわかるだろう。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "bcf4cb9b-7e3a-49f0-9d0d-756fb42eaae3",
      "metadata": {},
      "source": [
        "<span id=\"classical-coin\" />\n",
        "\n",
        "### 古典硬貨\n",
        "\n",
        "古典的なコインから始めよう。 コインを投げると、50 $~$ %の確率で、表か裏のどちらかが出る。 *原理的には*、コインの正確な初期状態と裏返す力／トルクがわかれば、コインの表裏を計算することができるが、 *実際には*、コインの表裏を先験的に知る方法はない。 そのため、 *古典的な確率状態の*典型例として、結果が本質的にランダムであるコインフリップを使うのである。 この50/50の確率を反映させるために、コインが落ちる前の状態を書くことができる：\n",
        "\n",
        "$$\n",
        "S(coin) =  \\frac{1}{2}|up\\rangle + \\frac{1}{2}|down\\rangle\n",
        "$$\n",
        "\n",
        "ここで、2つの項はフリップの2つの可能な結果を表し、その係数はそれぞれの結果の確率を表す。 通常、「 $|\\rangle$ 」（「ケット」と呼ばれる）は量子状態を表すのに使われるが、ここでは*古典的な*確率状態について話していることに注意。 古典情報と量子情報の表現方法については、「量子情報の基礎」コースの[レッスン1「単一システム](/learning/courses/basics-of-quantum-information/single-systems/introduction) 」を参照してください。\n",
        "\n",
        "コインを1000回ひっくり返して、表と裏の数を記録すると、次のようになる：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "f302ea9f-12af-4950-bce3-7416c163272b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/f302ea9f-12af-4950-bce3-7416c163272b-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# import necessary packages:\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import random\n",
        "\n",
        "\n",
        "nflips = 1000\n",
        "fliplist = [random.randint(0, 1) for f in range(nflips)]\n",
        "\n",
        "\n",
        "# bar plots using get_gaussian_probs function\n",
        "plt.hist(fliplist)\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6f2bc32b-cb77-40fc-849a-e1b9de46b813",
      "metadata": {},
      "source": [
        "<span id=\"quantum-coin\" />\n",
        "\n",
        "### 量子コイン\n",
        "\n",
        "量子コンピュータの量子ビットを使えば、同じような確率的状態を作り出すことができる。 コインフリップのように、量子ビットもまた、 $|0\\rangle$ と $|1\\rangle$ の2つの状態で測定することができる。 $|0\\rangle$ の状態から始めて、ハダマードゲートと呼ばれるものを量子ビットに適用することで、確率的な「重ね合わせ」状態を作り出す。 これにより、コインは $|0\\rangle$ と $|1\\rangle$ の等しい重ね合わせの状態になる。この重ね合わせ状態は、一見コインのように見えるかもしれないが、それ以上のものがあることがすぐにわかるだろう。 このモジュールのポイントは、重ね合わせが古典的なコイン・フリップと同じではないことを示すことだ。\n",
        "\n",
        "つまり、量子ビットは0と1の等しい重ね合わせの状態にあるため、量子ビットを測定すると、50％の確率で $|0\\rangle$、50％の確率で $|1\\rangle$。この状態を古典的な確率論的な場合とは少し違った書き方をするのは、後で明らかになる理由からである：\n",
        "\n",
        "$$\n",
        "|\\psi\\rangle = \\frac{1}{\\sqrt{2}} |0\\rangle + \\frac{1}{\\sqrt{2}} |1\\rangle\n",
        "$$\n",
        "\n",
        "ここで、2つの状態のそれぞれを測定する確率は、上記の古典的な確率論的状態の場合のように、 **もはや**係数に等しくない。 その代わりに、確率を与えるのは係数の **2乗**であり、これらの係数はそれぞれ複素数、つまり実部と虚部の両方を持つことができる。\n",
        "\n",
        "しかし、こうした違いはあっても、この状態を測定する結果は、基本的にコインをひっくり返すのと同じである。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "57f4c8c7-5524-4fcb-a37f-60a2c10bfa9b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/57f4c8c7-5524-4fcb-a37f-60a2c10bfa9b-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "\n",
        "qcoin = QuantumCircuit(1)\n",
        "qcoin.h(0)\n",
        "qcoin.measure_all()\n",
        "\n",
        "qcoin.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "286f964c-08fb-4df7-be8c-b3c6eebdf8da",
      "metadata": {},
      "source": [
        "つまり、実質的に、アダマールゲートを適用することは、コインを投げることに相当するのです。 そして、コインが表か裏になる確率を調べるためにコインを1000回投げたのと同じように、Qiskitでも「量子コイン」を使って同様の実験を行うことができます 「」というプリミティブを使用することができます `Sampler`。これは回路を数回繰り返し実行し、その結果得られる状態の統計量をサンプリングするものです。\n",
        "\n",
        "まず、 IBM Quantum のCompute Serviceとプリミティブを読み込み、次に回路を実行するバックエンドを選択します。\n",
        "\n",
        "初回使用時に認証情報を保存するためのコードが以下にあります。 ノートブックを自分の環境に保存した後、必ずこの情報をノートブックから削除してください。そうすれば、ノートブックを共有するときにあなたの認証情報が誤って共有されることはありません。 詳しいガイダンスについては、 [IBM Cloud アカウントの設定](/docs/guides/initialize-account)および[信頼できない環境でのサービスの初期](/docs/guides/cloud-setup-untrusted)化を参照してください。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "3afaafe6",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Load IBM Quantum Compute Service\n",
        "from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "# Syntax for first saving your token.  Delete these lines after saving your credentials.\n",
        "# QiskitRuntimeService.save_account(channel='ibm_quantum_platform',\n",
        "# instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)\n",
        "# service = QiskitRuntimeService(channel='ibm_quantum_platform')\n",
        "\n",
        "# Load saved credentials\n",
        "service = QiskitRuntimeService()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "47c48517-5b27-47df-9ea8-18459d4bf720",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "ibm_kingston\n"
          ]
        }
      ],
      "source": [
        "# Load the Runtime primitive and session\n",
        "from qiskit_ibm_runtime import (\n",
        "    SamplerV2 as Sampler,\n",
        "    EstimatorV2 as Estimator,\n",
        ")\n",
        "\n",
        "# Use the least busy backend\n",
        "backend = service.least_busy()\n",
        "print(backend.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a2e39d00-db68-46cb-b4af-7b2559955313",
      "metadata": {},
      "source": [
        "アカウントに空きがない場合は、代わりにシミュレーターで実行することもできます。 コードのコメントを解除して、下のセルを実行するだけだ：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "f85953c3-d67d-4c84-b078-80669e51f9ca",
      "metadata": {},
      "outputs": [],
      "source": [
        "## Use a local simulator\n",
        "\n",
        "# from qiskit_aer import AerSimulator\n",
        "\n",
        "## Generate a simulator that mimics the real quantum system\n",
        "\n",
        "# backend_sim = AerSimulator.from_backend(backend)\n",
        "\n",
        "## Import an estimator, this time from qiskit (we will import from Runtime for real hardware)\n",
        "\n",
        "# from qiskit.primitives import BackendSamplerV2\n",
        "# sampler_sim = BackendSamplerV2(backend = backend_sim)\n",
        "# from qiskit.primitives import BackendEstimatorV2\n",
        "# estimator_sim = BackendEstimatorV2(backend = backend_sim)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "634fb53f-944c-4c2c-9e98-357acd0281aa",
      "metadata": {},
      "outputs": [],
      "source": [
        "## Transpile\n",
        "from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
        "\n",
        "target = backend.target\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "\n",
        "qc_isa = pm.run(qcoin)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "e7930b08-d235-4c16-8af4-1d258dd80300",
      "metadata": {},
      "outputs": [],
      "source": [
        "## Execute\n",
        "\n",
        "# On real hardware:\n",
        "sampler = Sampler(mode=backend)\n",
        "pubs = [qc_isa]\n",
        "job = sampler.run(pubs, shots=1000)\n",
        "res = job.result()\n",
        "\n",
        "counts = res[0].data.meas.get_counts()\n",
        "\n",
        "# or with Aer simulator with noise model from real backend\n",
        "# job = sampler_sim.run([qc_isa])\n",
        "# counts=job.result()[0].data.meas.get_counts()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "e3b16bd7-276f-4dca-b56e-3dd88bb17b68",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/e3b16bd7-276f-4dca-b56e-3dd88bb17b68-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## Analysis\n",
        "from qiskit.visualization import plot_histogram\n",
        "\n",
        "plot_histogram(counts)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "61743091-7f5b-4660-875c-6ddf7b61d0ab",
      "metadata": {},
      "source": [
        "上記の回路を1000サンプル使用すると、統計的な揺らぎがある程度までは、古典的なコインのヒストグラムと基本的に同じように見えるものができる。\n",
        "\n",
        "量子コインの統計をサンプリングすることに加えて、別のプリミティブも使用できます。 `Estimator` 状態の*観測*量のいわゆる*期待値*を測定する。 この期待値がどのようなものかを説明するために、古典的なコインを例に挙げてみましょう。 例えば、そのコインを使って賭け事をする場合を考えてみましょう。コインを投げ、表が出たら1ドル獲得できます。 しかし、「表」で止まるたびに、1ドルを失うことになる。 各フリップでどれくらいの金額が得られると期待されるか（観測可能変数「money」の期待値）を知りたい場合は、次のように計算します：\n",
        "\n",
        "$$\n",
        "E(money) = \\frac{1}{2} (+ \\text{1 dollar}) +  \\frac{1}{2} (- \\text{1 dollar}) = \\text{0 dollars}\n",
        "$$\n",
        "\n",
        "1ドル勝つ確率も1ドル負ける確率も同じなので、期待値は＄0である。\n",
        "\n",
        "同様に、量子状態の場合、観測値 \"Z \"の期待値を計算することができる。ここでZは、それぞれ $|0\\rangle$ と $|1\\rangle$ の状態に関連する値+1と -1 を持つパウリ行列である。\n",
        "\n",
        "$$\n",
        "\\langle \\psi|Z|\\psi \\rangle = \\frac{1}{2} \\langle 0 | Z | 0 \\rangle +  \\frac{1}{2} \\langle 1 | Z | 1 \\rangle = \\frac{1}{2} (+1) +  \\frac{1}{2}(-1) = 0\n",
        "$$\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "775d62ec-3f26-4238-a1c5-292a6a606581",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<qiskit.circuit.instructionset.InstructionSet at 0x136df1ba0>"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import Pauli\n",
        "\n",
        "qcoin = QuantumCircuit(1)\n",
        "qcoin.h(0)\n",
        "\n",
        "# for Estimator, we do not apply the measurement to the circuit"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "25350a19-390d-450c-89f3-2646d5b6b1a7",
      "metadata": {},
      "outputs": [],
      "source": [
        "## Transpile\n",
        "from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
        "\n",
        "target = backend.target\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "\n",
        "obs = Pauli(\"Z\")\n",
        "\n",
        "qc_isa = pm.run(qcoin)\n",
        "obs_isa = obs.apply_layout(layout=qc_isa.layout)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "47ba8097-c109-4f9f-80a4-44e14ce044a2",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "-0.014799284701239441\n"
          ]
        }
      ],
      "source": [
        "## Execute\n",
        "\n",
        "# On real hardware:\n",
        "estimator = Estimator(mode=backend)\n",
        "pubs = [(qc_isa, obs_isa)]\n",
        "job = estimator.run([[qc_isa, obs_isa]])\n",
        "res = job.result()\n",
        "\n",
        "# On a simulator:\n",
        "# job = estimator_sim.run([[qc_isa, obs_isa]])\n",
        "# res=job.result()\n",
        "\n",
        "print(res[0].data.evs)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eed36776-de55-40a4-b63e-0aa17f144bff",
      "metadata": {},
      "source": [
        "予想通り、期待値は0となった（はぁと）。 これは、0と1の確率が等しいことを確認する別の方法であり、コインフリップのように見える。\n",
        "\n",
        "この時点で、\"量子コイン \"は古典コインとまったく同じように見える。 しかし次のセクションでは、両者の根本的な違いを明らかにするための実験をいくつか行う。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7d10d957-2e8d-4c63-b4a4-7744b9e1a0e9",
      "metadata": {},
      "source": [
        "<span id=\"the-quantum-revealed-an-experiment-in-three-dimensions\" />\n",
        "\n",
        "## 量子解明：三次元における実験\n",
        "\n",
        "思考実験をしてみよう：空中でコインをはじき、それを地面に落とすのではなく、コインが両手の間を通過するときに拍手をし、手のひらでコインを挟むという協調性があるとする。 今、コインは表か裏のどちらかではなく、左か右のどちらかになっている。\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 理解度チェック\n",
        "\n",
        "左が頭、右が頭、それぞれの確率は？\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    それでも確率は五分五分だろう。 コインフリップの結果を測るのに、どの次元を選ぶかは問題ではないはずだ。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "907ac0e3-12cb-4444-ad2e-0b33189b43e6",
      "metadata": {},
      "source": [
        "うまくいけば、ヘッドが左右どちらかに分かれる確率はまだ半々だと答えられただろう。 コインフリップを測定する次元は、結果の確率に影響しないはずである。\n",
        "\n",
        "しかし、量子コインの場合はどうなるのだろうか？ 確認しよう。\n",
        "\n",
        "前回と同じように、ハダマードゲートを使って量子の重ね合わせを作ることができる。 量子コインの \"頭の左右 \"を測るには、古典コインでやったように、別の軸で測ればいい。 量子コンピュータの標準的な測定は、古典的なコインの「表か裏か」の測定と同じように、縦軸に沿って行われる。 しかし、量子コインが左か右か、あるいは、 $x$ -軸に沿った $|+\\rangle$ または $|-\\rangle$ の状態かどうかを尋ねることもできる。 `Sampler` は測定基底Zのサンプルだけだが、 `Estimator` 、Xの期待値を与えることができる。 Xの値はそれぞれ、 $|+\\rangle$、 $|-\\rangle$ の状態に対して+1、 -1。\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 理解度チェック\n",
        "\n",
        "この場合、量子コインが古典コインのようにふるまうとしたら、 $|+\\rangle$ と $|-\\rangle$ の状態を測定する確率は半々である。この場合、 `Estimator` はどのようなXの期待値を返すだろうか？\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    Xを $|+\\rangle$ の状態に適用すると、値と+1が得られ、 $|-\\rangle$ の状態に適用すると、 -1 が得られる。したがって、分布が半々であれば、期待値は0となる。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "2cc7a79f-527c-4af1-a207-06cfa20ac92c",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.9985207100591716\n"
          ]
        }
      ],
      "source": [
        "# Step 1: map problem\n",
        "\n",
        "qcoin_lr = QuantumCircuit(1)\n",
        "qcoin_lr.h(0)\n",
        "\n",
        "obs = Pauli(\"X\")\n",
        "\n",
        "\n",
        "# Step 2: Transpile the circuit\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qcoin_lr)\n",
        "obs_isa = obs.apply_layout(layout=qc_isa.layout)\n",
        "\n",
        "# Step 3: Run the circuit on a real quantum computer\n",
        "\n",
        "estimator = Estimator(mode=backend)\n",
        "pubs = [(qc_isa, obs_isa)]\n",
        "job = estimator.run([[qc_isa, obs_isa]])\n",
        "res = job.result()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "# job = estimator_sim.run([[qc_isa,obs_isa]])\n",
        "# res=job.result()\n",
        "\n",
        "# Step 4: Return the result in classical form, and analyze.\n",
        "\n",
        "print(res[0].data.evs)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "51f97d72-b152-4527-8e42-c066cec33524",
      "metadata": {},
      "source": [
        "この状態でのXの期待値は1である。 つまり、 $|+\\rangle$ と $|-\\rangle$ を測定する確率は半々**ではない**のだ。\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 理解度チェック\n",
        "\n",
        "この期待値は状態 $|\\psi\\rangle$ について何を教えてくれるのか？このXベースで $|+\\rangle$ と $|-\\rangle$ を測定する確率は？\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    期待値は状態 $|+\\rangle$ に対するXの値と同じなので、Xに沿って測定するとき、状態 $|+\\rangle$ を測定する確率が100％であることを意味する。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "37b04a99-0256-41f4-8bf5-362b3508ca34",
      "metadata": {},
      "source": [
        "ここで行われている内容 量子コインは、ある次元ではランダムで確率的な結果をもたらすが、別の次元では完全に予測可能な結果をもたらすことがあるようだ。 それは、コインを裏返して、両手で挟むことによって、コインがキャッチされるたびに、そのコインが頭を右に向けて出てくることを保証するようなものだ。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ace0c3e8-e9b7-4fc9-a312-78c0264a171a",
      "metadata": {},
      "source": [
        "<span id=\"the-quantum-phase\" />\n",
        "\n",
        "### 量子位相\n",
        "\n",
        "量子コインの決定的な違いは、古典コインにはない別の性質を持っていることだ。 古典的な確率論的状態であることを忘れてはならない、\n",
        "\n",
        "$$\n",
        "S(coin) =  c_1|up\\rangle + c_2|down\\rangle\n",
        "$$\n",
        "\n",
        "各係数は単純に、特定の状態を測定する確率を表す実数の正の数である。 量子状態で、\n",
        "\n",
        "$$\n",
        "|\\psi\\rangle = c_1 |0\\rangle + c_2 |1\\rangle\n",
        "$$\n",
        "\n",
        "係数は複素数なので、実部と虚部が含まれる。 各係数 $c_i$ は複素平面上の2次元ベクトルとして表すことができ、その大きさは $|c_i|$、実軸となす角度は $\\phi_i$ ：\n",
        "\n",
        "$$\n",
        "c_i = |c_i| e^{i \\phi_i}.\n",
        "$$\n",
        "\n",
        "![複素平面上の円。 量子状態は長さ1の矢印で表され、回転して円上の任意の点を指すことができる。 矢印の水平成分は実振幅、垂直成分は複素振幅である。](https://quantum.cloud.ibm.com/learning/images/modules/quantum-mechanics/superposition-with-qiskit/complexplane.avif)\n",
        "\n",
        "$\\phi_i$、「フェーズ」と呼ぶ。 位相は、量子状態における2つの項がどのように*干渉*するか、あるいは波のようにどのように加えたり打ち消したりするかを教えてくれる。 もし2つの波が互いに同位相で、その頂上と谷が一直線に並ぶなら、それらは結合して2倍の高さの波を形成する。 私たちはこれを建設的干渉と呼んでいる。 もし位相がずれていれば、つまり片方の頂上ともう片方の谷が重なったり、逆に重なったりすれば、両者は破壊的に干渉し合い、完全に打ち消し合うことになる。\n",
        "\n",
        "波動と同じように、量子状態も建設的または破壊的に加算することができる。 多くの場合、物理的な空間における実際の波について話しているわけではないので、見るのは難しいかもしれない。 我々の量子ビットの場合、干渉は量子ビットの抽象的な情報空間で起こる。 また、2つの波がどのように干渉するかは、2つの波の間の*相対*位相のみが重要であるため、つまり、2つの係数の位相の差 $\\Delta \\phi = \\phi_2 - \\phi_1$ が重要であるため、通常、 $-\\phi_1$ の*グローバル位相を*状態全体に適用し、 $c_1$ が純粋に実数であり、 *相対位相が*完全に $c_2$ に取り込まれるようにすることに留意されたい。\n",
        "\n",
        "位相が量子コインにどのような干渉を引き起こすかを見るために、ハダマードを1回だけでなく2回適用してみよう。 もしハダマードを適用することがコインを裏返すことと同じなら、すでに裏返ったコインを裏返すことはできない。 しかし、量子コインがどうなるか見てみよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "610af24c-d489-4239-b31f-cea67a563b69",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/610af24c-d489-4239-b31f-cea67a563b69-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qcoin_0 = QuantumCircuit(1)\n",
        "qcoin_0.h(0)\n",
        "qcoin_0.h(0)\n",
        "qcoin_0.measure_all()\n",
        "\n",
        "qcoin_0.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6fd8711d-1bef-4706-a5a9-039531af658b",
      "metadata": {},
      "source": [
        "さて、 `Sampler` 、出来上がった状態を測定する前に、この量子ビットが各ゲートによってどのように変換されるかを考えてみよう。 いつものように、 $|0\\rangle$ から始まる。そして、最初のハダマード変換は、すでに見たように、状態を重ね合わせに変換する：\n",
        "\n",
        "$$\n",
        "H|0\\rangle = \\frac{1}{\\sqrt{2}} |0\\rangle + \\frac{1}{\\sqrt{2}} |1\\rangle.\n",
        "$$\n",
        "\n",
        "この場合、両方の係数は完全な実数で正であり、位相は $\\phi=0$ であることを意味する。\n",
        "\n",
        "第2のハダマードは、重ね合わせ状態の各部分に個別に適用される。 ハダマード変換がどのように $|0\\rangle$。 しかし、 $|1\\rangle$\n",
        "\n",
        "$$\n",
        "H|1\\rangle = \\frac{1}{\\sqrt{2}} |0\\rangle - \\frac{1}{\\sqrt{2}} |1\\rangle\n",
        "$$\n",
        "\n",
        "これもまた、0と1の等しい重ね合わせで、コインをひっくり返すようなものだが、この状態の係数 $|1\\rangle$ の前の位相は $\\phi = \\pi$、負の符号を与えている。\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 理解度チェック\n",
        "\n",
        "2回目のハダマードを適用した結果の状態を計算する。 すなわち、 $H(\\frac{1}{\\sqrt{2}} |0\\rangle + \\frac{1}{\\sqrt{2}} |1\\rangle)$ を計算する。 $H$ は分配型なので、それぞれの項に個別に適用できることに注意。\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    $$\n",
        "    H(\\frac{1}{\\sqrt{2}} |0\\rangle + \\frac{1}{\\sqrt{2}} |1\\rangle) = \\frac{1}{\\sqrt{2}} H|0\\rangle + \\frac{1}{\\sqrt{2}} H|1\\rangle = \\frac{1}{2} [(|0\\rangle + |1\\rangle) + (|0\\rangle - |1\\rangle)] = |0\\rangle\n",
        "    $$\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e19dd16b-50b2-435e-b83e-b65af3f642be",
      "metadata": {},
      "source": [
        "では、 `Sampler` で我々の予想をチェックしてみよう。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 14,
      "id": "6390f58c-057a-4ec2-a7ca-4a45410631c0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/6390f58c-057a-4ec2-a7ca-4a45410631c0-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 14,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## Transpile\n",
        "\n",
        "target = backend.target\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "\n",
        "qc_isa = pm.run(qcoin_0)\n",
        "\n",
        "## Execute\n",
        "\n",
        "# On real hardware:\n",
        "sampler = Sampler(mode=backend)\n",
        "pubs = [qc_isa]\n",
        "job = sampler.run(pubs, shots=1000)\n",
        "res = job.result()\n",
        "\n",
        "counts = res[0].data.meas.get_counts()\n",
        "\n",
        "\n",
        "# or with Aer simulator with noise model from real backend\n",
        "# job = sampler_sim.run([qc_isa])\n",
        "# counts=job.result()[0].data.meas.get_counts()\n",
        "\n",
        "## Analyze\n",
        "plot_histogram(counts)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b5ff1950-9401-4461-bb07-0e8e5a44cb13",
      "metadata": {},
      "source": [
        "2つ目のハダマードは1つ目のハダマードを打ち消し、スタート地点である0の状態に戻った！ これは、ハダマード変換が、 $|0\\rangle$ と $|1\\rangle$ の両方の状態を、相反する位相の似た状態に変換するからである。 2回目のハダマードの後、 $|0\\rangle$ の項は建設的に干渉するが、 $|1\\rangle$ の項は破壊的に干渉し、互いに打ち消し合うことがわかる。\n",
        "\n",
        "PHASE」ゲートを使って位相を変えることができる。 そこで今度は、ハダマードを適用して重ね合わせを作り、 $\\pi$ ラジアンの位相シフトを適用し、2つ目のハダマードを適用してみよう：\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 15,
      "id": "ad819e8b-bc89-41d6-b375-428da51220be",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/ad819e8b-bc89-41d6-b375-428da51220be-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 15,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qcoin_pi = QuantumCircuit(1)\n",
        "qcoin_pi.h(0)\n",
        "qcoin_pi.p(np.pi, 0)\n",
        "qcoin_pi.h(0)\n",
        "qcoin_pi.measure_all()\n",
        "\n",
        "qcoin_pi.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "id": "06e21f78-e3e2-4fbf-b636-460f3ce5b3c7",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/06e21f78-e3e2-4fbf-b636-460f3ce5b3c7-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 16,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "## Transpile\n",
        "\n",
        "target = backend.target\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "\n",
        "qc_isa = pm.run(qcoin_pi)\n",
        "\n",
        "## Execute\n",
        "\n",
        "# On real hardware:\n",
        "sampler = Sampler(mode=backend)\n",
        "pubs = [qc_isa]\n",
        "job = sampler.run(pubs, shots=1000)\n",
        "res = job.result()\n",
        "\n",
        "counts = res[0].data.meas.get_counts()\n",
        "\n",
        "\n",
        "# or with Aer simulator with noise model from real backend\n",
        "# job = sampler_sim.run([qc_isa])\n",
        "# counts=job.result()[0].data.meas.get_counts()\n",
        "\n",
        "## Analyze\n",
        "plot_histogram(counts)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "35078634-0d0a-43bc-a220-50c927d4c088",
      "metadata": {},
      "source": [
        "そして今、量子ビットは0ではなく1の状態にあると測定された。\n",
        "\n",
        "つまり、この数少ない簡単な実験からでさえ、この位相が量子回路に劇的な違いをもたらすことがすでにおわかりいただけるだろう。 最初は微妙で見えにくいかもしれない。 最初の実験では、量子コインをハダマードゲートで投げて、その結果を測定しただけで、位相の影響は何もわからなかった。 もっと深く掘り下げてみて初めて、位相がもたらす違いがわかった。 同じ量子ゲートが、量子ビットに対して文字通り正反対の効果をもたらすことがあるのだ。\n",
        "\n",
        "<span id=\"try-it-yourself\" />\n",
        "\n",
        "#### 自分で試してみてください：\n",
        "\n",
        "以下のコードセルを編集して、2回目のハダマードが、 $|0\\rangle$ と $|1\\rangle$ にそれぞれ25%と75%の確率で状態を見つける重ね合わせ状態を作るように位相を変更する。 数学で答えを確認する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 17,
      "id": "fef281ef",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/fef281ef-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 17,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qcoin_phase = QuantumCircuit(1)\n",
        "qcoin_phase.h(0)\n",
        "# replace \"x\" below with a phase from 0 to 2*np.pi (this cell won't run if you leave x)\n",
        "# qcoin_phase.rz(x, 0)\n",
        "qcoin_phase.h(0)\n",
        "qcoin_phase.measure_all()\n",
        "\n",
        "\n",
        "## Transpile\n",
        "\n",
        "target = backend.target\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "\n",
        "qc_isa = pm.run(qcoin_phase)\n",
        "\n",
        "## Execute\n",
        "\n",
        "# On real hardware:\n",
        "sampler = Sampler(mode=backend)\n",
        "pubs = [qc_isa]\n",
        "job = sampler.run(pubs, shots=1000)\n",
        "res = job.result()\n",
        "\n",
        "counts = res[0].data.meas.get_counts()\n",
        "\n",
        "\n",
        "# or with Aer simulator with noise model from real backend\n",
        "# job = sampler_sim.run([qc_isa])\n",
        "# counts=job.result()[0].data.meas.get_counts()\n",
        "\n",
        "## Analyze\n",
        "plot_histogram(counts)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3cd238cb-6346-40f4-af87-fdbd1b806106",
      "metadata": {},
      "source": [
        "<span id=\"another-better-coin-analogy-using-the-$sqrt{text{not}}$-gate\" />\n",
        "\n",
        "## $\\sqrt{\\text{NOT}}$ ゲートを用いた別の（より優れた）コインの比喩\n",
        "\n",
        "ここまでで、コインをひっくり返す行為と重ね合わせ状態を作ることはかなり違うことがわかっただろう。 もっと重ね合わせのような現象を捉えられるような、コインに例えられるものはないだろうか？ はい。 そうだ。\n",
        "\n",
        "コインを使った別の思考実験をしよう。 コインがテーブルの上に置いてあり、表になっていると想像してください。 ヘッドダウンにするには、単に裏返せばいい。 これは \"NOT \"ゲートに相当する。\n",
        "\n",
        "例えば、2回適用すればNOTゲートと等価になるような演算を構成したいとしよう。 つまり、「NOTの平方根」、 $\\sqrt{\\text{NOT}}$。NOTゲートがコイン上で物理的にどのように実装されているかを考えることで、これを実現することができる。NOTゲートは、たとえばX軸を中心に180度回転するだけだ。 つまり、コインをX軸の周りに90度だけ回転させれば、 $\\sqrt{\\text{NOT}}$ ゲートに相当することになる。\n",
        "\n",
        "$\\sqrt{\\text{NOT}}$ ゲートを適用した後、コインが表か裏かを尋ねたいとする。 そのどちらでもない。縦軸に対して端に立っている。 しかし、ここでコインの「測定」を再定義してみよう。まず、コインを測定軸に沿って（平らになるように手でつぶして）倒し、次に、表か裏かをチェックする。\n",
        "\n",
        "この「測定」をコインの端に立った状態で行うと、コインは同じ確率で表と裏に「倒れる」。 コインフリップと同じように、原理的には、コインの初期状態と、コインを \"崩す \"ために私たちの手の力をコインにどのように正確に加えるかによって、コインが落ちる方向を予測することができる。 しかし実際には、どちらのサイドに着地するかを予測するのは難しいはずなので、基本的にはランダムである。\n",
        "\n",
        "このコインは、実際には3つの異なる軸に沿って測定することができる： $x$ $y$ と $z$。コインのエッジは、 $x$ と $z$ に沿って向いていることがわかります。したがって、これらの方向で測定するには、コインを「つぶす」必要があります。したがって、これらの軸に沿って、50:50 の確率でランダムに表と裏を測定することができます。 しかし、 $y$ -軸に沿っては、すでに平らで、頭は -y の方向を向いている。 私たちはそれを \"ヘッド・フォワード \"と呼ぶことができる\n",
        "\n",
        "つまり、xとzの測定ではランダムな結果が出たが、yの測定では常に同じ結果が出る！ 前節の「量子コイン・フリップ」実験を思い出すと、これは量子コインの振る舞いを彷彿とさせる。 Z方向では50/50の確率で0または1と測定されたが、X方向では常に $|+\\rangle$、決して $|-\\rangle$。  **これは、コインが空中で乱暴に反転するよりも、コインの端にじっと座っている方が、量子ビットの重ね合わせ状態を視覚化するのに適していることを示唆している。**\n",
        "\n",
        "Qiskitを使って、この \"量子コイン \"が、 $\\sqrt{\\text{NOT}}$ ゲートが適用されたときに、古典的なコインと同じように振る舞うかどうかを見てみよう。 $|0\\rangle$ で始まる $\\sqrt{\\text{NOT}}$ を量子ビットに適用し、 `Estimator` を使って3つの観測値、X、Y、Zの期待値をチェックする。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "ab97d4c5-285c-4efd-bc54-efda675e35fa",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/ab97d4c5-285c-4efd-bc54-efda675e35fa-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 18,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qcoin_sx = QuantumCircuit(1)\n",
        "qcoin_sx.sx(0)\n",
        "\n",
        "qcoin_sx.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "28b2db66-c9d3-43a8-bfba-d90f6fd310e6",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "[[-0.01234492]\n",
            " [-1.00388865]\n",
            " [ 0.00740695]]\n"
          ]
        }
      ],
      "source": [
        "obs1 = Pauli(\"X\")\n",
        "obs2 = Pauli(\"Y\")\n",
        "obs3 = Pauli(\"Z\")\n",
        "\n",
        "\n",
        "# Step 2: Transpile the circuit\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qcoin_sx)\n",
        "obs1_isa = obs1.apply_layout(layout=qc_isa.layout)\n",
        "obs2_isa = obs2.apply_layout(layout=qc_isa.layout)\n",
        "obs3_isa = obs3.apply_layout(layout=qc_isa.layout)\n",
        "\n",
        "\n",
        "# Step 3: Run the circuit on a real quantum computer\n",
        "\n",
        "estimator = Estimator(mode=backend)\n",
        "pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]\n",
        "job = estimator.run(pubs)\n",
        "res = job.result()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "# pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]])]\n",
        "# job = estimator_sim.run(pubs)\n",
        "# res=job.result()\n",
        "\n",
        "# Step 4: Return the result in classical form, and analyze.\n",
        "\n",
        "print(res[0].data.evs)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f14bd04e-255c-4bdd-a1fa-34c71273a369",
      "metadata": {},
      "source": [
        "X、Y、Zの期待値はそれぞれ0、 -1、0である。\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 理解度チェック\n",
        "\n",
        "期待値が与えられたとき、3つの測定軸のそれぞれについて、量子コインの表／裏（または左／右、前／後）を測定する確率は？\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    XとZに沿ってどちらかの状態を測定する確率は半々であり、状態は常にYに沿って -y。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n",
        "これは、古典的なコインに\" $\\sqrt{\\text{NOT}}$ \"の90度回転を加える思考実験と同じ結果である。 実際、コインと量子ビットの状態には正確な類似性がある。 量子ビットの状態を、コインの表面に垂直な、コインの頭の方向を指すベクトルとして視覚化することができる。 つまり、ヘッズ・アップ、つまり量子コインの $|0\\rangle$ の状態は、ベクトルが真上を向いているのと等価である。ヘッズ・ダウン、つまり $|1\\rangle$ は、ベクトルが真下を向いているのと等価である。 $|0\\rangle$、 $|1\\rangle$ を水平方向に等しく重ね合わせたもの。 状態の位相は正確な水平方向を決定する。赤道に沿って指す方向は、複素平面上で係数 $c_2$ が指す方向と等しい。\n",
        "\n",
        "さて、このノートで見てきた*すべての*ゲートは、コイン／ベクトルの回転（または一連の回転）として視覚化することができる。\n",
        "\n",
        "* 違う：X軸を中心に180度\n",
        "\n",
        "* $\\sqrt{\\text{NOT}}$ X軸を中心に90度\n",
        "\n",
        "* PHASE： $\\phi$、z軸を中心に回転する\n",
        "\n",
        "* ハダマード：これはちょっと難しい。 私たちは最初、コインをひっくり返して空中でコインを無秩序に回転させることに例えた。 しかし、ハダマードは実際には、他のゲートと同じように、制御された決定論的なコインの回転である。 ハダマードは、Y軸を中心に90度回転し、次にX軸を中心に180度回転することで行われる。\n",
        "\n",
        "つまり、量子の重ね合わせ状態や、量子ビットに対して行う標準的な操作にランダム性はない。 すべての操作は決定論的で可逆的である。 ランダム性が作用するのは、量子状態を*測定*するときだけだ。\n",
        "\n",
        "<span id=\"the-qubit-state-as-a-bloch-vector\" />\n",
        "\n",
        "### 量子ビット状態をブロッホベクトルとして\n",
        "\n",
        "コインの \"頭 \"の方向を指すこのベクトルは、\"ブロッホ・ベクトル \"として知られている 形式的には、任意の（孤立した）量子ビットの状態は、半径1の球面上に位置するベクトルで表すことができ、その座標は $(r, \\theta, \\phi)$ である。この座標で書くと、量子ビットの状態は次のようになる：\n",
        "\n",
        "$|\\psi\\rangle = \\cos{\\frac{\\theta}{2}} |0\\rangle + e^{i \\phi} \\sin{\\frac{\\theta}{2}} |1\\rangle$\n",
        "\n",
        "![ブロッホ球の図。 量子状態は3次元のベクトルである。 量子状態はどの方向にも向くので、極角θとφを使って球面上の点を特定することができる。](https://quantum.cloud.ibm.com/learning/images/modules/quantum-mechanics/superposition-with-qiskit/bloch-sphere.avif)\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "a9e7efad-9561-4613-b2e2-d5201d3cef72",
      "metadata": {},
      "source": [
        "では、 $|0\\rangle$ の状態から始めて、様々なゲートを量子ビットに適用したときに、ブロッホ・ベクトルがどのように変化するかをQiskitで確認してみましょう。\n",
        "\n",
        "<span id=\"not\" />\n",
        "\n",
        "#### NOT\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 20,
      "id": "d33d6191-c455-4cac-8947-0d68030278e9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/d33d6191-c455-4cac-8947-0d68030278e9-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 20,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.visualization import plot_bloch_multivector\n",
        "\n",
        "qnot = QuantumCircuit(1)\n",
        "qnot.x(0)\n",
        "\n",
        "plot_bloch_multivector(qnot)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "69f06a6c-1a33-48a7-84de-30c49fc11f97",
      "metadata": {},
      "source": [
        "<span id=\"$sqrt{text{not}}$\" />\n",
        "\n",
        "#### $\\sqrt{\\text{NOT}}$\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "id": "8648c4b8-edd1-4e40-9c74-50219c84c928",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/8648c4b8-edd1-4e40-9c74-50219c84c928-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 21,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qsqrtnot = QuantumCircuit(1)\n",
        "qsqrtnot.sx(0)\n",
        "\n",
        "plot_bloch_multivector(qsqrtnot)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f0145781-8534-4f94-bea4-11111dfffdfb",
      "metadata": {},
      "source": [
        "<span id=\"phase-$phi-=-pi$\" />\n",
        "\n",
        "#### フェーズ（ $\\phi = \\pi$ ）\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "f2b33aa1-2460-4e66-aa48-cbceef02729e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/f2b33aa1-2460-4e66-aa48-cbceef02729e-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 22,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qphase = QuantumCircuit(1)\n",
        "qphase.p(np.pi, 0)\n",
        "\n",
        "plot_bloch_multivector(qphase)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9ca1c439-055e-4c11-a730-2dfa1f6141e4",
      "metadata": {},
      "source": [
        "<span id=\"hadamard\" />\n",
        "\n",
        "#### Hadamard\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 23,
      "id": "1371f0a1-8279-4dff-987b-050511ba629b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/superposition-with-qiskit/extracted-outputs/1371f0a1-8279-4dff-987b-050511ba629b-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 23,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qhadamard = QuantumCircuit(1)\n",
        "qhadamard.h(0)\n",
        "\n",
        "plot_bloch_multivector(qhadamard)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "f66be32d-6452-4ba0-8dcf-5e248ce37605",
      "metadata": {},
      "source": [
        "<span id=\"conclusion---so-what-*is*-a-superposition-state\" />\n",
        "\n",
        "## 結論 - では重ね合わせ*状態とは*何か？\n",
        "\n",
        "このモジュールではまず、量子の重ね合わせ状態を測定する際のランダム性をコインフリップと比較した。 私たちは、量子の重ね合わせを作り出す「ハダマードゲート」をコインを裏返す行為に例えた。 しかし、一連の実験を通して、古典的なコインフリップと量子の重ね合わせには根本的な違いがあることがわかった。\n",
        "\n",
        "私たちは、重ね合わせ状態にある量子ビットには、実は「ランダム」なものは何もないことを学んだ。 三次元の空間にじっと座っているコインのようなものだ。 実際、3次元で自由に回転するコインは、ブロッホ・ベクトルと呼ばれる量子ビットの量子状態を視覚化する特殊な方法と非常によく似ている。 量子ゲートはこのコイン／ブロッホ・ベクトルを決定論的かつ可逆的に回転させる。 量子ビットを**測定する**ときに初めてランダム性が生じる。 私たちはこの測定プロセスを、コインを測定軸の方向に平らになるようにつぶすことに例えた。\n",
        "\n",
        "量子の状態が重ね合わせの状態にあるかどうかは、まさに見る人の目の問題である。 $x$、 $y$、 $z$ は、直交する3方向を指すことができる。 つまり、ある座標系に0と1の重ね合わせがある場合、その状態が純粋に $+z$、したがって重ね合わせ状態ではない、新しい座標系、あるいは等価的に新しい「測定基準」を定義することができる。 従って、量子ビットが重ね合わせの状態にあると言う場合、\" *何の*重ね合わせか？\"という質問にも答えなければならない\n",
        "\n",
        "量子力学からすべての謎を取り除いたという印象を持って、このモジュールを去るかもしれない。 結局のところ、\"最も奇妙 \"とされる側面の1つである量子ビットの重ね合わせ状態は、実際には3次元ベクトルと同じくらい単純なものなのだ。 しかし、コインはまだアナロジーに過ぎず、ブロッホ・ベクトルも測定結果の確率を計算するための視覚化ツールに過ぎないことに留意してほしい。 量子の状態を測定する前に、その状態が*本当は*どうなのかを言うことはできない。 なぜなら、それをチェックするには測定が必要だからだ！\n",
        "\n",
        "量子状態の「真の」性質とは何かというこの難問について、エンタングルメントという量子現象がどのように解明に役立つのか、ベルの不等式モジュールで議論する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "3425eb14-a8fd-4894-83a8-268a93733795",
      "metadata": {},
      "source": [
        "<span id=\"questions\" />\n",
        "\n",
        "## 質問\n",
        "\n",
        "指導者は、このノートがどのように使用されているかについての[簡単なアンケートに](https://ibm.biz/classrooms_instructor_key_request)答えることで、解答と一般的なカリキュラムにおける配置についてのガイダンスが付いたバージョンのノートを要求することができる。\n",
        "\n",
        "<span id=\"critical-concepts\" />\n",
        "\n",
        "### 重要な概念：\n",
        "\n",
        "* 重ね合わせ状態にある量子ビットの測定は、コインを裏返すように確率的であるが、重ね合わせ状態自体はコインを裏返すのとは異なる振る舞いをする。\n",
        "* 古典的な確率分布と重ね合わせの主な違いは、重ね合わせが*位相*コヒーレンスを持つことで、建設的または破壊的に干渉することができる。\n",
        "* ここで、 $|0\\rangle$ と $|1\\rangle$ 成分の相対振幅が極角 $\\theta$ を決定し、2つの成分の相対位相が方位角 $\\phi$ を決定する。\n",
        "* すべての単一量子ビットの量子ゲートは、この球面上のベクトルの回転とみなすことができる。\n",
        "\n",
        "<span id=\"t/f-questions\" />\n",
        "\n",
        "### 正誤問題：\n",
        "\n",
        "1. T/F 量子の重ね合わせは、基本的に古典物理学における確率的事象と同じである。\n",
        "\n",
        "2. T/F 単一の孤立量子ビットの状態を記述するブロッホ・ベクトルの長さは常に1である。\n",
        "\n",
        "3. T/F 単一量子ビット量子ゲートはブロッホ・ベクトルの長さを変えない。\n",
        "\n",
        "<span id=\"mc-questions\" />\n",
        "\n",
        "### MCの質問：\n",
        "\n",
        "1. 状態 $|\\Psi\\rangle = \\sqrt{\\frac{1}{3}}|0\\rangle + e^{i \\pi / 4} \\sqrt{\\frac{2}{3}}|1\\rangle$ を表すブロッホベクトルを正しく選びなさい：\n",
        "\n",
        "![4つのブロッホ球が示されている。 ベクトルは、選択肢aではほぼ+xに沿って、選択肢bでは+xと+yの中間でxy平面のやや下を、選択肢cでは+xと -y の中間でxy平面のやや上を、選択肢dでは -x に沿って指す。](https://quantum.cloud.ibm.com/learning/images/modules/quantum-mechanics/superposition-with-qiskit/mc-question.avif)\n",
        "\n",
        "2. ブロッホ球は量子ビットを記述する： (該当するものをすべて選択）\n",
        "\n",
        "   a. 振幅\n",
        "\n",
        "   b. 他の量子ビットとのエンタングルメント\n",
        "\n",
        "   c. フェーズ\n",
        "\n",
        "   d. カラー\n",
        "\n",
        "   e. 測定結果の確率\n",
        "\n",
        "<span id=\"discussion-questions\" />\n",
        "\n",
        "### ディスカッションの質問：\n",
        "\n",
        "1. なぜ量子ビットの状態はブロッホ球上で可視化できるのに、コインフリップの確率分布は可視化できないのか？\n",
        "\n",
        "2. なぜコインを空中で裏返すことが、量子の重ね合わせ状態のアナロジーとして最適ではないのですか？ このアナロジーでは、スーパーポジションのどのような側面が捉えられていないのだろうか？\n",
        "\n",
        "<span id=\"challenge-problems\" />\n",
        "\n",
        "### 課題問題：\n",
        "\n",
        "1. Qiskitを使って、 $|0\\rangle$ の状態を、 の状態に変換する回路を作成する。 $\\frac{\\sqrt{3}}{2}|0\\rangle + \\frac{1}{2}e^{i \\frac{5\\pi}{6}}|1\\rangle$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "in_page_toc_max_heading_level": 2,
    "in_page_toc_min_heading_level": 2,
    "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"
    },
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "state": {},
        "version_major": 2,
        "version_minor": 0
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}