{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "f767af9e-cdd6-41f4-9279-9e92fa2dde06",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit으로 불확실성 탐구하기\"\n",
        "description: \"물리적 측정값들이 서로 어떻게 영향을 미치는지 알아보고, 실제 양자 컴퓨터를 사용하여 양자 역학의 근본적 불확실성을 탐구하라\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore prodxz delx delz dely prodxy uparrow downarrow */}\n",
        "\n",
        "<span id=\"exploring-uncertainty\" />\n",
        "\n",
        "# 불확실성 탐구\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "132cdf03-164e-4334-aab6-206aacacc25b",
      "metadata": {},
      "source": [
        "이 교실 내 키스킷 모듈을 사용하려면 학생에게 다음 패키지가 설치된 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",
        "위의 패키지를 설정하고 설치하려면 [키스킷 설치](/docs/guides/install-qiskit) 가이드를 참조하세요.\n",
        "실제 양자 컴퓨터에서 작업을 실행하려면 학생들은 [IBM Cloud 계정 설정](/docs/guides/cloud-setup) 가이드의 단계에 따라 IBM Quantum®에 계정을 설정해야 합니다.\n",
        "\n",
        "이 모듈은 테스트를 거쳐 8분 동안 QPU 시간을 사용했습니다. 이는 추정치일 뿐입니다. 실제 사용량은 다를 수 있습니다. 시간이 많이 걸리는 두 가지 계산은 헤더 코멘트에 표시되어 있으며, 학생이 QPU 시간이 부족한 경우 시뮬레이터에서 수행할 수 있습니다. 이를 제거하면 모듈은 30\\~30초의 QPU 시간만 필요합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "dbda80f2-62c5-4f25-95cf-c5495bc171b1",
      "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": "4283087e-cc02-467d-b02c-c1c131ad15f3",
      "metadata": {},
      "source": [
        "아래에서 케이티 박사( McCormick )의 모듈 워크스루를 시청하거나 [여기를](https://www.youtube.com/watch?v=3h3pwrECbb8\\&list=PLOFEBzvs-Vvrs2fuvsuT039ariYPsua3d\\&index=5) 클릭하여 YouTube 에서 시청하세요.\n",
        "\n",
        "***\n",
        "\n",
        "<IBMVideo id=\"134413662\" title=\"케이티( McCormick )는 양자 불확실성을 소개하고 실제 양자 컴퓨터에서 이를 테스트합니다. 어떤 수량을 동시에 알 수 있고 어떤 수량을 알 수 없는지 알아보세요.\" />\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "be385aa2-9080-4c39-aba0-bc35087ced78",
      "metadata": {},
      "source": [
        "<span id=\"introduction\" />\n",
        "\n",
        "## 소개\n",
        "\n",
        "물리학 수업이 아니더라도 불확실성 원리에 대해 들어본 적이 있을 것입니다. 불확실성에 대한 일반적인 구어체 표현은 \"무언가를 바라보면 그것에 영향을 미친다\"입니다 확실히 그렇습니다. 그러나 불확실성을 설명하는 더 물리적인 방법은 두 가지를 동시에 임의의 정확도로 알 수 없는 비호환성이 있는 특정 물리적 관측값이 있다는 것입니다. 많은 학생들이 호환되지 않는 변수인 $x$ 와 $p_x$, 즉 각각 $x$ -축이라고 하는 한 축을 따른 위치와 그 방향을 따른 선형 운동량을 처음 접하게 됩니다. 이러한 변수에 대해 불확실성에 대한 제약 조건은 다음과 같이 작성됩니다 $\\Delta x \\Delta p_x \\geq \\frac{\\hbar}{2}.$ 여기서 $\\Delta x$ 은 \" $x$ 의 불확실성\"이라고 하며, 통계의 표준 편차와 동일한 정의를 가지며 다음과 같이 정의할 수 있습니다 $\\Delta x = \\sqrt{\\langle x^2 \\rangle - \\langle x \\rangle^2}.$ $\\Delta p_x$ 도 같은 방식으로 정의됩니다.\n",
        "여기서는 이 불확실성 관계를 도출하지 않고 고전파에 대한 우리의 이해와 일치한다는 점을 지적할 것입니다. 즉, 진정으로 하나의 완벽한 주파수 $f$ 와 파장 $\\lambda$ 을 가진 파동은 완벽한 사인곡선으로서 영원히 계속될 것입니다. 양자역학적으로 이것은 드 브로글리의 가설에 따라 운동량을 완벽하게 아는 것과 일치합니다: $\\lambda = h/p$. 그러나 파동과 같은 입자의 위치를 $where$ 알기 위해서는 예를 들어 매우 좁은 가우스처럼 공간에서 파동을 설명하는 파동이 더 급격히 피크가 되어야 합니다. 이렇게 급격히 피크가 높아지는 파동 함수를 포함한 모든 연속 함수를 파장이 다른 푸리에 급수 정현파 함수로 표현할 수 있다는 것을 알고 있습니다. 그러나 파동 함수가 더 급격히 정점에 도달하면(그리고 그 위치를 더 잘 알면) 푸리에 급수에서 더 많은 항이 필요하며, 이는 더 많은 파장의 혼합(따라서 양자역학적으로 더 많은 운동량 값)을 의미합니다.\n",
        "\n",
        "더 간단하게 설명하자면, 운동량이 잘 정의된 상태(공간에서 완벽한 사인곡선)는 위치가 매우 불확실합니다. 디락 델타 분포와 같이 위치가 잘 정의된 상태는 매우 불확실한 모멘텀을 가집니다.\n",
        "\n",
        "이러한 비호환성을 나타내는 다른 변수도 있습니다. 예를 들어, 파티클의 스핀은 한 축을 따라 잘 정의된 투영을 가질 수 있지만 직교 축의 투영에 대해서는 아무것도 알 수 없습니다. 예를 들어 상태 $|0\\rangle \\sim |\\uparrow\\rangle$ (큐비트 또는 spin-1/2 입자의 경우)는 $z$ 축을 따라 확실한 투영(큐비트의 경우 1, spin-1/2 입자의 경우 $\\hbar/2$ )을 가집니다. 그러나 이 상태는 각각 $x$ 축에 잘 정의된 투영을 가진 두 상태의 중첩으로 작성할 수 있습니다: $|0\\rangle = \\frac{1}{\\sqrt{2}}(|+\\rangle_x+|-\\rangle_x)$ 또는 동등하게 $\\begin{pmatrix} 1 \\\\ 0\\end{pmatrix} = \\frac{1}{\\sqrt{2}}\\left[\\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 \\\\ 1\\end{pmatrix}+\\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 \\\\ -1\\end{pmatrix}\\right].$ $|+\\rangle_x$ 는 $|-\\rangle_x$ 과 마찬가지로 $x$ 에 잘 정의된 투영을 갖습니다. 따라서 $x$ 축을 따라 상태의 투영을 지정하면 $z$ 축을 따른 투영을 알 수 없습니다. 그리고 $z$ 축에 투영을 지정하면 $x$ 축에 대한 투영을 알 수 없습니다. 이를 스핀과 큐비트의 맥락에서 논의할 때 약간의 차이가 있습니다. 하지만 일반적으로 폴리 행렬의 고유 상태는 우리가 탐구할 수 있는 흥미로운 관계를 가지고 있습니다.\n",
        "이 강의에서는 이러한 양립할 수 없는 변수의 불확실성에 대한 직관을 실험적으로 확인하고 IBM® 양자 컴퓨터에서 불확실성 관계가 유지되는지 검증할 것입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "eb8c7a0c-c962-4efd-ab82-905ba7415284",
      "metadata": {},
      "source": [
        "<span id=\"simple-check-of-intuition\" />\n",
        "\n",
        "## 직관에 대한 간단한 점검\n",
        "\n",
        "이 첫 번째 실험과 모듈 전체에서 \"키스킷 패턴\"이라는 양자 컴퓨팅 프레임워크를 사용하여 워크플로우를 다음 단계로 나눌 것입니다:\n",
        "\n",
        "* 1단계: 기존 입력을 양자 문제에 매핑하기\n",
        "* 2단계: 양자 실행을 위한 문제 최적화\n",
        "* 3단계: `IBM Quantum` 기본 함수를 사용하여 실행하기\n",
        "* 4단계: 후처리 및 고전적 분석\n",
        "\n",
        "당사는 일반적으로 이러한 단계를 따르지만, 항상 명시적으로 표시하지는 않습니다.\n",
        "\n",
        "먼저 런타임 프리미티브를 포함한 몇 가지 필수 패키지를 로드하는 것으로 시작하겠습니다. 또한 사용 가능한 가장 사용량이 적은 양자 컴퓨터를 선택할 것입니다.\n",
        "\n",
        "처음 사용할 때 자격 증명을 저장하는 코드는 아래에 있습니다. 노트북을 공유할 때 실수로 자격 증명이 공유되지 않도록 노트북을 환경에 저장한 후 이 정보를 노트북에서 삭제해야 합니다. 자세한 안내는 [IBM Cloud 계정 설정하기](/docs/guides/initialize-account) 및 [신뢰할 수 없는 환경에서 서비스 초기화를](/docs/guides/cloud-setup-untrusted) 참조하세요.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c26c8f6f-1ed7-4079-ba21-4747d318996f",
      "metadata": {},
      "outputs": [],
      "source": [
        "from numpy import pi\n",
        "\n",
        "# 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": 2,
      "id": "7d34071a-6fb1-4a0a-9e66-c9ee40c3767b",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "ibm_sherbrooke\n"
          ]
        }
      ],
      "source": [
        "# Load the Runtime primitive and session\n",
        "from qiskit_ibm_runtime import (\n",
        "    Batch,\n",
        "    SamplerV2 as Sampler,\n",
        "    EstimatorV2 as Estimator,\n",
        ")\n",
        "\n",
        "# Use the least busy backend\n",
        "backend = service.least_busy(min_num_qubits=127)\n",
        "print(backend.name)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "fcbf932e-45b7-4a50-90e1-59dcb7577dfc",
      "metadata": {},
      "source": [
        "학생이 수업 중에 사용 가능한 양자 컴퓨팅 시간을 모두 소진한 경우, 아래 줄을 주석 처리하지 않고 위에서 선택한 양자 컴퓨터의 노이즈 동작을 부분적으로 모방하는 시뮬레이터를 설정하는 데 사용할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "7265c432-19eb-41ba-940d-a80541fe0218",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Import an estimator, this time from qiskit (we will import from Runtime for real hardware)\n",
        "from qiskit_aer.primitives import SamplerV2, EstimatorV2\n",
        "from qiskit_aer.noise import NoiseModel\n",
        "\n",
        "# Generate the noise model from the backend properties\n",
        "noise_model = NoiseModel.from_backend(backend)\n",
        "\n",
        "noisy_sampler = SamplerV2(options={\"backend_options\": {\"noise_model\": noise_model}})\n",
        "noisy_estimator = EstimatorV2(options={\"backend_options\": {\"noise_model\": noise_model}})"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "5f072c75-efb7-4596-8bc6-ccae553684df",
      "metadata": {},
      "source": [
        "한 오퍼레이터인 Z의 고유 상태는 다른 오퍼레이터인 X의 고유 상태가 아니라는 점을 기억하실 것입니다. 이제 $x$ 및 $z$ 축을 따라 측정하여 실험적으로 이를 관찰해 보겠습니다. IBM 양자 컴퓨터는 $z$ 을 따라 측정하도록 구조화되어 있기 때문에 $z$ 을 따라 측정하려면 ` qc.measure ()` 을 사용하면 됩니다. 그러나 $x$ 을 따라 측정하려면 시스템을 회전하여 $x$ 축을 측정하는 방향으로 효과적으로 이동시켜야 합니다. 이는 하다마드 게이트를 통해 이루어집니다. $y$ 을 따라 측정하는 데 필요한 유사한 단계가 있습니다. 편의를 위해 필요한 단계를 여기에 모았습니다:\n",
        "\n",
        "* 따라 측정하려면 $z$ : `qc.measure()`\n",
        "* $x$ : `qc.h()` 을 따라 측정하려면 `qc.measure()`\n",
        "* 측정 방법 $y$ : `qc.sdg()`, `qc.h()`, `qc.s`다음 `qc.measure()`\n",
        "\n",
        "<span id=\"step-1-map-classical-inputs-to-a-quantum-problem\" />\n",
        "\n",
        "### 1단계: 고전적 입력을 양자 문제에 매핑하기\n",
        "\n",
        "이 경우 매핑 단계는 위에서 설명한 측정과 회전을 양자 회로로 간단히 표현하는 것입니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8baef7f9-78bf-48c8-8359-efd65f943d96",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/8baef7f9-78bf-48c8-8359-efd65f943d96-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Step 1: Map\n",
        "\n",
        "# Import some general packages\n",
        "from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister\n",
        "\n",
        "# Define registers\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(2, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Add a first measurement\n",
        "qc.measure(qr, cr[0])\n",
        "qc.barrier()\n",
        "\n",
        "# Change basis so that measurements made on quantum computer which normally tell us about z,\n",
        "# now tell us about x.\n",
        "qc.h(qr)\n",
        "\n",
        "# Add a second measurement\n",
        "qc.measure(qr, cr[1])\n",
        "\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4d931ec8-6f8f-405f-a9ce-41724435f3a1",
      "metadata": {},
      "source": [
        "<span id=\"step-2-optimize-problem-for-quantum-execution\" />\n",
        "\n",
        "### 2단계: 양자 실행을 위한 문제 최적화\n",
        "\n",
        "이 단계에서는 수행하고자 하는 연산을 특정 양자 컴퓨터의 기능으로 표현합니다. 또한 우리의 문제를 양자 컴퓨터의 레이아웃에 매핑합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "d613ac18-61ff-4e91-9f7d-73887bd2306a",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Step 2: 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(qc)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2f31c2b1-08be-43c7-8af3-5d9ee8a4dab0",
      "metadata": {},
      "source": [
        "<span id=\"step-3-execute-using-ibm-quantum-primitives\" />\n",
        "\n",
        "### 3단계: `IBM Quantum` 기본 함수를 사용하여 실행하기\n",
        "\n",
        "샘플러를 사용하여 측정값에 대한 통계를 수집할 수 있습니다. 우리는 `mode = backend`.를 사용하여 실제 양자 컴퓨터에서 실행될 수 있는 샘플러 프리미티브를 구현할 것입니다. 다른 워크플로우를 위한 모드도 있으며, 아래에서는 그중 하나를 사용할 것입니다. 샘플러는 “pubs”(Primitive Unified Blocs) 목록을 인수로 전달하여 run() 메서드를 호출함으로써 사용됩니다. 각 펍에는 최대 세 가지 값이 포함되어 있으며, 이 값들은 함께 추정기가 수행해야 할 작업의 계산 단위를 정의합니다. 즉, 회로, 관측 가능 변수, 매개변수입니다. 또한 회로 목록, 관측 가능한 변수 목록, 매개변수 목록을 제공할 수도 있습니다. 자세한 내용은 [‘PUB 개요](/docs/guides/primitive-input-output#pubs) ’를 참조하십시오.\n",
        "\n",
        "실제 양자 컴퓨터에서 실행하여 실제 양자 물리학 실험을 수행하고자 합니다. 실제 양자 컴퓨터에서 할당된 시간을 모두 소진했다면, 아래 코드를 양자 컴퓨터에 주석 처리하고 시뮬레이터에서 실행할 코드의 주석 처리를 해제할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "8996bcf0-1848-4eda-b5a1-47190fede630",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Step 3: Run the job on a real quantum computer\n",
        "\n",
        "\n",
        "sampler = Sampler(mode=backend)\n",
        "pubs = [qc_isa]\n",
        "job = sampler.run(pubs)\n",
        "res = job.result()\n",
        "\n",
        "counts = res[0].data.c.get_counts()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "\n",
        "# job = noisy_sampler.run([qc_isa])\n",
        "# res=job.result()\n",
        "# counts=res[0].data.c.get_counts()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "01dedf77-2ea7-45f4-9a84-8cd1caa26c14",
      "metadata": {},
      "source": [
        "<span id=\"step-4-post-processing\" />\n",
        "\n",
        "### 4단계: 후처리\n",
        "\n",
        "이것은 특히 간단한 사후 처리의 경우로, 단순히 개수를 시각화하는 것입니다.\n",
        "\n",
        "키스킷은 가장 낮은 번호의 항목을 마지막/오른쪽에 나열하는 방식으로 큐비트, 측정값 등을 주문하는데, 이를 \"리틀엔디안\"이라고 합니다. 즉, 아래 '10'이라고 표시된 열은 첫 번째 측정에서 '0'이 나왔고 두 번째 측정에서 '1'이 나온 횟수를 나타냅니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "7cfeafbf-6a40-4829-9e1d-6c8dbdab9f23",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/7cfeafbf-6a40-4829-9e1d-6c8dbdab9f23-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Step 4: Post-process\n",
        "\n",
        "from qiskit.visualization import plot_histogram\n",
        "\n",
        "plot_histogram(counts)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2d21379b-b27f-4448-adb5-91f55e79b0e2",
      "metadata": {},
      "source": [
        "이 규칙이 마음에 들지 않으면 `marginal_counts` 을 사용하여 각 측정 결과를 개별적으로 시각화할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "8c94042b-0e52-41f3-8231-ede9fab3ee51",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/8c94042b-0e52-41f3-8231-ede9fab3ee51-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.result import marginal_counts\n",
        "\n",
        "plot_histogram(\n",
        "    marginal_counts(counts, indices=[0]), title=\"Counts after first measurement\"\n",
        ")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "d0ad384b-c2f1-4bc6-8730-ec8a4b593a50",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/d0ad384b-c2f1-4bc6-8730-ec8a4b593a50-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 9,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "plot_histogram(\n",
        "    marginal_counts(counts, indices=[1]), title=\"Counts after second measurement\"\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "258d66a0-ddfc-4c69-8943-37efb7c09b40",
      "metadata": {},
      "source": [
        "기본적으로 키스킷의 상태는 $|0\\rangle$ 상태로 초기화됩니다. 따라서 거의 모든 첫 번째 측정값이 $|0\\rangle$ 으로 나온 것은 놀라운 일이 아닙니다. 그러나 두 번째 측정( $x$ 에 대한 상태 예측에 대한 정보를 제공하는 측정)에서는 거의 균등하게 나뉘어져 있다는 점에 유의하세요. $z$ 에 대한 측정 결과는 매우 예측 가능한 반면 $x$ 에 대한 측정 결과는 매우 예측할 수 없는 결과를 제공하는 상태인 것 같습니다. 이를 살펴봅시다.\n",
        "\n",
        "반대 순서로 측정하면 어떻게 되나요? 먼저 하다마드 게이트를 사용하여 $|\\pm\\rangle_x$ 에서 $|0\\rangle$ 가 측정될 확률에 대한 통계를 얻을 수 있습니다. 그런 다음 두 번째 측정에서는 두 번째 하다마드 게이트를 사용하여 $z$ 기준으로 다시 변경합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "4029873f-1260-4fc3-bfd2-e5a3f579a09c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/4029873f-1260-4fc3-bfd2-e5a3f579a09c-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Step 1:\n",
        "\n",
        "# Define registers\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(2, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Change basis to measure along x.\n",
        "qc.h(qr)\n",
        "qc.measure(qr, cr[0])\n",
        "qc.barrier()\n",
        "\n",
        "# Change our basis back to z and make a second measurement\n",
        "qc.h(qr)\n",
        "qc.measure(qr, cr[1])\n",
        "\n",
        "qc.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "c56d1649-de18-4417-8033-2be2a04a2582",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Step 2: Transpile the circuit for running on a quantum computer\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qc)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "782f01c9-f9c2-4e5e-8638-7c9ba3347bfb",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Step 3: Run the job on a real quantum computer\n",
        "\n",
        "sampler = Sampler(mode=backend)\n",
        "pubs = [qc_isa]\n",
        "job = sampler.run(pubs)\n",
        "res = job.result()\n",
        "counts = res[0].data.c.get_counts()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "# job = noisy_sampler.run([qc_isa])\n",
        "# res=job.result()\n",
        "# counts=res[0].data.c.get_counts()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "ce3fb0fd-a859-4c91-b2e5-c09343a397c2",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/ce3fb0fd-a859-4c91-b2e5-c09343a397c2-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Step 4: Post-process\n",
        "from qiskit.visualization import plot_histogram\n",
        "\n",
        "plot_histogram(counts)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d7862ea1-a9fd-4b23-9198-cfbfb05cf3dc",
      "metadata": {},
      "source": [
        "여기에서는 예측 가능성이 더 낮아 보입니다! 이전에는 적어도 첫 번째 측정의 결과가 어떻게 나올지 알 수 있었지만, 이제는 가능한 모든 상태에 걸쳐 상당히 고르게 분포되어 있습니다. 왜 이런 일이 발생했는지는 그리 어렵지 않게 알 수 있습니다. $|+\\rangle_x$ 과 $|-\\rangle_x$ 을 50대 50으로 혼합한 $|0\\rangle$ 에서 시작했습니다 $|0\\rangle=\\frac{1}{\\sqrt{2}}(|+\\rangle_x+|-\\rangle_x)$ 따라서 첫 번째 측정에서 + 또는 - 상태(차트에서 0과 1로 매핑됨)를 얻을 확률은 분명히 같아야 합니다. $x$ 을 따라 측정하면 상태가 고유 상태 $|+\\rangle_x$ 또는 고유 상태 $|-\\rangle_x$ 로 축소됩니다. 이러한 각 상태는 $|0\\rangle$ 와 $|1\\rangle$ 의 50대 50 혼합 상태입니다 $|+\\rangle_x = \\frac{1}{\\sqrt{2}}(|0\\rangle+|1\\rangle)$ $|-\\rangle_x = \\frac{1}{\\sqrt{2}}(|0\\rangle-|1\\rangle)$ 따라서 시스템이 $x$ 의 고유 상태에 있으면 $z$ 을 따라 측정하면 $|0\\rangle$ 과 $|1\\rangle$ 이 모두 산출되며 거의 동일한 확률로 산출됩니다.\n",
        "따라서 첫 번째 예시를 통해 어떤 주에서는 일부 측정값의 결과는 매우 예측 가능하지만 다른 측정값의 결과는 예측할 수 없다는 것을 알 수 있었습니다. 현재의 예는 이보다 더 나쁜 일도 할 수 있다는 것을 보여줍니다. 측정 순서를 바꾸기만 해도 두 측정값에 대해 예측할 수 없는 결과가 나올 수 있는 상태가 있습니다. 주어진 상태에 대해 수량이 얼마나 확실한지 또는 불확실한지 조사해 보겠습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "292b878f-1792-4f55-8991-49e37c7db58b",
      "metadata": {},
      "source": [
        "<span id=\"calculating-uncertainty\" />\n",
        "\n",
        "## 불확실성 계산\n",
        "\n",
        "불확실성 또는 분산을 사용하여 이를 정량화할 수 있습니다. '불확실성'은 흔히 분포의 '분산'의 제곱근으로 정의됩니다. 즉, 관측 가능한 일부 $S$ 에 대한 불확실성은 $\\Delta S$ 으로 표시되며 다음과 같이 주어집니다\n",
        "\n",
        "$$\n",
        "\\begin{aligned}\n",
        "(\\Delta S)^2 & \\equiv \\langle (S - \\langle S \\rangle)^2 \\rangle\\\\\n",
        "\n",
        "(\\Delta S)^2 & = \\langle S^2 - 2 S \\langle S \\rangle +\\langle S \\rangle^2 \\rangle\\\\\n",
        "\n",
        "(\\Delta S)^2 & = \\langle S^2 \\rangle - \\langle S \\rangle^2\n",
        "\\end{aligned}\n",
        "$$\n",
        "\n",
        "폴리 행렬의 경우 $S^2 = I$, 이것은 다음과 같이 됩니다\n",
        "\n",
        "$$\n",
        "(\\Delta S)^2 = 1 - \\langle S \\rangle^2\n",
        "$$\n",
        "\n",
        "이를 구체적인 사례에 적용해 보겠습니다. 상태 $|\\psi\\rangle = |+\\rangle_y = \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 \\\\ i \\end{pmatrix},$ 로 시작하여 해당 상태에서 관측 가능한 $X$ 의 불확실성을 결정해 보겠습니다.\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 이해도 점검\n",
        "\n",
        "상태 $|+\\rangle_y = |+i\\rangle$ 에서 $X$ 의 불확실성을 직접 계산합니다.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    $$\n",
        "    \\Delta X =\\sqrt{\\langle+i| X^2 |+i\\rangle - \\langle+i| X |+i\\rangle^2}\n",
        "    $$\n",
        "\n",
        "    주어진 상태에서는 이렇게 산출됩니다:\n",
        "\n",
        "    $$\n",
        "    \\begin{aligned}\n",
        "    \\Delta X & =\\sqrt{\\frac{1}{\\sqrt{2}}\\begin{pmatrix}1 & -i\\end{pmatrix} \\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix} \\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix} \\frac{1}{\\sqrt{2}}\\begin{pmatrix}1 \\\\ i\\end{pmatrix} - \\left(\\frac{1}{\\sqrt{2}}\\begin{pmatrix}1 & -i\\end{pmatrix} \\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix} \\frac{1}{\\sqrt{2}}\\begin{pmatrix}1 \\\\ i\\end{pmatrix}\\right)^2}\\\\\n",
        "\n",
        "    \\Delta X & =\\sqrt{\\frac{1}{2}\\begin{pmatrix}1 & -i\\end{pmatrix} \\begin{pmatrix}1 & 0 \\\\ 0 & 1\\end{pmatrix} \\begin{pmatrix}1 \\\\ i\\end{pmatrix} - \\left(\\frac{1}{2}\\begin{pmatrix}1 & -i\\end{pmatrix} \\begin{pmatrix}i \\\\ 1\\end{pmatrix}\\right)^2}\\\\\n",
        "\n",
        "    \\Delta X & =\\sqrt{\\frac{1}{2}\\begin{pmatrix}1 & -i\\end{pmatrix} \\begin{pmatrix}1 \\\\ i\\end{pmatrix} - \\left(\\frac{1}{2}(0))\\right)^2}\\\\\n",
        "\n",
        "    \\Delta X & =\\sqrt{\\frac{1}{2}(2)} = 1\n",
        "    \\end{aligned}\n",
        "    $$\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n",
        "`qc.initialize()` 을 사용하여 임의의 초기 상태를 만들 수 있습니다. 여기서 가상 단위의 구문은 $1j$ 입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "bf16b90b-d77a-477b-b432-963f8b81feed",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "-0.02408454165642664\n"
          ]
        }
      ],
      "source": [
        "# Step 1: Map the problem into a quantum circuit\n",
        "\n",
        "from qiskit.quantum_info import SparsePauliOp\n",
        "import numpy as np\n",
        "\n",
        "obs = SparsePauliOp(\"X\")\n",
        "\n",
        "# Define registers\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(1, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Initialize the state\n",
        "qc.initialize([1, 1j] / np.sqrt(2))\n",
        "\n",
        "# Step 2: Transpile the circuit\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qc)\n",
        "obs_isa = obs.apply_layout(layout=qc_isa.layout)\n",
        "\n",
        "# Step 3: Run the circuit on a real quantum computer\n",
        "\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 = noisy_estimator.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": "e162abde-f346-4f2c-8358-d95c818a1021",
      "metadata": {},
      "source": [
        "위의 방정식에 따르면 $(\\Delta X)^2 = 1 - \\langle X \\rangle^2 = 1-(0.0015...)^2 \\rightarrow \\Delta X = 0.999...$ 동일한 상태를 유지하되 이제 $Z$ 의 기대값을 구해 보겠습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c1918196-a26e-4419-8a25-488a3d1d4cc1",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "0.04958271968581247\n"
          ]
        }
      ],
      "source": [
        "# Step 1: Map the problem into a quantum circuit\n",
        "\n",
        "obs = SparsePauliOp(\"Z\")\n",
        "\n",
        "# Define registers\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(1, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Initialize the state to |+>_y\n",
        "qc.initialize([1, 1j] / np.sqrt(2))\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(qc)\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(pubs)\n",
        "res = job.result()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "# job = noisy_estimator.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": "8ba18eed-5982-45ca-b0ed-5708b7d4aa17",
      "metadata": {},
      "source": [
        "이전과 동일한 계산을 할 수 있지만 분산이 다시 1.0 에 매우 가깝다는 것을 알 수 있습니다. 결론을 내릴 수 있습니다 $\\Delta X \\Delta Z \\approx 1.0$. 실제로 이것은 우리가 선택한 상태와 거의 일치합니다. 하지만 더 잘할 수 있을까요? 아니면 더 나쁠까요?\n",
        "\n",
        "한 방향의 위치( $x,$ )와 같은 방향의 운동량( $p_x.$ ) 사이에는 불확실성 관계가 있다는 것을 상기하십시오. 이러한 변수의 경우 가장 익숙한 형태는 아마도 다음과 같습니다 $\\Delta x \\Delta p_x \\geq \\hbar/2$ 이것이 우리가 기억하는 전부라면 $\\Delta X$ 와 $\\Delta Z$ 도 불확실성에 대한 근본적인 한계가 있을 수 있다고 생각할 수 있습니다. $\\Delta X \\Delta Z$ 제품이 0에 도달하는 것은 불가능할까요? 다른 상태를 시도하여 이 문제가 해결되는지 확인해 보겠습니다. 이번에는 $|\\psi\\rangle = \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 \\\\ 1 \\end{pmatrix}.$ 어떤 일이 일어나는지 보겠습니다. 아래 코드에서 추정기는 동일한 작업 제출에서 두 세트의 회로와 관측값을 허용할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "ef107fd6-03c2-42f2-a51d-e52957cfb82e",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The expectation value of the first observable is:  1.0011036174126302\n",
            "The expectation value of the second observable is:  0.0029429797670141016\n"
          ]
        }
      ],
      "source": [
        "# Step 1: Map the problem into a quantum circuit\n",
        "\n",
        "obs1 = SparsePauliOp(\"X\")\n",
        "obs2 = SparsePauliOp(\"Z\")\n",
        "\n",
        "# Define registers\n",
        "\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(1, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Initialize the state\n",
        "qc.initialize([1, 1] / np.sqrt(2))\n",
        "\n",
        "# Step 2: Transpile the circuit\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qc)\n",
        "obs1_isa = obs1.apply_layout(layout=qc_isa.layout)\n",
        "obs2_isa = obs2.apply_layout(layout=qc_isa.layout)\n",
        "\n",
        "# Step 3: Run the circuit on a real quantum computer\n",
        "\n",
        "with Batch(backend=backend) as batch:\n",
        "    estimator = Estimator(mode=batch)\n",
        "    pubs = [(qc_isa, obs1_isa), (qc_isa, obs2_isa)]\n",
        "    job = estimator.run(pubs)\n",
        "    res = job.result()\n",
        "batch.close()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "\n",
        "# job = noisy_estimator.run([[qc,obs1],[qc,obs2]])\n",
        "# res=job.result()\n",
        "\n",
        "# Step 4: Return the result in classical form, and analyze.\n",
        "\n",
        "print(\"The expectation value of the first observable is: \", res[0].data.evs)\n",
        "print(\"The expectation value of the second observable is: \", res[1].data.evs)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "489472e8-eefc-4740-aa7e-eba8e71d0d72",
      "metadata": {},
      "source": [
        "$X$ 의 기대값은 1.0 에 가까워야 하지만 1.0 을 초과해서는 안 됩니다. 1.0 을 아주 조금 초과하더라도 걱정하지 마세요. 이는 노이즈 및/또는 판독 오류와 같은 요인으로 인해 발생할 수 있습니다. 이것은 매우 중요한 주제이지만 지금은 무시해도 됩니다.\n",
        "\n",
        "1.0 에 매우 가까운 $X$ 의 기대값을 얻었습니다( $X$ 의 분산이 매우 낮음에 해당). 따라서 두 분산의 곱은 매우 낮습니다:\n",
        "\n",
        "$$\n",
        "\\Delta X \\Delta Z = \\sqrt{1-(0.9853)^2} \\times \\sqrt{1-(-0.00195)^2} = 0.171.\n",
        "$$\n",
        "\n",
        "이 값이 정확히 0은 아니지만, 폴리 연산자( $\\pm 1$ )의 고유값과 비교하면 점점 작아지고 있습니다. 선형 위치와 운동량 사이의 불확실성 관계는 연산자 $x$ 와 $p_x$ 사이의 정류 관계를 사용하여 명시적으로 다르게 작성할 수 있다는 것을 기억할 수 있습니다:\n",
        "\n",
        "$$\n",
        "\\Delta x \\Delta p_x \\geq \\frac{1}{2}|\\langle [x,p_x] \\rangle|\n",
        "$$\n",
        "\n",
        "여기서,\n",
        "\n",
        "$$\n",
        "[x,p_x] = xp_x-p_xx\n",
        "$$\n",
        "\n",
        "는 $x$ 와 $p_x$ 의 정류자입니다.\n",
        "\n",
        "이것은 폴리 연산자에게 가장 쉽게 확장할 수 있는 형태입니다. 일반적으로 $A$ 와 $B$ 두 운영자의 경우,\n",
        "\n",
        "$$\n",
        "\\Delta A \\Delta B \\geq \\frac{1}{2}|\\langle [A,B] \\rangle|.\n",
        "$$\n",
        "\n",
        "그리고 폴리 행렬 $X$ 과 $Z$ 의 경우 다음을 계산하려면 $[X,Z]$ 이 필요합니다\n",
        "\n",
        "$$\n",
        "\\Delta X \\Delta Z \\geq \\frac{1}{2}|\\langle [X,Z] \\rangle|.\n",
        "$$\n",
        "\n",
        "여기에서는 이를 보여드리고, 독자들이 연습용으로 비슷한 계산을 해볼 수 있도록 남겨두겠습니다:\n",
        "\n",
        "$$\n",
        "[X,Z] = XZ-ZX = \\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix}\\begin{pmatrix}1 & 0 \\\\ 0 & -1\\end{pmatrix}-\\begin{pmatrix}1 & 0 \\\\ 0 & -1\\end{pmatrix}\\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix}\n",
        "$$\n",
        "\n",
        "$$\n",
        "[X,Z] = \\begin{pmatrix}0 & -1 \\\\ 1 & 0\\end{pmatrix}-\\begin{pmatrix}0 & 1 \\\\ -1 & 0\\end{pmatrix} = 2\\begin{pmatrix}0 & -1 \\\\ 1 & 0\\end{pmatrix}\n",
        "$$\n",
        "\n",
        "이것은 완벽하게 수용 가능한 대답이지만 한 단계 더 나아가면 다음과 같습니다\n",
        "\n",
        "$$\n",
        "[X,Z] = -2i\\begin{pmatrix}0 & -i \\\\ i & 0\\end{pmatrix}=-2iY\n",
        "$$\n",
        "\n",
        "따라서 불확실성 관계는 다음과 같습니다\n",
        "\n",
        "$$\n",
        "\\Delta X \\Delta Z \\geq |\\langle Y \\rangle|.\n",
        "$$\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 이해도 점검\n",
        "\n",
        "$[X,Y]$ 과 $[Y,Z]$ 을 결정합니다. 이를 사용하여 $X$ 와 $Y$, $Y$ 와 $Z$ 사이의 불확실성 관계를 적습니다.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    $$\n",
        "    [X,Y] = XY-YX = \\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix}\\begin{pmatrix}0 & -i \\\\ i & 0\\end{pmatrix}-\\begin{pmatrix}0 & -i \\\\ i & 0\\end{pmatrix}\\begin{pmatrix}0 & 1 \\\\ 1 & 0\\end{pmatrix} = 2 \\begin{pmatrix}i & 0 \\\\ 0 & -i\\end{pmatrix}=2iZ\n",
        "    $$\n",
        "\n",
        "    $$\n",
        "    [Y,Z] = YZ-ZY = \\begin{pmatrix}0 & -i \\\\ i & 0\\end{pmatrix}\\begin{pmatrix}1 & 0 \\\\ 0 & -1\\end{pmatrix}-\\begin{pmatrix}1 & 0 \\\\ 0 & -1\\end{pmatrix}\\begin{pmatrix}0 & -i \\\\ i & 0\\end{pmatrix} = 2 \\begin{pmatrix}0 & i \\\\ i & 0\\end{pmatrix}=2iX\n",
        "    $$\n",
        "\n",
        "    일반적인 불확실성 관계와 결합하면 다음과 같은 결과를 얻을 수 있습니다\n",
        "\n",
        "    $$\n",
        "    \\Delta X \\Delta Y \\geq |\\langle Z \\rangle|,\n",
        "    $$\n",
        "\n",
        "    $$\n",
        "    \\Delta Y \\Delta Z \\geq |\\langle X \\rangle|.\n",
        "    $$\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n",
        "<span id=\"verify-consistency\" />\n",
        "\n",
        "### 일관성 확인\n",
        "\n",
        "계속 진행하기 전에 이 결과가 이전 결과와 일치하는지 확인해 보겠습니다. $|\\psi\\rangle = \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 \\\\ 1 \\end{pmatrix}.$ 상태를 사용했고 $\\Delta X \\Delta Z  = 0.171.$ 이제 이 제품이 다음보다 크거나 같아야 한다는 것을 알았습니다\n",
        "\n",
        "$$\n",
        "|\\langle Y \\rangle|=\\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 & 1 \\end{pmatrix}\\begin{pmatrix}0 & -i \\\\ i & 0\\end{pmatrix}\\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 \\\\ 1 \\end{pmatrix}\n",
        "$$\n",
        "\n",
        "$$\n",
        "|\\langle Y \\rangle| = \\frac{1}{2}\\begin{pmatrix} 1 & 1 \\end{pmatrix}\\begin{pmatrix} -i \\\\ i \\end{pmatrix} = \\frac{1}{2}(-i+i) = 0.\n",
        "$$\n",
        "\n",
        "실제로 그렇습니다, $\\Delta X \\Delta Z  = 0.171 \\geq |\\langle Y \\rangle|=0$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0ea50490-36e9-4ab6-b9e1-6840f6dedfec",
      "metadata": {},
      "source": [
        "아래 질문을 통해 이러한 결과에 대한 직관력을 키우세요:\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 이해도 점검\n",
        "\n",
        "다음 항목을 세트로 묶어 답하세요:\n",
        "\n",
        "(a) $X$ 에서 불확실성이 0이 되는 상태는 어떤 상태일 것으로 예상하십니까?\n",
        "\n",
        "(b) $Z$ 에서 불확실성이 0이 될 것으로 예상하는 상태는 어떤 상태입니까?\n",
        "\n",
        "(c) 어떤 상태에서 0의 기대값 $\\langle Y \\rangle$ 을 얻을 수 있을까요?\n",
        "\n",
        "(d) 위의 질문에 대한 답변이 $\\Delta X \\Delta Z \\geq |\\langle Y \\rangle|$?\n",
        "\n",
        "(e) 추정기를 사용하여 이를 명시적으로 확인하는 코드를 작성합니다.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    (a) $X$ 연산자의 고유 상태는 $X$ 에서 불확실성이 0이 될 것으로 예상할 수 있습니다. 실제로 $|\\psi\\rangle = |+\\rangle_x,$ 을 사용하면 다음과 같습니다 $\\Delta X = \\sqrt{1-\\langle X \\rangle^2} = \\sqrt{1-1^2} = 0.$\n",
        "\n",
        "    (b) $Z$ 연산자의 고유 상태는 $Z$ 에서 불확실성이 0이 될 것으로 예상할 수 있습니다. 실제로 $|\\psi\\rangle = |1\\rangle,$ 을 사용하면 다음과 같습니다 $\\Delta Z = \\sqrt{1-\\langle Z \\rangle^2} = \\sqrt{1-(-1)^2} = 0.$\n",
        "\n",
        "    (c) 측정 시 $y$ 축에서 음수 투영과 마찬가지로 양수 투영을 산출하는 모든 상태에 대해 $\\langle Y \\rangle=0$ 을 찾을 수 있을 것으로 예상합니다. 여기에는 $X$ 및 $Z$ 의 고유 상태가 포함됩니다.\n",
        "\n",
        "    (d) 예. $X$ 또는 $Z$ 의 고유 상태에 대한 불확실성의 곱 $\\Delta X \\Delta Z $ 은 매우 작은 값을 기대할 수 있습니다: $\\Delta X \\Delta Z \\approx 0.$ 동일한 상태에 대해 $\\langle Y \\rangle=0$ 도 기대할 수 있기 때문에 이는 유지될 수 있습니다. 따라서 불확실성 관계를 만족시킬 수 있습니다.\n",
        "\n",
        "    (e) 다음과 같은 코드로 이를 확인할 수 있습니다:\n",
        "\n",
        "    ```python\n",
        "    obs1 = SparsePauliOp.from_list(\n",
        "        [(\"X\", 1.000)]\n",
        "    )\n",
        "    obs2 = SparsePauliOp.from_list(\n",
        "        [(\"Y\", 1.000)]\n",
        "    )\n",
        "    obs3 = SparsePauliOp.from_list(\n",
        "        [(\"Z\", 1.000)]\n",
        "    )\n",
        "    qc = QuantumCircuit(1,1)\n",
        "    qc.ry(pi/2,0)\n",
        "\n",
        "    job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)\n",
        "    res=job.result()\n",
        "    ```\n",
        "\n",
        "    결과는 모든 기대값을 반환합니다. 모든 기대값을 검색하고 불확실성을 계산하려면 다음을 사용할 수 있습니다:\n",
        "\n",
        "    ```python\n",
        "    xs=res[0].data.evs[0]\n",
        "    ys=abs(res[0].data.evs[1])\n",
        "    zs=res[0].data.evs[2]\n",
        "\n",
        "    import math\n",
        "    prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5\n",
        "\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n",
        "다음 항목을 세트로 묶어 답하세요:\n",
        "\n",
        "(a) 기대값이 큰 상태 $\\langle Y \\rangle$ 를 생각해 볼 수 있나요?\n",
        "\n",
        "(b) 동일한 상태의 불확실성이 크거나 작을 것으로 예상하십니까 $X$?\n",
        "\n",
        "(c) 동일한 상태의 불확실성이 크거나 작을 것으로 예상하십니까 $Z$?\n",
        "\n",
        "(d) 위의 질문에 대한 답변이 $\\Delta X \\Delta Z \\geq |\\langle Y \\rangle|$?\n",
        "\n",
        "(e) 추정기를 사용하여 이를 명시적으로 확인하는 코드를 작성합니다.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    (a) $Y$ : $|+\\rangle_y$ 에서 $\\langle Y \\rangle\\approx 1$ 을 찾을 수 있을 것으로 예상합니다.\n",
        "\n",
        "    (b) $|+\\rangle_y,$ 상태에서 $X$ 을 측정하면 동일한 빈도/확률로 양수 및 음수 결과가 나오므로 $X$ 상태의 불확실성이 클 것으로 예상할 수 있습니다.\n",
        "\n",
        "    (c) $|+\\rangle_y,$ 상태에서 $Z$ 을 측정하면 동일한 빈도/확률로 양수 및 음수 결과가 나오므로 $Z$ 상태의 불확실성이 클 것으로 예상할 수 있습니다.\n",
        "\n",
        "    (d) 예. 불확실성의 산물 $\\Delta X \\Delta Z $ 의 경우 $Y,$ 의 고유 상태와 $|+\\rangle_y,$ 의 경우 특히 큰 값을 기대할 수 있습니다. 또한 같은 주에 대해서도 $\\langle Y \\rangle\\approx 1$. 따라서 $\\langle Y \\rangle$ 및 $\\Delta X \\Delta Z $ 모두 이 상태에서 상당히 크며 불확실성 관계가 다시 충족될 수 있을 것으로 보입니다.\n",
        "\n",
        "    (e) 다음과 같은 코드로 이를 확인할 수 있습니다:\n",
        "\n",
        "    ```python\n",
        "    obs1 = SparsePauliOp.from_list(\n",
        "        [(\"X\", 1.000)]\n",
        "    )\n",
        "    obs2 = SparsePauliOp.from_list(\n",
        "        [(\"Y\", 1.000)]\n",
        "    )\n",
        "    obs3 = SparsePauliOp.from_list(\n",
        "        [(\"Z\", 1.000)]\n",
        "    )\n",
        "    qc = QuantumCircuit(1,1)\n",
        "    qc.rx(-pi/2,0)\n",
        "\n",
        "    job = estimator.run([(qc, [[obs1], [obs2], [obs3]])], precision=0.001)\n",
        "    res=job.result()\n",
        "    ```\n",
        "\n",
        "    결과는 모든 기대값을 반환합니다. 모든 기대값을 검색하고 불확실성을 계산하려면 다음을 사용할 수 있습니다:\n",
        "\n",
        "    ```python\n",
        "    xs=res[0].data.evs[0]\n",
        "    ys=abs(res[0].data.evs[1])\n",
        "    zs=res[0].data.evs[2]\n",
        "\n",
        "    import math\n",
        "    prodxz=((1-xs[i]*xs[i])**0.5)*(1-zs[i]*zs[i])**0.5\n",
        "\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "26f11700-d6be-4ce1-9f97-b2d47ea933ec",
      "metadata": {},
      "source": [
        "<span id=\"testing-uncertainty-relations\" />\n",
        "\n",
        "## 불확정성 관계의 검증\n",
        "\n",
        "위의 테스트는 상태 벡터의 단일 선택에 대한 불확실성 관계의 유효성만 입증했습니다 $|\\psi\\rangle = |+\\rangle_x$. 이것이 일반적으로 실험과 일치한다는 것을 확신하려면 상태 벡터의 여러 선택에 대해 추정기를 사용하여 유사한 계산을 수행해야 합니다. 먼저 상태 벡터를 $z$ 축에서 멀리 회전시키고, `RY` 게이트를 사용하여 매개변수 $\\theta$ 를 사용하여 다른 초기 상태를 생성하는 것으로 시작하겠습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c434a14d-c0ce-40bd-8f5e-7d35722e97bb",
      "metadata": {},
      "outputs": [],
      "source": [
        "# The calculation below uses approximately 3-4 minutes of QPU time.\n",
        "# Step 1: Map the problem into a quantum circuit\n",
        "\n",
        "from qiskit.circuit import Parameter\n",
        "import numpy as np\n",
        "\n",
        "# Specify observables\n",
        "obs1 = SparsePauliOp(\"X\")\n",
        "obs2 = SparsePauliOp(\"Y\")\n",
        "obs3 = SparsePauliOp(\"Z\")\n",
        "\n",
        "# Define registers\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(1, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Rotate away from |0>\n",
        "theta = Parameter(\"θ\")\n",
        "qc.ry(theta, 0)\n",
        "\n",
        "params = np.linspace(0, 2, num=21)\n",
        "\n",
        "# Step 2: Transpile the circuit\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qc)\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",
        "# Step 3: Run the circuit on a real quantum computer\n",
        "\n",
        "with Batch(backend=backend) as batch:\n",
        "    estimator = Estimator(mode=batch)\n",
        "    pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]\n",
        "    job = estimator.run(pubs, precision=0.01)\n",
        "    res = job.result()\n",
        "\n",
        "batch.close()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "\n",
        "# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])\n",
        "# res=job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 18,
      "id": "41d974bb-da9e-459e-8145-294f71cab4c7",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Step 4: Post-processing and classical analysis.\n",
        "xs = res[0].data.evs[0]\n",
        "ys = abs(res[0].data.evs[1])\n",
        "zs = res[0].data.evs[2]\n",
        "\n",
        "# Calculate uncertainties\n",
        "\n",
        "delx = []\n",
        "delz = []\n",
        "prodxz = []\n",
        "for i in range(len(xs)):\n",
        "    delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)\n",
        "    delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)\n",
        "    prodxz.append(delx[i] * delz[i])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 19,
      "id": "1599d4df-38f8-4171-95ae-6c3c61409201",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/1599d4df-38f8-4171-95ae-6c3c61409201-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Here we can plot the results from this simulation.\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "plt.plot(params, delx, label=r\"$\\Delta$ X\")\n",
        "plt.plot(params, ys, label=r\"$\\langle$ Y $\\rangle$\")\n",
        "plt.plot(params, delz, label=r\"$\\Delta$ Z\")\n",
        "plt.plot(params, prodxz, label=r\"$\\Delta$X $\\Delta$Z\")\n",
        "plt.xlabel(r\"$\\theta$\")\n",
        "plt.ylabel(\"Expectation/Uncertainty Values\")\n",
        "plt.legend()\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1694ab4f-b5e2-46be-b453-2599f73c582d",
      "metadata": {},
      "source": [
        "빨간색 곡선 $(\\Delta X \\Delta Z)$ 은 항상 주황색 곡선 $\\langle Y \\rangle.$ 보다 큽니다. 불확실성 곱이 하락하여 한계에 어느 정도 근접하는 경우도 있고 상승하여 한계에서 멀어지는 경우도 있지만 항상 불확실성 관계를 따릅니다.\n",
        "\n",
        "물론 한계 $\\langle Y \\rangle$ 는 항상 0에 매우 가깝기 때문에 불확실성 관계에 대한 최선의 테스트는 아닐 수 있습니다. $Y$ 의 고유 상태에 대해 더 큰 투영을 갖는 양자 상태를 사용하겠습니다. 구체적으로, 여전히 $z$ 축에서 $|0\\rangle$ 을 다양한 각도로 회전하지만, 이제 그 결과 상태도 $z$ 를 중심으로 어떤 각도, 아마도 $\\pi/4$ 로 회전하여 어떤 일이 일어나는지 살펴볼 것입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "c9700dd1-d116-4f94-8c81-70383ce38671",
      "metadata": {},
      "outputs": [],
      "source": [
        "# The calculation below uses approximately 3-4 minutes of QPU time.\n",
        "from qiskit.circuit import Parameter\n",
        "import numpy as np\n",
        "\n",
        "# Step 1: Map the problem to a quantum circuit\n",
        "\n",
        "# Specify observables\n",
        "obs1 = SparsePauliOp(\"X\")\n",
        "obs2 = SparsePauliOp(\"Y\")\n",
        "obs3 = SparsePauliOp(\"Z\")\n",
        "\n",
        "# Define registers\n",
        "qr = QuantumRegister(1, \"q\")\n",
        "cr = ClassicalRegister(1, \"c\")\n",
        "qc = QuantumCircuit(qr, cr)\n",
        "\n",
        "# Rotate away from |0> along one plane, and then along a transverse direction.\n",
        "theta = Parameter(\"θ\")\n",
        "qc.ry(theta, 0)\n",
        "qc.rz(pi / 4, 0)\n",
        "\n",
        "params = np.linspace(0, 2, num=21)\n",
        "\n",
        "# Step 2: Transpile the circuit\n",
        "\n",
        "pm = generate_preset_pass_manager(target=target, optimization_level=3)\n",
        "qc_isa = pm.run(qc)\n",
        "\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",
        "# Step 3: Run the circuit on a real quantum computer\n",
        "\n",
        "with Batch(backend=backend) as batch:\n",
        "    estimator = Estimator(mode=batch)\n",
        "    pubs = [(qc_isa, [[obs1_isa], [obs2_isa], [obs3_isa]], [params])]\n",
        "    job = estimator.run(pubs, precision=0.01)\n",
        "    res = job.result()\n",
        "\n",
        "batch.close()\n",
        "\n",
        "# Run the job on the Aer simulator with noise model from real backend\n",
        "\n",
        "# job = noisy_estimator.run([(qc, [[obs1], [obs2], [obs3]], [params])])\n",
        "# res=job.result()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 21,
      "id": "7e85e759-33a7-4539-80f7-05c769c46144",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Step 4: Post-processing and classical analysis.\n",
        "xs = res[0].data.evs[0]\n",
        "ys = abs(res[0].data.evs[1])\n",
        "zs = res[0].data.evs[2]\n",
        "\n",
        "# Calculate uncertainties\n",
        "\n",
        "delx = []\n",
        "delz = []\n",
        "prodxz = []\n",
        "for i in range(len(xs)):\n",
        "    delx.append(abs((1 - xs[i] * xs[i])) ** 0.5)\n",
        "    delz.append(abs((1 - zs[i] * zs[i])) ** 0.5)\n",
        "    prodxz.append(delx[i] * delz[i])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 22,
      "id": "6f129a2d-e029-45b7-bb77-bfa83babd8c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/extracted-outputs/6f129a2d-e029-45b7-bb77-bfa83babd8c9-0.avif\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "# Here we can plot the results from this simulation.\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "plt.plot(params, delx, label=r\"$\\Delta$ X\")\n",
        "plt.plot(params, ys, label=r\"$\\langle$ Y $\\rangle$\")\n",
        "plt.plot(params, delz, label=r\"$\\Delta$ Z\")\n",
        "plt.plot(params, prodxz, label=r\"$\\Delta$X $\\Delta$Z\")\n",
        "plt.xlabel(r\"$\\theta$\")\n",
        "plt.ylabel(\"Expectation/Uncertainty Values\")\n",
        "plt.legend()\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "7b90bcd5-f561-4f7f-a5a3-7882b3ddb464",
      "metadata": {},
      "source": [
        "이제 우리는 불확실성에 대한 한계가 $(\\Delta X \\Delta Z)$ 시험대에 오르고 있음을 목격하고 있다! 빨간 곡선이 이전보다 주황색 곡선에 훨씬 더 가까워졌다. 사실, 잡음이 없는 경우 불확정성 관계는 정확히 포화 상태( $(\\Delta X \\Delta Z) = \\langle Y \\rangle$ )가 될 것이다. 잡음과 판독 오차가 존재하는 상황에서, 가끔씩 측정값이 예상보다 아주 약간 더 $(\\Delta X \\Delta Z)$ 크게 나오는 $\\langle Y \\rangle.$ 것은 놀랄 일이 아니다. 이는 불확정성의 진정한 위반이 아니라, 단순히 제로가 아닌 오차의 결과물일 뿐이다.\n",
        "\n",
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 이해도 점검\n",
        "\n",
        "$\\langle Y \\rangle$ 를 최대한 크게 만들어 이 기능을 극한까지 끌어올릴 수 있는 방법을 설명해 주세요.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    현재 코드에는 기본 초기 상태 $|0\\rangle$ 를 $z$ 축에서 일부 매개변수화된 각도 $\\theta$ 로 회전시킨 다음 $z$ 축을 중심으로 상태 벡터를 $y$ 축으로 일부 회전시키는 각도 $\\pi/4,$ 로 회전시키는 선이 있습니다.\n",
        "\n",
        "    `qc.ry(theta,0)`\n",
        "\n",
        "    `qc.rz(pi/4,0)`\n",
        "\n",
        "    $z$ 에 대한 로테이션을 $\\pi/4$ 에서 $\\pi/2$ 로 변경하여 $Y$ 의 고유 상태까지 회전할 수 있습니다 :\n",
        "\n",
        "    `qc.ry(theta,0)`\n",
        "\n",
        "    `qc.rz(pi/2,0)`\n",
        "\n",
        "    다른 변경 사항은 필요하지 않습니다.\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n",
        "코드를 변경하거나 복사하여 기대값 Y를 최대로 하여 불확실성 관계 검사를 구현합니다. 불확실성 관계는 유지되나요?\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    위 예제의 코드를 그대로 사용하되, 다음과 같이 수정합니다\n",
        "\n",
        "    `qc.rz(pi/2,0)`\n",
        "\n",
        "    교체하기 위해 교체\n",
        "\n",
        "    `qc.rz(pi/4,0).`\n",
        "\n",
        "    결과 그림은 아래와 같아야 하며, 불확실성 원칙은 여전히 유효합니다.\n",
        "\n",
        "    ![불확실성을 Y 연산자의 최대 기대값과 비교하는 플롯입니다.](https://quantum.cloud.ibm.com/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/checkin.avif)\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6dd8c749-00d6-4a08-8d3c-2f5b5f3a0902",
      "metadata": {},
      "source": [
        "위의 코드를 수정하여 비슷한 그림을 만들고, 양자 컴퓨터에서 측정한 결과 $\\Delta X \\Delta Y$ 제품이 정상적으로 작동함을 보여줍니다. 원하는 상태 집합을 선택하세요.\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"답변\">\n",
        "    위 예제의 코드를 그대로 사용할 것이며, 얼굴에서는 기대값을 사용하여 다른 불확실성을 계산하기만 하면 위와 동일한 결과를 사용할 수 있습니다. 예를 들어 다음을 사용할 수 있습니다\n",
        "\n",
        "    ```python\n",
        "    xs=res[0].data.evs[0]\n",
        "    ys=res[0].data.evs[1]\n",
        "    zs=abs(res[0].data.evs[2])\n",
        "    import math\n",
        "    delx = []\n",
        "    dely = []\n",
        "    prodxy=[]\n",
        "    for i in range(len(xs)):\n",
        "        delx.append((1-xs[i]*xs[i])**0.5)\n",
        "        dely.append((1-ys[i]*ys[i])**0.5)\n",
        "        prodxy.append(((1-xs[i]*xs[i])**0.5)*(1-ys[i]*ys[i])**0.5)\n",
        "    ```\n",
        "\n",
        "    그리고 우리는\n",
        "\n",
        "    ```python\n",
        "    import matplotlib.pyplot as plt\n",
        "    plt.plot(params, delx, label=r'$\\Delta$ X')\n",
        "    plt.plot(params, dely, label=r'$\\langle$ Y $\\rangle$')\n",
        "    plt.plot(params, zs, label=r'$\\Delta$ Z')\n",
        "    plt.plot(params, prodxy, label=r'$\\Delta$X $\\Delta$Z')\n",
        "    plt.xlabel(r'$\\theta$')\n",
        "    plt.ylabel('Expectation/Uncertainty Values')\n",
        "    plt.legend()\n",
        "    plt.show()\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "571a0120-a9d3-44c5-9dce-1b021090f9d1",
      "metadata": {},
      "source": [
        "도전: $\\theta$ 의 여러 값을 스캔한 것처럼 $\\phi$ 의 여러 값을 스캔하는 코드를 작성하고 불확실성 관계를 위반하지 않는다는 것을 보여주는 3D 플롯을 작성하세요. 원하는 관찰 항목을 선택하세요.\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b89eaae3-6ea9-486c-b93c-55431839d5f1",
      "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",
        "* 양자 컴퓨팅은 폴리 연산자/행렬을 많이 사용하므로 폴리 연산자와 밀접하게 관련된 스핀 연산자에 대한 불확실성 관계를 아는 것이 유용합니다.\n",
        "* 두 연산자 $A$ 와 $B$ 의 불확실성에 대한 일반적인 공식은 다음과 같습니다 $\\Delta A \\Delta B \\geq \\frac{1}{2}|\\langle [A,B] \\rangle|.$\n",
        "* 어떤 연산자 $A$ 의 고유상태 $|a\\rangle$ 는 해당 연산자와 관련된 물리적 관측량에 대해 불확실성을 0으로 만든다. 실험적으로 보더라도, $\\Delta A \\approx 0.$\n",
        "* 어떤 운영자 $A$ 의 고유 상태 $|a\\rangle$ 는 $A$ 와 통근하지 않는 운영자 $B$ 에게는 더 큰 불확실성을 야기합니다.\n",
        "* 실제 양자 컴퓨터를 사용한 실험 결과는 물리적 연산자의 행렬 표현을 통해 얻은 직관을 확인시켜 줍니다.\n",
        "\n",
        "<span id=\"t/f-questions\" />\n",
        "\n",
        "### T/F 문제:\n",
        "\n",
        "1. T/F One은 $X$ 와 $Y$ 을 동시에 측정할 수 있지만 $Z$ 은 측정할 수 없습니다.\n",
        "2. T/F One은 $X$ 와 $Z$ 을 동시에 측정할 수 있지만 $Y$ 은 측정할 수 없습니다.\n",
        "3. T/F 리니어 포지션 및 리니어 모멘텀 운영자는 출퇴근하지 않습니다.\n",
        "4. T/F IBM 양자 컴퓨터는 기본적으로 $Z$ 을 따라 측정하므로 다른 방향을 따라 측정하려면 회전을 수행해야 합니다.\n",
        "5. T/F 아래 회로는 $Z$ 과 $X$ 을 효과적으로 측정합니다.\n",
        "\n",
        "![측정값, 하다마드 게이트, 그리고 또 다른 측정값을 보여주는 회로도입니다.](https://quantum.cloud.ibm.com/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/tf-q5.avif)\n",
        "\n",
        "<span id=\"mc-questions\" />\n",
        "\n",
        "### MC 질문:\n",
        "\n",
        "1. 아래 다이어그램은 다음 중 어떤 불확실성 관계를 보여 주는가?\n",
        "\n",
        "   * a. $\\Delta X \\Delta Y \\geq |\\langle Z \\rangle|$\n",
        "   * b. $\\Delta Y \\Delta Z \\geq |\\langle X \\rangle|$\n",
        "   * c. $\\Delta Z \\Delta X \\geq |\\langle Y \\rangle|$\n",
        "   * d. 해당 항목 없음\n",
        "\n",
        "![불확실성을 Y 연산자의 최대 기대값과 비교하는 플롯입니다.](https://quantum.cloud.ibm.com/learning/images/modules/quantum-mechanics/exploring-uncertainty-with-qiskit/checkin.avif)\n",
        "\n",
        "2. 다음 중 $x$ 을 따라 측정을 수행하는 표준 순서는 무엇입니까?\n",
        "   * a. 전용 `qc.measure()`\n",
        "   * b. `qc.h()` then `qc.measure()`\n",
        "   * c. `qc.h()`, `qc.h()` then `qc.measure()`\n",
        "   * d. `qc.h()`, `qc.s`, `qc.h()` `qc.measure()`\n",
        "   * e. `qc.sdg()`, `qc.h()`, `qc.s` `qc.measure()`\n",
        "   * f. `qc.sdg()`, `qc.h()`, `qc.s`, `qc.h()` `qc.measure()`\n",
        "\n",
        "3. 다음 중 가장 큰 기대값을 산출하는 상태는 $\\langle X \\rangle$?\n",
        "   * a. $|+\\rangle_x$\n",
        "   * b. $|-\\rangle_x$\n",
        "   * c. $|+\\rangle_y$ 라고도 함 $|+i\\rangle$\n",
        "   * d. $|-\\rangle_y$ 라고도 함 $|-i\\rangle$\n",
        "   * e. $|0\\rangle$ 라고도 함 $|\\uparrow\\rangle$\n",
        "   * f. $|1\\rangle$ 라고도 함 $|\\downarrow\\rangle$\n",
        "\n",
        "4. 다음 중 불확실성이 가장 큰 상태는 $\\Delta X$?\n",
        "   * a. $|+\\rangle_x$\n",
        "   * b. $|+\\rangle_y$ 라고도 함 $|+i\\rangle$\n",
        "   * c. $|0\\rangle$ 라고도 함 $|\\uparrow\\rangle$\n",
        "   * d. a와 B가 동점입니다\n",
        "   * e. b와 c가 동점입니다\n",
        "   * f. a, B, C가 동점인 경우\n",
        "\n",
        "<span id=\"discussion-questions\" />\n",
        "\n",
        "### 토론 질문:\n",
        "\n",
        "1. 이 불확실성 개념이 데카르트 공간에서 벡터 화살표로서의 스핀 개념과 어떤 식으로든 충돌하나요? 블로흐 구체는 어떨까요?\n",
        "\n",
        "2. $x$ 축과 $y$ 축의 중간 방향을 따라 측정 장치의 방향을 잡았다고 가정해 보겠습니다. 무슨 일이 발생했습니까? 이 방향을 따라 측정할 수 있나요? 이것이 $X$ 및 $Y$ 의 불확실성과 어떤 관련이 있나요?\n",
        "\n",
        "3. 여기서 얻은 결과를 확신하기 위해 어떤 추가 실험을 하고 싶으신가요?\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": 4
}