{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "1f7fe7f1-988f-461f-8222-f291404b912a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Qiskit SDK 에서의 비트 순서 지정\"\n",
        "description: \"Qiskit SDK 의 주문 규칙과 그 선택 이유를 알아보세요\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore leftrightarrow */}\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "49fb8eee-d17a-4648-8b6f-52097acfb305",
      "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": "369b8b49-a2af-4999-85df-f7659022e11b",
      "metadata": {},
      "source": [
        "<span id=\"bit-ordering-in-the-qiskit-sdk\" />\n",
        "\n",
        "# Qiskit SDK 에서의 비트 순서 지정\n",
        "\n",
        "$n$ 비트(또는 큐비트) 세트가 있는 경우 일반적으로 각 비트에 $0 \\rightarrow n-1$ 이라는 레이블을 붙입니다. 소프트웨어와 리소스마다 컴퓨터 메모리와 화면에 표시할 때 이러한 비트를 컴퓨터 메모리와 화면에 표시하는 방법을 선택해야 합니다.\n",
        "\n",
        "<span id=\"qiskit-conventions\" />\n",
        "\n",
        "## Qiskit 관례\n",
        "\n",
        "다음은 다양한 시나리오에서 키스킷 SDK가 비트를 주문하는 방식입니다.\n",
        "\n",
        "<span id=\"quantum-circuits\" />\n",
        "\n",
        "### 양자 회로\n",
        "\n",
        "`QuantumCircuit` 클래스는 큐비트를 목록에 저장합니다 (`QuantumCircuit.qubits`). 이 목록에 있는 큐비트의 인덱스는 큐비트의 레이블을 정의합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "a1c61ed7-72df-447e-a103-ce0e273626c9",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Qubit register=(2, \"q\"), index=0>"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit, QuantumRegister\n",
        "from qiskit.circuit import Qubit\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.qubits[0]  # qubit \"0\"\n",
        "\n",
        "Qubit(QuantumRegister(2, \"q\"), 0)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "22c49977-e960-4620-ae1d-a7a90a879b45",
      "metadata": {},
      "source": [
        "<span id=\"circuit-diagrams\" />\n",
        "\n",
        "### 회로도\n",
        "\n",
        "회로도에서 큐비트 $0$ 는 가장 위에 있는 큐비트이고, 큐비트 $n-1$ 는 가장 아래쪽 큐비트입니다. `reverse_bits` 인수를 사용하여 이를 변경할 수 있습니다 `QuantumCircuit.draw` ( [키스킷의 키스킷](#change-ordering-in-qiskit) ).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "a4e175af-8882-427a-a276-bd51a3d9be57",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "          \n",
              "q_0: ─────\n",
              "     ┌───┐\n",
              "q_1: ┤ X ├\n",
              "     └───┘"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc.x(1)\n",
        "qc.draw()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "19aa0892-a578-49e3-98df-14c696d01896",
      "metadata": {},
      "source": [
        "<span id=\"integers\" />\n",
        "\n",
        "### 정수\n",
        "\n",
        "비트를 숫자로 해석할 때 $0$ 비트는 최하위 비트, 그리고 비트 $n-1$ 가 가장 중요합니다. 이는 코딩할 때 유용합니다. 각 비트에는 다음과 같은 값이 있기 때문입니다 값 $2^\\text{label}$ (레이블은 큐비트의 인덱스인 `QuantumCircuit.qubits`). 예를 들어, 다음 회로 실행은 다음과 같이 끝납니다 비트 $0$ 는 `0`, 비트 $1$ 는 `1` 로 끝납니다. 이것은 다음과 같이 해석됩니다 십진수 `2` (확률로 측정 `1.0`).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "7ecb86d3-fe3a-43b0-9293-cba967e80fdc",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            " > Counts: {'10': 1024}\n"
          ]
        }
      ],
      "source": [
        "from qiskit.primitives import StatevectorSampler as Sampler\n",
        "\n",
        "qc.measure_all()\n",
        "\n",
        "job = Sampler().run([qc])\n",
        "result = job.result()\n",
        "print(f\" > Counts: {result[0].data.meas.get_counts()}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "e263f4f9-f383-4583-bdd4-f8792d6809db",
      "metadata": {},
      "source": [
        "<span id=\"strings\" />\n",
        "\n",
        "### 문자열\n",
        "\n",
        "비트(또는 큐비트) 목록을 문자열로 표시하거나 해석할 때 bit $n-1$ 비트는 가장 왼쪽 비트이고 $0$ 비트는 가장 오른쪽 비트입니다. 그 이유는 다음과 같습니다 는 일반적으로 가장 중요한 숫자가 왼쪽에 있는 숫자를 쓰기 때문에 키스킷에서는 $n-1$ 비트가 가장 중요한 비트로 해석됩니다.\n",
        "\n",
        "예를 들어, 다음 셀은 단일 큐비트 상태 문자열의 단일 큐비트 상태 문자열로 정의합니다. 이 경우, 쿼비트 $0$ 는 상태 $|+\\rangle$, 그리고 qubit $1$ 상태 $|0\\rangle$.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "2cffb8d4-66db-4c1c-b0c2-b796ed6e8ce0",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{np.str_('00'): np.float64(0.4999999999999999),\n",
              " np.str_('01'): np.float64(0.4999999999999999)}"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import Statevector\n",
        "\n",
        "sv = Statevector.from_label(\"0+\")\n",
        "sv.probabilities_dict()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "86c48e21-9138-4dec-a312-0b5deefd0e35",
      "metadata": {},
      "source": [
        "이것은 때때로 비트 문자열을 해석할 때 혼란을 야기합니다 는 가장 왼쪽 비트가 비트 $0$ 라고 예상할 수 있지만, 일반적으로는 비트 $n-1$.\n",
        "\n",
        "<span id=\"statevector-matrices\" />\n",
        "\n",
        "### 상태벡터 행렬\n",
        "\n",
        "상태 벡터를 복소수(진폭)의 목록으로 나타낼 때, 키스킷은 이러한 진폭을 정렬하여 인덱스 $x$ 의 진폭이 계산 기준 상태 $|x\\rangle$ 를 나타냅니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "d6ff798a-6bdc-4727-8331-b575fbf1e083",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "(0.7071067811865475+0j)\n",
            "0j\n"
          ]
        }
      ],
      "source": [
        "print(sv[1])  # amplitude of state |01>\n",
        "print(sv[2])  # amplitude of state |10>"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cc92b428-80c7-4530-bebc-3486aecee5f2",
      "metadata": {},
      "source": [
        "<span id=\"gates\" />\n",
        "\n",
        "### 게이츠\n",
        "\n",
        "키스킷의 각 게이트는 고유한 방식으로 큐비트 목록을 해석할 수 있습니다 제어 게이트는 일반적으로 `(control, target)` 규칙을 따릅니다.\n",
        "\n",
        "예를 들어, 다음 셀은 제어-X 게이트를 추가하며, 여기서 쿼비트 $0$ 는 가 제어이고 쿼비트 $1$ 가 타깃입니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "id": "f2e34794-2f04-4065-9a1d-9aff022204db",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "          \n",
              "q_0: ──■──\n",
              "     ┌─┴─┐\n",
              "q_1: ┤ X ├\n",
              "     └───┘"
            ]
          },
          "execution_count": 6,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.cx(0, 1)\n",
        "qc.draw()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2b9ee336-e645-41ee-aeda-5f9dfe3a3f88",
      "metadata": {},
      "source": [
        "앞서 언급한 키스킷의 모든 규칙에 따라, 이 CX 게이트는 는 $|01\\rangle \\leftrightarrow |11\\rangle$ 변환을 수행하며, 따라서 매트릭스를 갖습니다.\n",
        "\n",
        "$$\n",
        "\\begin{pmatrix}\n",
        " 1 & 0 & 0 & 0 \\\\\n",
        " 0 & 0 & 0 & 1 \\\\\n",
        " 0 & 0 & 1 & 0 \\\\\n",
        " 0 & 1 & 0 & 0 \\\\\n",
        "\\end{pmatrix}\n",
        "$$\n",
        "\n",
        "<span id=\"change-ordering-in-qiskit\" />\n",
        "\n",
        "## Qiskit에서 순서 변경\n",
        "\n",
        "큐비트가 역순으로 있는 회로를 그리려면(즉, 아래쪽에 있는 큐비트 $0$ ) 아래)를 그리려면 `reverse_bits` 인수를 사용합니다. 이것은 생성된 다이어그램에만 영향을 미치며 다이어그램에만 영향을 미치며 회로에는 영향을 미치지 않습니다. X-게이트는 여전히 큐비트 $0$ 에서 작동합니다.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "id": "6d31e88d-2a4f-4404-8177-7bccd0c19d4b",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "          \n",
              "q_1: ─────\n",
              "     ┌───┐\n",
              "q_0: ┤ X ├\n",
              "     └───┘"
            ]
          },
          "execution_count": 7,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit import QuantumCircuit\n",
        "\n",
        "qc = QuantumCircuit(2)\n",
        "qc.x(0)\n",
        "qc.draw(reverse_bits=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "4e343e80-3f77-4fe7-8942-afbe71f756ab",
      "metadata": {},
      "source": [
        "`reverse_bits` 메서드를 사용하면 큐비트의 큐비트의 레이블이 반전된 새 회로를 반환합니다(원래 회로는 변경되지 않습니다).\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "id": "4c6a38b7-f6a1-4753-94e6-2c488ec37b8d",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "          \n",
              "q_0: ─────\n",
              "     ┌───┐\n",
              "q_1: ┤ X ├\n",
              "     └───┘"
            ]
          },
          "execution_count": 8,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "qc.reverse_bits().draw()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "da750e37-2624-4797-82c0-560ee7d5367d",
      "metadata": {},
      "source": [
        "이 새로운 회로에서 X-게이트는 큐비트 $1$ 에서 작동합니다.\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## 다음 단계\n",
        "\n",
        "<Admonition type=\"tip\" title=\"권장사항\">\n",
        "  * [Grover의 알고리즘](/docs/tutorials/grovers-algorithm) 튜토리얼에서 회로 사용 예시를 참조하세요.\n",
        "  * [QuantumCircuit API](/docs/api/qiskit/qiskit.circuit.QuantumCircuit#quantumcircuit-class) 참조를 살펴보세요.\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
}