{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "4a4b88ed-d21f-4056-9264-0ee8c8ec4b39",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Simulação exata e ruidosa com primitivas Qiskit Aer\"\n",
        "description: \"Aprenda a fazer simulações exatas e ruidosas de programas quânticos com primitivas Qiskit Aer\"\n",
        "---\n",
        "\n",
        "<span id=\"exact-and-noisy-simulation-with-qiskit-aer-primitives\" />\n",
        "\n",
        "# Simulação exata e ruidosa com primitivas Qiskit Aer\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "678b9055-9164-417c-9897-9fde615b97ae",
      "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=\"Versões do pacote\">\n",
        "    O código desta página foi desenvolvido usando os seguintes requisitos.\n",
        "    Recomendamos o uso dessas versões ou de versões mais recentes.\n",
        "\n",
        "    ```\n",
        "    qiskit[all]~=2.5.0\n",
        "    qiskit-aer~=0.17\n",
        "    ```\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6a0ae8b1-b413-44ac-9267-fd36345a02df",
      "metadata": {},
      "source": [
        "[A simulação exata com Qiskit primitives](/docs/guides/simulate-with-qiskit-sdk-primitives) demonstra como usar as primitivas de referência incluídas no Qiskit para realizar a simulação exata de circuitos quânticos. Os processadores quânticos existentes atualmente sofrem com erros ou ruídos, portanto, os resultados de uma simulação exata não refletem necessariamente os resultados que você esperaria ao executar circuitos em um hardware real. Embora as primitivas de referência no Qiskit não ofereçam suporte à modelagem de ruído, [o Qiskit Aer](https://qiskit.org/ecosystem/aer/) inclui implementações das primitivas que oferecem suporte à modelagem de ruído. O Qiskit Aer é um simulador de circuito quântico de alto desempenho que você pode usar no lugar das primitivas de referência para obter melhor desempenho e mais recursos. Ele faz parte do [ecossistema Qiskit](https://qiskit.github.io/ecosystem/). Neste artigo, demonstramos o uso das primitivas do Qiskit Aer para simulação exata e com ruído.\n",
        "\n",
        "<Admonition type=\"note\" title=\"Notas\">\n",
        "  * `qiskit-aer` v0.14 ou posterior é necessário.\n",
        "  * Embora as primitivas do Qiskit Aer implementem as interfaces primitivas, elas não oferecem as mesmas opções que as primitivas do Qiskit Runtime. O nível de resiliência, por exemplo, não está disponível com as primitivas do Qiskit Aer.\n",
        "  * Consulte a [documentação do site AerSimulator](https://qiskit.github.io/qiskit-aer/stubs/qiskit_aer.AerSimulator) para obter detalhes sobre as opções de método de simulação suportadas pelo Aer.\n",
        "</Admonition>\n",
        "\n",
        "Para explorar a simulação exata e com ruído, crie um circuito de exemplo com oito qubits:\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "id": "df70b5fd-971d-4e7d-a23a-8df037c0fa47",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "<Image src=\"/docs/images/guides/simulate-with-qiskit-aer/extracted-outputs/df70b5fd-971d-4e7d-a23a-8df037c0fa47-0.svg\" alt=\"Output of the previous code cell\" />"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.circuit.library import efficient_su2\n",
        "\n",
        "n_qubits = 8\n",
        "circuit = efficient_su2(n_qubits)\n",
        "circuit.draw(\"mpl\")"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "2074eaf0-746e-4a36-91d9-db9228f96a0d",
      "metadata": {},
      "source": [
        "Esse circuito contém parâmetros para representar os ângulos de rotação das portas $R_y$ e $R_z$. Ao simular esse circuito, precisamos especificar valores explícitos para esses parâmetros. Na próxima célula, especificamos alguns valores para esses parâmetros e usamos a primitiva Estimator do Qiskit Aer para calcular o valor exato da expectativa do observável $ZZ \\cdots Z$.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "id": "40270ca7-1084-4329-aac5-28c87edc3791",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.8870140234256602"
            ]
          },
          "execution_count": 2,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit.quantum_info import SparsePauliOp\n",
        "from qiskit.transpiler import generate_preset_pass_manager\n",
        "from qiskit_aer import AerSimulator\n",
        "from qiskit_aer.primitives import EstimatorV2 as Estimator\n",
        "\n",
        "observable = SparsePauliOp(\"Z\" * n_qubits)\n",
        "params = [0.1] * circuit.num_parameters\n",
        "\n",
        "exact_estimator = Estimator()\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(3, AerSimulator())\n",
        "isa_circuit = pass_manager.run(circuit)\n",
        "pub = (isa_circuit, observable, params)\n",
        "job = exact_estimator.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "exact_value = float(pub_result.data.evs)\n",
        "exact_value"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "134d97a2-8420-4931-85b4-324679655e24",
      "metadata": {},
      "source": [
        "Agora, vamos inicializar um modelo de ruído que inclua um erro de despolarização de 2% em cada porta CX. Na prática, os erros decorrentes das portas de dois qubits — que, neste caso, são portas CX — constituem a principal fonte de erros durante a execução de um circuito. Consulte [“Criação de modelos de ruído”](/docs/guides/build-noise-models) para obter uma visão geral sobre como construir modelos de ruído no Qiskit Aer.\n",
        "\n",
        "Na próxima célula, construímos um Estimador que incorpora esse modelo de ruído e o usamos para calcular o valor esperado do observável.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "id": "82b2f19a-ba10-46a2-ba1b-89cd27bc0e63",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.7247404214143528"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_aer.noise import NoiseModel, depolarizing_error\n",
        "\n",
        "noise_model = NoiseModel()\n",
        "cx_depolarizing_prob = 0.02\n",
        "noise_model.add_all_qubit_quantum_error(\n",
        "    depolarizing_error(cx_depolarizing_prob, 2), [\"cx\"]\n",
        ")\n",
        "\n",
        "noisy_estimator = Estimator(\n",
        "    options=dict(backend_options=dict(noise_model=noise_model))\n",
        ")\n",
        "job = noisy_estimator.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "noisy_value = float(pub_result.data.evs)\n",
        "noisy_value"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "6495f179-3fe6-4971-b023-700b8b2c8cbb",
      "metadata": {},
      "source": [
        "Como você pode ver, o valor esperado na presença do ruído está muito longe do valor correto. Na prática, você pode empregar várias técnicas de atenuação de erros para combater os efeitos do ruído, mas uma discussão sobre essas técnicas está fora do escopo deste artigo.\n",
        "\n",
        "Para ter uma noção aproximada de como o ruído afeta o resultado final, considere nosso modelo de ruído, que adiciona um erro de despolarização de 2% a cada porta CX. O erro de despolarização com probabilidade $p$ é definido como um canal quântico $E$ que tem a seguinte ação em uma matriz de densidade $\\rho$ :\n",
        "\n",
        "$$\n",
        "E(\\rho) = (1 - p) \\rho + p\\frac{I}{2^n}\n",
        "$$\n",
        "\n",
        "em que $n$ é o número de qubits, neste caso, 2. Ou seja, com probabilidade $p$, o estado é substituído pelo estado completamente misto, e o estado é preservado com probabilidade $1 - p$. Após $m$ aplicações do canal despolarizante, a probabilidade de o estado ser preservado seria $(1 - p)^m$. Portanto, esperamos que a probabilidade de manter o estado correto no final da simulação diminua exponencialmente com o número de portas CX em nosso circuito.\n",
        "\n",
        "Vamos contar o número de portas CX em nosso circuito e calcular $(1 - p)^m$. Chamamos `count_ops` para obter um dicionário que mapeia nomes de portas para contagens e recuperamos a entrada para a porta CX.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "id": "3c20f7bc-203a-4f40-bb84-7cf3d231d66e",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "0.6542558123199923"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "cx_count = circuit.count_ops()[\"cx\"]\n",
        "(1 - cx_depolarizing_prob) ** cx_count"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "ef506e15-7480-46ba-bce7-aa8f2fa78377",
      "metadata": {},
      "source": [
        "Esse valor, 65%, fornece uma estimativa aproximada da probabilidade de que nosso estado final esteja correto. É uma estimativa conservadora porque não leva em conta o estado inicial da simulação.\n",
        "\n",
        "A célula de código a seguir mostra como usar a primitiva Sampler do Qiskit Aer para fazer a amostragem do circuito com ruído. Precisamos adicionar medições ao circuito antes de executá-lo com o primitivo Sampler.\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "id": "76c43aee-d559-4e5b-8228-e5bba3b4499c",
      "metadata": {},
      "outputs": [
        {
          "data": {
            "text/plain": [
              "{'00000011': 2,\n",
              " '00000000': 68,\n",
              " '00001100': 2,\n",
              " '00000101': 2,\n",
              " '01010000': 1,\n",
              " '00000010': 2,\n",
              " '01101010': 1,\n",
              " '10100000': 1,\n",
              " '00110000': 1,\n",
              " '11100000': 1,\n",
              " '00011110': 1,\n",
              " '10000000': 8,\n",
              " '00000001': 1,\n",
              " '11000000': 1,\n",
              " '01000011': 1,\n",
              " '00001010': 2,\n",
              " '00010000': 1,\n",
              " '01000000': 1,\n",
              " '00000110': 1,\n",
              " '11001010': 1,\n",
              " '00000111': 1}"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "from qiskit_aer.primitives import SamplerV2 as Sampler\n",
        "\n",
        "measured_circuit = circuit.copy()\n",
        "measured_circuit.measure_all()\n",
        "\n",
        "noisy_sampler = Sampler(\n",
        "    options=dict(backend_options=dict(noise_model=noise_model))\n",
        ")\n",
        "# The circuit needs to be transpiled to the AerSimulator target\n",
        "pass_manager = generate_preset_pass_manager(3, AerSimulator())\n",
        "isa_circuit = pass_manager.run(measured_circuit)\n",
        "pub = (isa_circuit, params, 100)\n",
        "job = noisy_sampler.run([pub])\n",
        "result = job.result()\n",
        "pub_result = result[0]\n",
        "pub_result.data.meas.get_counts()"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "46a8c6b7-3f7c-48e4-9b73-b04a5458ba33",
      "metadata": {},
      "source": [
        "<span id=\"next-steps\" />\n",
        "\n",
        "## Próximas etapas\n",
        "\n",
        "<Admonition type=\"tip\" title=\"Recomendações\">\n",
        "  * Para simular circuitos pequenos e simples, consulte [Simulação exata com Qiskit primitives](/docs/guides/simulate-with-qiskit-sdk-primitives).\n",
        "  * Examine a documentação [do Qiskit Aer](https://qiskit.github.io/qiskit-aer/).\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
}