{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "1f7fe7f1-988f-461f-8222-f291404b912a",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Ordenación de bits en el sistema de ordenación de bits ( Qiskit SDK )\"\n",
        "description: \"Conozca las convenciones de pedidos de Qiskit SDK y por qué las hemos elegido\"\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=\"Versiones del paquete\">\n",
        "    El código de esta página se ha desarrollado teniendo en cuenta los siguientes requisitos.\n",
        "    Recomendamos utilizar estas versiones o versiones más recientes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\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",
        "# Ordenación de bits en el sistema de ordenación de bits ( Qiskit SDK )\n",
        "\n",
        "Si tienes un conjunto de $n$ bits (o qubits), normalmente etiquetarás cada bit $0 \\rightarrow n-1$. Los distintos programas y recursos deben elegir cómo ordenan estos bits tanto en la memoria del ordenador como en la pantalla.\n",
        "\n",
        "<span id=\"qiskit-conventions\" />\n",
        "\n",
        "## Convenciones de Qiskit\n",
        "\n",
        "Así es como el SDK de Qiskit ordena los bits en diferentes escenarios.\n",
        "\n",
        "<span id=\"quantum-circuits\" />\n",
        "\n",
        "### Circuitos cuánticos\n",
        "\n",
        "La clase `QuantumCircuit` almacena sus qubits en una lista (`QuantumCircuit.qubits`). El índice de un qubit en esta lista define la etiqueta del qubit etiqueta del qubit.\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",
        "### Diagramas de circuitos\n",
        "\n",
        "En un diagrama de circuito, el qubit $0$ es el qubit superior, y el qubit $n-1$ el qubit qubit inferior. Puede cambiar esto con el argumento `reverse_bits` de `QuantumCircuit.draw` (ver [Cambiar el orden en Qiskit](#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",
        "### Enteros\n",
        "\n",
        "Al interpretar los bits como un número, el bit $0$ es el menos significativo, y el bit $n-1$ el más significativo. Esto es útil a la hora de codificar porque cada bit tiene el valor $2^\\text{label}$ (la etiqueta es el índice del qubit en `QuantumCircuit.qubits`). Por ejemplo, la siguiente ejecución del circuito termina con el bit $0$ siendo `0`, y el bit $1$ siendo `1`. Esto se interpreta como el entero decimal `2` (medido con probabilidad `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",
        "### Series\n",
        "\n",
        "Al mostrar o interpretar una lista de bits (o qubits) como una cadena, el bit $n-1$ es el bit situado más a la izquierda y el bit $0$ es el situado más a la derecha. Esto se debe a que normalmente escribimos los números con el dígito más significativo a la izquierda, y en Qiskit, el bit $n-1$ se interpreta como el bit más significativo.\n",
        "\n",
        "Por ejemplo, la siguiente celda define un `Statevector` a partir de una cadena de estados single-qubit. En este caso, el qubit $0$ está en el estado $|+\\rangle$, y qubit $1$ en el estado $|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": [
        "En ocasiones, esto provoca confusión al interpretar una cadena de bits, ya que podría esperarse que el bit situado más a la izquierda fuera el bit $0$, mientras que normalmente representa el bit $n-1$.\n",
        "\n",
        "<span id=\"statevector-matrices\" />\n",
        "\n",
        "### Matrices de vectores de estado\n",
        "\n",
        "Al representar un vector de estado como una lista de números complejos (amplitudes), Qiskit ordena estas amplitudes de tal manera que la amplitud en el índice $x$ representa el estado base computacional $|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",
        "### Puertas\n",
        "\n",
        "Cada puerta en Qiskit puede interpretar una lista de qubits de su propia manera, pero puertas controladas suelen seguir la convención `(control, target)`.\n",
        "\n",
        "Por ejemplo, la siguiente celda añade una puerta X controlada donde el qubit $0$ es el control y el qubit $1$ es el objetivo.\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": [
        "Siguiendo todas las convenciones mencionadas anteriormente en Qiskit, este CX-gate realiza la transformación $|01\\rangle \\leftrightarrow |11\\rangle$, por lo que tiene la siguiente matriz.\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",
        "## Cambiar el orden en Qiskit\n",
        "\n",
        "Para dibujar un circuito con qubits en orden inverso (es decir, qubit $0$ al abajo), utilice el argumento `reverse_bits` . Esto sólo afecta al diagrama generado y no afecta al circuito; la compuerta X sigue actuando sobre el qubit $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": [
        "Puedes utilizar el método `reverse_bits` para devolver un nuevo circuito con las etiquetas de los qubits invertidas (esto no muta el circuito original).\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": [
        "Obsérvese que en este nuevo circuito, la compuerta X actúa sobre el qubit $1$.\n",
        "\n",
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximos pasos\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendaciones\">\n",
        "  * Ver un ejemplo de uso de circuitos en el tutorial [del Algoritmo de Grover](/docs/tutorials/grovers-algorithm).\n",
        "  * Explore la referencia de [la API QuantumCircuit](/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
}