{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "3b140909-ace6-4665-a0bf-f3bb9bd094c0",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit SDK 의 기본 요소로 정확한 시뮬레이션\"\n",
        "description: \"Qiskit의 기본 연산자를 사용하여 양자 회로의 정확한 시뮬레이션을 수행하는 방법.\"\n",
        "---\n",
        "\n",
        "<span id=\"exact-simulation-with-qiskit-sdk-primitives\" />\n",
        "\n",
        "# Qiskit SDK 의 기본 요소로 정확한 시뮬레이션\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b820ca5f-60cc-41c7-98db-4b41df4534cc",
      "metadata": {
        "tags": [
          "version-info"
        ]
      },
      "source": [
        "{/*\n",
        "  DO NOT EDIT THIS CELL!!!\n",
        "  This cell's content is generated automatically by a script. Anything you add\n",
        "  here will be removed next time the notebook is run. To add new content, create\n",
        "  a new cell before or after this one.\n",
        "  */}\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"패키지 버전\">\n",
        "    이 페이지의 코드는 다음 요구 사항을 사용하여 개발되었습니다.\n",
        "    다음 버전 이상을 사용하는 것이 좋습니다.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.2\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "867f73c6-dd57-4755-9bbd-55ffffe7e09e",
      "metadata": {},
      "source": [
        "Qiskit SDK 의 참조 프리미티브는 국소 상태 벡터 시뮬레이션을 수행합니다. 이러한 시뮬레이션은\n",
        "디바이스 노이즈를 모델링하는 데는 적합하지 않지만, 보다 고급 시뮬레이션\n",
        "기법( [Qiskit Aer 사용](/docs/guides/simulate-stabilizer-circuits) )을 탐구하거나 실제 디바이스에서 실행( [IBM Quantum 기본 요소](primitives) )하기 전에 알고리즘을 신속하게 프로토타이핑하는 데 유용합니다.\n",
        "\n",
        "추정기 프리미티브는 회로의 기대값을 계산할 수 있고, 샘플러 프리미티브는 회로의 출력 분포에서 샘플링할 수 있습니다 을 샘플링할 수 있습니다.\n",
        "\n",
        "다음 섹션에서는 참조 프리미티브를 사용하여 워크플로를 로컬에서 실행하는 방법을 보여드립니다.\n",
        "\n",
        "<span id=\"use-the-reference-estimator\" />\n",
        "\n",
        "## 참조 추정기를 사용하십시오\n",
        "\n",
        "로컬 상태 벡터 시뮬레이터에서 실행되는 `qiskit.primitives` 의 `EstimatorV2` 참조 구현은 시뮬레이터에서 실행되는 참조 구현은 [`StatevectorEstimator`](../api/qiskit/qiskit.primitives.StatevectorEstimator) 클래스입니다. 회로, 관측값, 파라미터를 입력으로 받아 로컬에서 계산된 기대값을 반환할 수 있습니다.\n",
        "\n",
        "다음 코드는 이후 예제에서 사용될 입력 데이터를 준비합니다. 관측 가능 객체의 예상 입력 유형은\n",
        "입니다 [`qiskit.quantum_info.SparsePauliOp`](../api/qiskit/qiskit.quantum_info.SparsePauliOp). 참고로\n",
        "예제의 회로는 매개변수화되어 있지만, 매개변수화되지 않은 회로에서도 Estimator를 실행할 수 있습니다.\n",
        "\n",
        "<Admonition type=\"note\">\n",
        "  추정기로 전달되는 모든 회로에는 **측정값이** 포함되어서는 **안** 됩니다.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "5b41a52d-8f15-4ce4-b3f6-effd91946d9c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-sdk-primitives/extracted-outputs/5b41a52d-8f15-4ce4-b3f6-effd91946d9c-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "from qiskit.circuit import Parameter\n",
        "\n",
        "# circuit for which you want to obtain the expected value\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.ry(Parameter(\"theta\"), 0)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.draw(\"mpl\", style=\"iqp\")"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "18658518-304a-49a7-8958-82adef366de6",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "import numpy as np\n",
        "\n",
        "# observable(s) whose expected values you want to compute\n",
        "\n",
        "observable = SparsePauliOp([\"II\", \"XX\", \"YY\", \"ZZ\"], coeffs=[1, 1, -1, 1])\n",
        "\n",
        "# value(s) for the circuit parameter(s)\n",
        "parameter_values = [[0], [np.pi / 6], [np.pi / 2]]"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4c39904c-d586-41b9-ade0-e6a508ef7c2e",
      "metadata": {},
      "source": [
        "<Admonition type=\"tip\" title=\"ISA 회로 및 관측소로 트랜스파일하기\">\n",
        "  IBM Quantum 의 프리미티브 워크플로에서는 회로와 관측값을 QPU에서 지원하는 명령어만 사용하도록 변환해야 합니다(이를 *‘명령어 집합 아키텍처(ISA)* 회로 및 관측값’이라고 합니다). 참조 프리미티브는 로컬 상태 벡터 시뮬레이션에 의존하기 때문에 여전히 추상 명령어를 수용하지만, 회로를 트랜스파일링하는 것이 회로 최적화 측면에서 여전히 이점이 있을 수 있다.\n",
        "\n",
        "  ```python\n",
        "  # Generate a pass manager without providing a backend\n",
        "  from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "  pm = generate_preset_pass_manager(optimization_level=1)\n",
        "  isa_circuit = pm.run(circuit)\n",
        "  isa_observable = observable.apply_layout(isa_circuit.layout)\n",
        "  ```\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"initialize-estimator\" />\n",
        "\n",
        "### 추정기 초기화\n",
        "\n",
        "인스턴스화 [`qiskit.primitives.StatevectorEstimator`](../api/qiskit/qiskit.primitives.StatevectorEstimator).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "56f39026-7874-4f14-8529-b97df373eaf5",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.primitives import StatevectorEstimator\n",
        "\n",
        "estimator = StatevectorEstimator()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "9c4c81b1-8b87-450d-9a93-4f209364ee83",
      "metadata": {},
      "source": [
        "<span id=\"run-and-get-results\" />\n",
        "\n",
        "### 달려서 결과를 얻어라\n",
        "\n",
        "이 예제에서는 하나의 회로( [`QuantumCircuit`](../api/qiskit/qiskit.circuit.QuantumCircuit))와 하나의 관찰 가능.\n",
        "\n",
        "메서드를 호출하여 추정을 실행하면 [`StatevectorEstimator.run`](../api/qiskit/qiskit.primitives.StatevectorEstimator#run) 메서드를 호출하여 추정을 실행합니다 [`PrimitiveJob`](/docs/api/qiskit/qiskit.primitives.PrimitiveJob) 객체의 인스턴스를 반환하는 메서드를 호출하여 추정을 실행합니다. 작업에서 결과를 가져올 수 있습니다( [`qiskit.primitives.PrimitiveResult`](../api/qiskit/qiskit.primitives.PrimitiveResult) 객체) 메서드를 사용하여 [`qiskit.primitives.PrimitiveJob.result`](../api/qiskit/qiskit.primitives.PrimitiveJob#result) 메서드를 사용하여 작업의 결과를 가져올 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "0c424291-abb3-420c-80e1-a09ecbd6c035",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Result class: <class 'qiskit.primitives.containers.primitive_result.PrimitiveResult'>\n"
          ]
        }
      ],
      "source": [
        "job = estimator.run([(circuit, observable, parameter_values)])\n",
        "result = job.result()\n",
        "print(f\" > Result class: {type(result)}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "871ce7d6-402c-417f-8a83-805d92fa0298",
      "metadata": {},
      "source": [
        "<span id=\"get-the-expected-value-from-the-result\" />\n",
        "\n",
        "#### 결과로부터 기대값을 얻으십시오\n",
        "\n",
        "원시 함수 결과는 객체 [`PubResult`](/docs/api/qiskit/qiskit.primitives.PubResult#pubresult) 배열을 출력하며, 배열의 각 요소는 데이터에 회로-관측 가능성 조합( PUB ) 내 모든 회로-관측 가능성 조합에 대응하는 평가 결과 배열을 포함하는 객체입니다 `PubResult` .\n",
        "\n",
        "첫 번째(이 경우 유일한) 회로 평가에 대한 기대값과 메타데이터를 검색하려면 평가에 액세스해야 합니다 [`data`](/docs/api/qiskit/qiskit.primitives.PubResult#data)PUB 에 액세스해야 합니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "145b3f62-dfaf-4288-8764-f2ecb90e38a1",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Expectation value: [4.         3.73205081 2.        ]\n",
            " > Metadata: {'target_precision': 0.0, 'circuit_metadata': {}}\n"
          ]
        }
      ],
      "source": [
        "print(f\" > Expectation value: {result[0].data.evs}\")\n",
        "print(f\" > Metadata: {result[0].metadata}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e29ec8cc-2c38-464a-a8b3-8f05b282c807",
      "metadata": {},
      "source": [
        "<span id=\"set-estimator-run-options\" />\n",
        "\n",
        "### 세트 추정기 실행 옵션 설정\n",
        "\n",
        "기본적으로 참조 추정기는 다음을 기반으로 정확한 상태 벡터 계산을 수행합니다 [`quantum_info.Statevector`](../api/qiskit/qiskit.quantum_info.Statevector) 클래스를 기반으로 정확한 상태벡터 계산을 수행합니다.\n",
        "그러나 샘플링 오버헤드(\"샷 노이즈\"라고도 함)의 효과를 도입하기 위해 이를 수정할 수 있습니다.\n",
        "\n",
        "추정기는 원시 구현이 목표로 삼아야 하는 오차 막대를 표현하는 `precision` 인수를 받아들입니다 프리미티브 구현이 기대값 추정을 위해 목표로 삼아야 하는 오차 막대를 표현하는 인수를 받습니다.  이는 샘플링 오버헤드이며 `.run()` 메서드에만 정의되어 있습니다. 이렇게 하면 PUB 수준까지 옵션을 미세 조정할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "04047e7a-23f4-431b-8e3a-11edf035e8fc",
      "metadata": {},
      "outputs": [],
      "source": [
        "# Estimate expectation values for two PUBs, both with 0.05 precision.\n",
        "precise_job = estimator.run(\n",
        "    [(circuit, observable, parameter_values)], precision=0.05\n",
        ")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "d54f110f-004a-4337-8b4d-7d4287f22be9",
      "metadata": {},
      "source": [
        "전체 예제는 [‘Estimator 예제’](/docs/guides/estimator-examples) 페이지를 참조하십시오.\n",
        "\n",
        "<span id=\"use-the-reference-sampler\" />\n",
        "\n",
        "## 참조 샘플러를 사용하십시오\n",
        "\n",
        "`qiskit.primitives` 에서 `SamplerV2` 의 참조 구현은 [`StatevectorSampler`](../api/qiskit/qiskit.primitives.StatevectorSampler) 클래스입니다. 회로와 파라미터를 입력으로 받아 출력 확률 분포에서 샘플링한 결과를 출력 상태의 준확률 분포로 반환합니다.\n",
        "\n",
        "다음 코드는 이후 예제에서 사용될 입력 데이터를 준비합니다. 참고로\n",
        "이 예제들은 매개변수가 지정된 단일 회로를 실행하지만, 매개변수가 지정되지 않은 회로에서도\n",
        "Sampler를 실행할 수 있습니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "d4c0ac3b-8e5b-4cde-bb26-256324982c2c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-sdk-primitives/extracted-outputs/d4c0ac3b-8e5b-4cde-bb26-256324982c2c-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure_all()\n",
        "circuit.draw(\"mpl\", style=\"iqp\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "b34ae490-9efb-45f5-937d-3ce86afa445f",
      "metadata": {},
      "source": [
        "<Admonition type=\"note\">\n",
        "  샘플러로 전달되는 모든 양자 회로에는 측정값이 **포함되어야** 합니다.\n",
        "</Admonition>\n",
        "\n",
        "<Admonition type=\"tip\" title=\"ISA 회로 및 관측소로 트랜스파일하기\">\n",
        "  IBM Quantum 의 프리미티브 워크플로에서는 회로를 QPU에서 지원하는 명령어만 사용하도록 변환해야 합니다(이를 ISA 회로라고 합니다). 참조 프리미티브는 로컬 상태 벡터 시뮬레이션에 의존하기 때문에 여전히 추상 명령어를 수용하지만, 회로를 트랜스파일링하는 것이 회로 최적화 측면에서 여전히 이점이 있을 수 있다.\n",
        "\n",
        "  ```python\n",
        "  # Generate a pass manager without providing a backend\n",
        "  from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "  pm = generate_preset_pass_manager(optimization_level=1)\n",
        "  isa_circuit = pm.run(qc)\n",
        "  ```\n",
        "</Admonition>\n",
        "\n",
        "<span id=\"initialize-samplerv2\" />\n",
        "\n",
        "### 초기화 `SamplerV2`\n",
        "\n",
        "인스턴스화 [`qiskit.primitives.StatevectorSampler`](../api/qiskit/qiskit.primitives.StatevectorSampler):\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "626177e7-f06a-4216-89c8-daf703520457",
      "metadata": {},
      "outputs": [],
      "source": [
        "from qiskit.primitives import StatevectorSampler\n",
        "\n",
        "sampler = StatevectorSampler()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "626fb8d6-75ae-47b2-ac0b-00acc4ce5afe",
      "metadata": {},
      "source": [
        "<span id=\"run-and-get-results\" />\n",
        "\n",
        "### 달려서 결과를 얻어라\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "id": "19659756-a01d-42ec-8fa7-d7a1bf2303d5",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Result class: <class 'qiskit.primitives.containers.sampler_pub_result.SamplerPubResult'>\n"
          ]
        }
      ],
      "source": [
        "# execute 1 circuit with Sampler\n",
        "job = sampler.run([circuit])\n",
        "pub_result = job.result()[0]\n",
        "print(f\" > Result class: {type(pub_result)}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ee6d88f3-0115-4ea9-a2c5-633906841d9f",
      "metadata": {},
      "source": [
        "프리미티브는 여러 개의 PUB를 입력으로 받아들이고, 각각 PUB 자체의 결과를 가져옵니다. 따라서 다양한 매개변수/관찰 가능한 조합으로 여러 회로를 실행하고 PUB 결과를 검색할 수 있습니다:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "id": "fb91dbfc-0340-4ea6-8d33-95357d7907e3",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Result class: <class 'qiskit.primitives.containers.sampler_pub_result.SamplerPubResult'>\n"
          ]
        }
      ],
      "source": [
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "\n",
        "# create two circuits\n",
        "circuit1 = circuit.copy()\n",
        "circuit2 = circuit.copy()\n",
        "\n",
        "# transpile circuits\n",
        "pm = generate_preset_pass_manager(optimization_level=1)\n",
        "isa_circuit1 = pm.run(circuit1)\n",
        "isa_circuit2 = pm.run(circuit2)\n",
        "# execute 2 circuits using Sampler\n",
        "job = sampler.run([(isa_circuit1), (isa_circuit2)])\n",
        "pub_result_1 = job.result()[0]\n",
        "pub_result_2 = job.result()[1]\n",
        "print(f\" > Result class: {type(pub_result)}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6e7b2199-3c00-477a-a248-824b442431b5",
      "metadata": {},
      "source": [
        "<span id=\"get-the-probability-distribution-or-measurement-outcome\" />\n",
        "\n",
        "### 확률 분포 또는 측정 결과를 얻다\n",
        "\n",
        "측정 결과 샘플은 **비트 문자열** 또는 **카운트로** 반환됩니다. 비트스트링은 측정 결과를 보여주며, 측정된 샷 순서를 유지합니다. 샘플러 결과 오브젝트는 동적 회로와의 호환성을 위해 입력 회로의 클래식 레지스터 이름을 기준으로 데이터를 구성합니다.\n",
        "\n",
        "<Admonition>\n",
        "  클래식 레지스터의 기본 이름은 `\"meas\"` 입니다. 이 이름은 나중에 측정 비트스트링에 액세스할 때 사용됩니다.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 11,
      "id": "1dc395b4-5716-44be-9622-7c99df95616b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "        ┌───┐      ░ ┌─┐   \n",
              "   q_0: ┤ H ├──■───░─┤M├───\n",
              "        └───┘┌─┴─┐ ░ └╥┘┌─┐\n",
              "   q_1: ─────┤ X ├─░──╫─┤M├\n",
              "             └───┘ ░  ║ └╥┘\n",
              "meas: 2/══════════════╩══╩═\n",
              "                      0  1 "
            ]
          },
          "execution_count": 11,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Define quantum circuit with 2 qubits\n",
        "circuit = QuantumCircuit(2)\n",
        "circuit.h(0)\n",
        "circuit.cx(0, 1)\n",
        "circuit.measure_all()\n",
        "circuit.draw()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 12,
      "id": "27a2847b-6553-4c73-9b8a-85ba28725ed8",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "The number of bitstrings is: 1024\n",
            "The counts are: {'11': 537, '00': 487}\n"
          ]
        }
      ],
      "source": [
        "# Transpile circuit\n",
        "pm = generate_preset_pass_manager(optimization_level=1)\n",
        "isa_circuit = pm.run(circuit)\n",
        "# Run using Sampler\n",
        "result = sampler.run([circuit]).result()\n",
        "# Access result data for PUB 0\n",
        "data_pub = result[0].data\n",
        "# Access bitstring for the classical register \"meas\"\n",
        "bitstrings = data_pub.meas.get_bitstrings()\n",
        "print(f\"The number of bitstrings is: {len(bitstrings)}\")\n",
        "# Get counts for the classical register \"meas\"\n",
        "counts = data_pub.meas.get_counts()\n",
        "print(f\"The counts are: {counts}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "de705fab-e718-4924-a03f-f19bdf6578d8",
      "metadata": {},
      "source": [
        "<span id=\"change-run-options\" />\n",
        "\n",
        "### 실행 옵션 변경\n",
        "\n",
        "기본적으로 레퍼런스 샘플러는 정확한 상태 벡터 계산을 수행합니다 [`quantum_info.Statevector`](../api/qiskit/qiskit.quantum_info.Statevector) 클래스를 기반으로 정확한 상태벡터 계산을 수행합니다.\n",
        "그러나 샘플링 오버헤드(\"샷 노이즈\"라고도 함)의 효과를 도입하기 위해 이를 수정할 수 있습니다. 이 오버헤드를 관리하기 위해 샘플러 인터페이스는 PUB 수준에서 정의할 수 있는 `shots` 인수를 허용합니다.\n",
        "\n",
        "이 예에서는 두 개의 회로를 정의했다고 가정합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 13,
      "id": "927faaab-60c0-4b73-bf53-72f7c4c9ad65",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<qiskit.primitives.primitive_job.PrimitiveJob at 0x7f2cb0255950>"
            ]
          },
          "execution_count": 13,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Sample two circuits at 128 shots each.\n",
        "sampler.run([isa_circuit1, isa_circuit2], shots=128)\n",
        "# Sample two circuits at different amounts of shots. The \"None\"s are necessary\n",
        "# as placeholders\n",
        "# for the lack of parameter values in this example.\n",
        "sampler.run([(isa_circuit1, None, 123), (isa_circuit2, None, 456)])"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "1c0e76fe-4b5d-4fd4-9eec-da5332d76cfb",
      "metadata": {},
      "source": [
        "전체 예제는 [샘플러 예제](/docs/guides/sampler-examples) 페이지를 참조하십시오.\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * 더 큰 회로를 처리할 수 있는 고성능 시뮬레이션이나 노이즈 모델을 시뮬레이션에 통합하려면 [키스킷 에어 프리미티브를 사용한 정확하고 노이즈가](simulate-with-qiskit-aer) 많은 시뮬레이션을 참조하세요.\n",
        "  * 퀀텀 컴포저를 시뮬레이션에 사용하는 방법을 알아보려면 [IBM 퀀텀 컴포저](/docs/guides/composer) 가이드를 참조하세요.\n",
        "  * [키스킷 추정기 API](/docs/api/qiskit/1.4/qiskit.primitives.Estimator) 레퍼런스를 읽어보세요.\n",
        "  * [키스킷 샘플러 API](/docs/api/qiskit/1.4/qiskit.primitives.Sampler) 레퍼런스를 읽어보세요.\n",
        "</Admonition>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}