{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "ea0aea87",
      "metadata": {},
      "source": [
        "---\n",
        "title: \"Algoritmo de Shor\"\n",
        "description: \"Um curso gratuito sobre informação e computação quântica ministrado por IBM\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore textrm operatorname */}\n",
        "\n",
        "{/* cspell:ignore mapsto */}\n",
        "\n",
        "<span id=\"shors-algorithm\" />\n",
        "\n",
        "# Algoritmo de Shor\n",
        "\n",
        "Agora, voltaremos nossa atenção para o problema de fatoração de números inteiros e veremos como ele pode ser resolvido de forma eficiente em um computador quântico usando a estimativa de fase.\n",
        "O algoritmo que obteremos é *o algoritmo de Shor para fatoração de números inteiros*.\n",
        "Shor não descreveu seu algoritmo especificamente em termos de estimativa de fase, mas essa é uma maneira natural e intuitiva de explicar como ele funciona.\n",
        "\n",
        "Começaremos discutindo um problema intermediário conhecido como *problema de determinação de ordem* e veremos como a estimativa de fase fornece uma solução para esse problema.\n",
        "Em seguida, veremos como uma solução eficiente para o problema de determinação de ordem nos dá uma solução eficiente para o problema de fatoração de números inteiros.\n",
        "(Quando uma solução para um problema fornece uma solução para outro problema como esse, dizemos que o segundo problema *se reduz* ao primeiro - portanto, nesse caso, estamos reduzindo a fatoração de números inteiros à determinação de ordens)\n",
        "Essa segunda parte do algoritmo de Shor não faz uso da computação quântica; é totalmente clássica.\n",
        "A computação quântica é necessária apenas para solucionar a determinação de ordens.\n",
        "\n",
        "<span id=\"the-order-finding-problem\" />\n",
        "\n",
        "## O problema da localização de pedidos\n",
        "\n",
        "<span id=\"some-basic-number-theory\" />\n",
        "\n",
        "### Algumas noções básicas de teoria dos números\n",
        "\n",
        "Para explicar o problema de determinação de ordem e como ele pode ser resolvido usando a estimativa de fase, será útil começar com alguns conceitos básicos da teoria dos números e introduzir algumas notações úteis ao longo do caminho.\n",
        "\n",
        "Para começar, para qualquer número inteiro positivo $N,$, defina o conjunto $\\mathbb{Z}_N$ da seguinte forma.\n",
        "\n",
        "$$\n",
        "\\mathbb{Z}_N = \\{0,1,\\ldots,N-1\\}\n",
        "$$\n",
        "\n",
        "Por exemplo, $\\mathbb{Z}_1 = \\{0\\},\\;$ $\\mathbb{Z}_2 = \\{0,1\\},\\;$ $\\mathbb{Z}_3 = \\{0,1,2\\},\\;$ e assim por diante.\n",
        "\n",
        "Esses são conjuntos de números, mas podemos pensar neles como algo mais do que conjuntos.\n",
        "Em particular, podemos pensar em *operações aritméticas* em $\\mathbb{Z}_N$, como adição e multiplicação - e se concordarmos em sempre considerar nossas respostas no módulo $N$ (ou seja, dividir por $N$ e tomar o restante como resultado), sempre estaremos dentro desse conjunto quando realizarmos essas operações.\n",
        "As duas operações específicas de adição e multiplicação, ambas tomadas no módulo $N,$, transformam o $\\mathbb{Z}_N$ em um *anel*, que é um tipo de objeto fundamentalmente importante na álgebra.\n",
        "\n",
        "Por exemplo, $3$ e $5$ são elementos de $\\mathbb{Z}_7,$ e, se os multiplicarmos, obteremos $3\\cdot 5 = 15,$, que deixa um resto de $1$ quando dividido por $7.$ Às vezes, expressamos isso da seguinte forma.\n",
        "\n",
        "$$\n",
        "3 \\cdot 5 \\equiv 1 \\; (\\textrm{mod } 7)\n",
        "$$\n",
        "\n",
        "Mas também podemos simplesmente escrever $3 \\cdot 5 = 1,$, desde que fique claro que estamos trabalhando em $\\mathbb{Z}_7,$, apenas para manter nossa notação o mais simples possível.\n",
        "\n",
        "Como exemplo, aqui estão as tabelas de adição e multiplicação para $\\mathbb{Z}_6.$\n",
        "\n",
        "$$\n",
        "\\begin{array}{c|cccccc}\n",
        "    + & 0 & 1 & 2 & 3 & 4 & 5 \\\\\\hline\n",
        "    0 & 0 & 1 & 2 & 3 & 4 & 5 \\\\\n",
        "    1 & 1 & 2 & 3 & 4 & 5 & 0 \\\\\n",
        "    2 & 2 & 3 & 4 & 5 & 0 & 1 \\\\\n",
        "    3 & 3 & 4 & 5 & 0 & 1 & 2 \\\\\n",
        "    4 & 4 & 5 & 0 & 1 & 2 & 3 \\\\\n",
        "    5 & 5 & 0 & 1 & 2 & 3 & 4 \\\\\n",
        "\\end{array}\n",
        "\\qquad\n",
        "\\begin{array}{c|cccccc}\n",
        "\\cdot & 0 & 1 & 2 & 3 & 4 & 5 \\\\\\hline\n",
        "    0 & 0 & 0 & 0 & 0 & 0 & 0 \\\\\n",
        "    1 & 0 & 1 & 2 & 3 & 4 & 5 \\\\\n",
        "    2 & 0 & 2 & 4 & 0 & 2 & 4 \\\\\n",
        "    3 & 0 & 3 & 0 & 3 & 0 & 3 \\\\\n",
        "    4 & 0 & 4 & 2 & 0 & 4 & 2 \\\\\n",
        "    5 & 0 & 5 & 4 & 3 & 2 & 1 \\\\\n",
        "\\end{array}\n",
        "$$\n",
        "\n",
        "Entre os elementos $N$ de $\\mathbb{Z}_N,$, os elementos $a\\in\\mathbb{Z}_N$ que satisfazem $\\gcd(a,N) = 1$ são especiais.\n",
        "Frequentemente, o conjunto que contém esses elementos é denotado por uma estrela, como a seguir.\n",
        "\n",
        "$$\n",
        "\\mathbb{Z}_N^{\\ast} = \\{a\\in \\mathbb{Z}_N : \\gcd(a,N) = 1\\}\n",
        "$$\n",
        "\n",
        "Se concentrarmos nossa atenção na operação de multiplicação, o conjunto $\\mathbb{Z}_N^{\\ast}$ forma um *grupo* - especificamente um *grupo abeliano* - que é outro tipo importante de objeto na álgebra.\n",
        "É um fato básico sobre esses conjuntos (e grupos finitos em geral) que, se escolhermos qualquer elemento $a\\in\\mathbb{Z}_N^{\\ast}$ e multiplicarmos repetidamente $a$ por ele mesmo, sempre obteremos o número $1.$\n",
        "\n",
        "Para um primeiro exemplo, vamos pegar $N=6.$ Temos que $5\\in\\mathbb{Z}_6^{\\ast}$ porque $\\gcd(5,6) = 1,$ e se multiplicarmos $5$ por ele mesmo, obteremos $1,$ como confirma a tabela acima.\n",
        "\n",
        "$$\n",
        "5^2 = 1 \\quad \\text{(working within $\\mathbb{Z}_6$)}\n",
        "$$\n",
        "\n",
        "Como segundo exemplo, vejamos $N = 21.$ Se analisarmos os números de $0$ a $20,$, os que têm GCD igual a $1$ com $21$ são os seguintes.\n",
        "\n",
        "$$\n",
        "\\mathbb{Z}_{21}^{\\ast} = \\{1,2,4,5,8,10,11,13,16,17,19,20\\}\n",
        "$$\n",
        "\n",
        "Para cada um desses elementos, é possível elevar esse número a uma potência inteira positiva para obter $1.$ Aqui estão as menores potências para as quais isso funciona:\n",
        "\n",
        "$$\n",
        "\\begin{array}{ccc}\n",
        "1^{1} = 1 \\quad &\n",
        "8^{2} = 1 \\quad &\n",
        "16^{3} = 1 \\\\[1mm]\n",
        "2^{6} = 1 \\quad &\n",
        "10^{6} = 1 \\quad &\n",
        "17^{6} = 1 \\\\[1mm]\n",
        "4^{3} = 1 \\quad &\n",
        "11^{6} = 1 \\quad &\n",
        "19^{6} = 1 \\\\[1mm]\n",
        "5^{6} = 1 \\quad &\n",
        "13^{2} = 1 \\quad &\n",
        "20^{2} = 1\n",
        "\\end{array}\n",
        "$$\n",
        "\n",
        "Naturalmente, estamos trabalhando no site $\\mathbb{Z}_{21}$ para todas essas equações, que não nos preocupamos em escrever - consideramos implícitas para evitar confusão. Continuaremos a fazer isso durante o restante da lição.\n",
        "\n",
        "<span id=\"problem-statement-and-connection-to-phase-estimation\" />\n",
        "\n",
        "### Descrição do problema e conexão com a estimativa de fase\n",
        "\n",
        "Agora, podemos definir o problema de determinação de ordem.\n",
        "\n",
        "<Figure title=\"Order finding\">\n",
        "  Entrada: inteiros positivos $N$ e $a$ que satisfazem $\\gcd(N,a) = 1$\\ Saída: o menor inteiro positivo $r$ tal que $a^r \\equiv 1$ $(\\textrm{mod } N)$\n",
        "</Figure>\n",
        "\n",
        "Como alternativa, em termos da notação que acabamos de introduzir acima, recebemos $a \\in \\mathbb{Z}_N^{\\ast},$ e estamos procurando o menor número inteiro positivo $r$ de modo que $a^r = 1.$ Esse número $r$ é chamado de *ordem* de $a$ modulo $N.$\n",
        "\n",
        "Para conectar o problema de determinação de ordem à estimativa de fase, vamos pensar na operação definida em um sistema cujos estados clássicos correspondem a $\\mathbb{Z}_N,$ onde multiplicamos por um elemento fixo $a\\in\\mathbb{Z}_N^{\\ast}.$\n",
        "\n",
        "$$\n",
        "M_a \\vert x\\rangle = \\vert ax \\rangle \\qquad \\text{(for each $x\\in\\mathbb{Z}_N$)}\n",
        "$$\n",
        "\n",
        "Para deixar claro, estamos fazendo a multiplicação em $\\mathbb{Z}_N,$, portanto, está implícito que estamos tomando o módulo do produto $N$ dentro do ket no lado direito da equação.\n",
        "\n",
        "Por exemplo, se tomarmos $N = 15$ e $a=2,$, a ação de $M_2$ na base padrão $\\{\\vert 0\\rangle,\\ldots,\\vert 14\\rangle\\}$ é a seguinte.\n",
        "\n",
        "$$\n",
        "\\begin{array}{ccc}\n",
        "M_{2} \\vert 0 \\rangle = \\vert 0\\rangle \\quad &\n",
        "M_{2} \\vert 5 \\rangle = \\vert 10\\rangle \\quad &\n",
        "M_{2} \\vert 10 \\rangle = \\vert 5\\rangle \\\\[1mm]\n",
        "M_{2} \\vert 1 \\rangle = \\vert 2\\rangle \\quad &\n",
        "M_{2} \\vert 6 \\rangle = \\vert 12\\rangle \\quad &\n",
        "M_{2} \\vert 11 \\rangle = \\vert 7\\rangle \\\\[1mm]\n",
        "M_{2} \\vert 2 \\rangle = \\vert 4\\rangle \\quad &\n",
        "M_{2} \\vert 7 \\rangle = \\vert 14\\rangle \\quad &\n",
        "M_{2} \\vert 12 \\rangle = \\vert 9\\rangle \\\\[1mm]\n",
        "M_{2} \\vert 3 \\rangle = \\vert 6\\rangle \\quad &\n",
        "M_{2} \\vert 8 \\rangle = \\vert 1\\rangle \\quad &\n",
        "M_{2} \\vert 13 \\rangle = \\vert 11\\rangle \\\\[1mm]\n",
        "M_{2} \\vert 4 \\rangle = \\vert 8\\rangle \\quad &\n",
        "M_{2} \\vert 9 \\rangle = \\vert 3\\rangle \\quad &\n",
        "M_{2} \\vert 14 \\rangle = \\vert 13\\rangle\n",
        "\\end{array}\n",
        "$$\n",
        "\n",
        "Essa é uma operação unitária, desde que $\\gcd(a,N)=1;$ embaralhe os elementos da base padrão $\\{\\vert 0\\rangle,\\ldots,\\vert N-1\\rangle\\},$ para que, como matriz, seja uma matriz de permutação.\n",
        "É evidente em sua definição que essa operação é determinística, e uma maneira simples de ver que ela é invertível é pensar na ordem $r$ de $a$ modulo $N,$ e reconhecer que o inverso de $M_a$ é $M_a^{r-1}.$\n",
        "\n",
        "$$\n",
        "M_a^{r-1} M_a = M_a^r = M_{a^r} = M_1 = \\mathbb{I}\n",
        "$$\n",
        "\n",
        "Há outra maneira de pensar sobre o inverso que não requer nenhum conhecimento de $r$ (que, afinal de contas, é o que estamos tentando calcular).\n",
        "Para cada elemento $a\\in\\mathbb{Z}_N^{\\ast}$, há sempre um único elemento $b\\in\\mathbb{Z}_N^{\\ast}$ que satisfaz $ab=1.$ Denotamos esse elemento $b$ por $a^{-1},$ e ele pode ser computado com eficiência; uma extensão do algoritmo GCD de Euclides faz isso com custo quadrático em $\\operatorname{lg}(N).$ E assim\n",
        "\n",
        "$$\n",
        "M_{a^{-1}} M_a = M_{a^{-1}a} = M_1 = \\mathbb{I}.\n",
        "$$\n",
        "\n",
        "Portanto, a operação $M_a$ é determinística e invertível.\n",
        "Isso implica que ela é descrita por uma matriz de permutação e, portanto, é unitária.\n",
        "\n",
        "Agora vamos pensar nos vetores e valores próprios da operação $M_a,$, supondo que $a\\in\\mathbb{Z}_N^{\\ast}.$ Como acabamos de argumentar, essa suposição nos diz que $M_a$ é unitário.\n",
        "\n",
        "Há $N$ valores próprios de $M_a,$, possivelmente incluindo o mesmo valor próprio repetido várias vezes e, em geral, há alguma liberdade na seleção dos vetores próprios correspondentes, mas não precisaremos nos preocupar com todas as possibilidades.\n",
        "Vamos começar de forma simples e identificar apenas um vetor próprio de $M_a.$\n",
        "\n",
        "$$\n",
        "\\vert \\psi_0 \\rangle = \\frac{\\vert 1 \\rangle + \\vert a \\rangle + \\cdots + \\vert a^{r-1} \\rangle}{\\sqrt{r}}\n",
        "$$\n",
        "\n",
        "O número $r$ é a ordem do módulo $a$ $N,$ aqui e no restante da lição.\n",
        "O valor próprio associado a esse vetor próprio é $1$ porque ele não é alterado quando multiplicado por $a.$\n",
        "\n",
        "$$\n",
        "M_a \\vert \\psi_0 \\rangle\n",
        "= \\frac{\\vert a \\rangle + \\cdots + \\vert a^{r-1} \\rangle + \\vert a^r \\rangle}{\\sqrt{r}}\n",
        "= \\frac{\\vert a \\rangle + \\cdots + \\vert a^{r-1} \\rangle + \\vert 1 \\rangle}{\\sqrt{r}}\n",
        "= \\vert \\psi_0 \\rangle\n",
        "$$\n",
        "\n",
        "Isso acontece porque $a^r = 1,$, portanto, cada estado da base padrão $\\vert a^k \\rangle$ é deslocado para $\\vert a^{k+1} \\rangle$ para $k\\leq r-1,$ e $\\vert a^{r-1} \\rangle$ é deslocado de volta para $\\vert 1\\rangle.$ Em termos informais, é como se estivéssemos mexendo lentamente o $\\vert \\psi_0 \\rangle,$, mas ele já está completamente mexido, então nada muda.\n",
        "\n",
        "Aqui está outro exemplo de um vetor próprio de $M_a.$ Esse é mais interessante no contexto da descoberta de ordem e da estimativa de fase.\n",
        "\n",
        "$$\n",
        "\\vert \\psi_1 \\rangle = \\frac{\\vert 1 \\rangle + \\omega_r^{-1} \\vert a \\rangle + \\cdots + \\omega_r^{-(r-1)}\\vert a^{r-1} \\rangle}{\\sqrt{r}}\n",
        "$$\n",
        "\n",
        "Como alternativa, podemos escrever esse vetor usando um somatório da seguinte forma.\n",
        "\n",
        "$$\n",
        "\\vert \\psi_1 \\rangle = \\frac{1}{\\sqrt{r}}\n",
        "\\sum_{k = 0}^{r-1} \\omega_r^{-k} \\vert a^k \\rangle\n",
        "$$\n",
        "\n",
        "Aqui estamos vendo o número complexo $\\omega_r = e^{2\\pi i/r}$ aparecer naturalmente, devido à forma como a multiplicação por $a$ funciona no módulo $N.$ Desta vez, o valor próprio correspondente é $\\omega_r.$ Para ver isso, podemos primeiro calcular da seguinte forma.\n",
        "\n",
        "$$\n",
        "M_a \\vert \\psi_1 \\rangle\n",
        "= \\frac{1}{\\sqrt{r}}\\sum_{k = 0}^{r-1} \\omega_r^{-k} M_a\\vert a^k \\rangle\n",
        "= \\frac{1}{\\sqrt{r}}\\sum_{k = 0}^{r-1} \\omega_r^{-k} \\vert a^{k+1} \\rangle\n",
        "= \\frac{1}{\\sqrt{r}}\\sum_{k = 1}^{r} \\omega_r^{-(k - 1)} \\vert a^{k} \\rangle\n",
        "= \\frac{1}{\\sqrt{r}}\\omega_r \\sum_{k = 1}^{r} \\omega_r^{-k} \\vert a^{k} \\rangle\n",
        "$$\n",
        "\n",
        "Então, como $\\omega_r^{-r} = 1 = \\omega_r^0$ e $\\vert a^r \\rangle = \\vert 1\\rangle = \\vert a^0\\rangle,$, vemos que\n",
        "\n",
        "$$\n",
        "\\frac{1}{\\sqrt{r}}\\sum_{k = 1}^{r} \\omega_r^{-k} \\vert a^{k} \\rangle = \\frac{1}{\\sqrt{r}}\\sum_{k = 0}^{r-1} \\omega_r^{-k} \\vert a^k \\rangle\n",
        "= \\vert\\psi_1\\rangle,\n",
        "$$\n",
        "\n",
        "assim $M_a \\vert\\psi_1\\rangle = \\omega_r \\vert\\psi_1\\rangle.$\n",
        "\n",
        "Usando o mesmo raciocínio, podemos identificar pares adicionais de vetor próprio/valor próprio para $M_a.$ Para qualquer escolha de $j\\in\\{0,\\ldots,r-1\\}$, temos que\n",
        "\n",
        "$$\n",
        "\\vert \\psi_j \\rangle = \\frac{1}{\\sqrt{r}}\n",
        "\\sum_{k = 0}^{r-1} \\omega_r^{-jk} \\vert a^k \\rangle\n",
        "$$\n",
        "\n",
        "é um vetor próprio de $M_a$ cujo valor próprio correspondente é $\\omega_r^j.$\n",
        "\n",
        "$$\n",
        "M_a \\vert \\psi_j \\rangle = \\omega_r^j \\vert \\psi_j \\rangle\n",
        "$$\n",
        "\n",
        "Há outros vetores próprios de $M_a,$, mas não precisamos nos preocupar com eles - vamos nos concentrar apenas nos vetores próprios $\\vert\\psi_0\\rangle,\\ldots,\\vert\\psi_{r-1}\\rangle$ que acabamos de identificar.\n",
        "\n",
        "<span id=\"order-finding-through-phase-estimation\" />\n",
        "\n",
        "## Localização de ordem por meio de estimativa de fase\n",
        "\n",
        "Para resolver o problema de determinação de ordem para uma determinada escolha de $a\\in\\mathbb{Z}_N^{\\ast},$, podemos aplicar o procedimento de estimativa de fase à operação $M_a.$\n",
        "\n",
        "Para isso, precisamos implementar não apenas o $M_a$ de forma eficiente com um circuito quântico, mas também o $M_a^2,$ $M_a^4,$ $M_a^8,$ e assim por diante, indo até onde for necessário para obter uma estimativa suficientemente precisa do procedimento de estimativa de fase.\n",
        "Aqui, explicaremos como isso pode ser feito e, posteriormente, descobriremos exatamente quanta precisão é necessária.\n",
        "\n",
        "Vamos começar com a operação $M_a$ por si só.\n",
        "Naturalmente, como estamos trabalhando com o modelo de circuito quântico, usaremos a notação binária para codificar os números entre $0$ e $N-1.$ O maior número que precisamos codificar é $N-1,$, portanto, o número de bits necessários é\n",
        "\n",
        "$$\n",
        "n = \\operatorname{lg}(N-1) = \\lfloor \\log(N-1) \\rfloor + 1.\n",
        "$$\n",
        "\n",
        "Por exemplo, se $N = 21$ tivermos $n = \\operatorname{lg}(N-1) = 5.$ Esta é a aparência da codificação dos elementos de $\\mathbb{Z}_{21}$ como cadeias binárias de comprimento $5$.\n",
        "\n",
        "$$\n",
        "\\begin{gathered}\n",
        "0  \\mapsto 00000\\\\[1mm]\n",
        "1  \\mapsto 00001\\\\[1mm]\n",
        "\\vdots\\\\[1mm]\n",
        "20 \\mapsto 10100\n",
        "\\end{gathered}\n",
        "$$\n",
        "\n",
        "E agora, aqui está uma definição precisa de como $M_a$ é definido como uma operação de $n$ -qubit.\n",
        "\n",
        "$$\n",
        "M_a \\vert x\\rangle =\n",
        "\\begin{cases}\n",
        "\\vert ax \\; (\\textrm{mod}\\;N)\\rangle & 0\\leq x < N\\\\[1mm]\n",
        "\\vert x\\rangle & N\\leq x < 2^n\n",
        "\\end{cases}\n",
        "$$\n",
        "\n",
        "A questão é que, embora só nos importemos com o funcionamento do $M_a$ para o $\\vert 0\\rangle,\\ldots,\\vert N-1\\rangle,$, temos que especificar como ele funciona para os estados restantes da base padrão do $2^n - N$ - e precisamos fazer isso de uma forma que ainda nos dê uma operação unitária.\n",
        "A definição de $M_a$ de modo que ele não faça nada aos estados de base padrão restantes permite isso.\n",
        "\n",
        "Usando os algoritmos para multiplicação e divisão de números inteiros discutidos na lição anterior, juntamente com a metodologia para implementações reversíveis e livres de lixo, podemos construir um circuito quântico que execute $M_a,$ para qualquer escolha de $a\\in\\mathbb{Z}_N^{\\ast},$ a custo $O(n^2).$ Aqui está uma maneira de fazer isso.\n",
        "\n",
        "1. Construa um circuito para realizar a operação\n",
        "\n",
        "$$\n",
        "\\vert x \\rangle \\vert y \\rangle \\mapsto \\vert x \\rangle \\vert y \\oplus f_a(x)\\rangle\n",
        "$$\n",
        "\n",
        "em que\n",
        "\n",
        "$$\n",
        "f_a(x) =\n",
        "\\begin{cases}\n",
        "ax \\; (\\textrm{mod}\\;N) & 0\\leq x < N\\\\[1mm]\n",
        "x & N\\leq x < 2^n\n",
        "\\end{cases}\n",
        "$$\n",
        "\n",
        "usando o método descrito na lição anterior.\n",
        "Isso nos dá um circuito de tamanho $O(n^2).$\n",
        "\n",
        "2. Troque os dois sistemas de $n$ -qubit usando $n$ swap gates para trocar os qubits individualmente.\n",
        "\n",
        "3. De forma semelhante à primeira etapa, construa um circuito para a operação\n",
        "\n",
        "$$\n",
        "\\vert x \\rangle \\vert y \\rangle \\mapsto \\vert x \\rangle \\bigl\\vert y \\oplus f_{a^{-1}}(x)\\bigr\\rangle\n",
        "$$\n",
        "\n",
        "em que $a^{-1}$ é o inverso de $a$ em $\\mathbb{Z}_N^{\\ast}.$\n",
        "\n",
        "Ao inicializar os $n$ qubits inferiores e compor as três etapas, obtemos essa transformação:\n",
        "\n",
        "$$\n",
        "\\vert x \\rangle \\vert 0^n \\rangle\n",
        "\\stackrel{\\text{step 1}}{\\mapsto}\n",
        "\\vert x \\rangle \\vert f_a(x)\\rangle\n",
        "\\stackrel{\\text{step 2}}{\\mapsto}\n",
        "\\vert f_a(x)\\rangle \\vert x \\rangle\n",
        "\\stackrel{\\text{step 3}}{\\mapsto}\n",
        "\\vert f_a(x)\\rangle \\bigl\\vert x \\oplus f_{a^{-1}}(f_a(x)) \\bigr\\rangle\n",
        "= \\vert f_a(x)\\rangle\\vert 0^n \\rangle\n",
        "$$\n",
        "\n",
        "O método requer qubits de espaço de trabalho, mas eles retornam ao seu estado inicializado no final, o que nos permite usar esses circuitos para estimativa de fase.\n",
        "O custo total do circuito que obtemos é $O(n^2).$\n",
        "\n",
        "Para executar $M_a^2,$ $M_a^4,$ $M_a^8,$ e assim por diante, podemos usar exatamente o mesmo método, exceto pelo fato de substituirmos $a$ por $a^2,$ $a^4,$ $a^8,$ e assim por diante, como elementos de $\\mathbb{Z}_N^{\\ast}.$ Ou seja, para qualquer potência $k$ que escolhermos, podemos criar um circuito para $M_a^k$ não iterando $k$ vezes o circuito para $M_a,$, mas computando $b = a^k \\in \\mathbb{Z}_N^{\\ast}$ e, em seguida, usando o circuito para $M_b.$\n",
        "\n",
        "O cálculo das potências $a^k \\in \\mathbb{Z}_N$ é o problema de *exponenciação modular* mencionado na lição anterior.\n",
        "Esse cálculo pode ser feito *de forma clássica*, usando o algoritmo para exponenciação modular mencionado na lição anterior (geralmente chamado de *algoritmo de potência* na teoria dos números computacionais).\n",
        "De fato, exigimos apenas *power-of-2* potências de $a,$ em particular $a^2, a^4, \\ldots a^{2^{m-1}} \\in \\mathbb{Z}_N^{\\ast},$ e podemos obter essas potências elevando $m-1$ vezes ao quadrado de forma iterativa.\n",
        "Cada quadratura pode ser realizada por um circuito booleano de tamanho $O(n^2).$\n",
        "\n",
        "Em essência, o que estamos fazendo aqui é transferir o problema de iterar $M_a$ até $2^{m-1}$ vezes para uma computação clássica eficiente.\n",
        "E é uma boa sorte que isso seja possível!\n",
        "Para uma escolha arbitrária de um circuito quântico no problema de estimativa de fase, é provável que isso não seja possível e, nesse caso, o custo resultante da estimativa de fase cresce *exponencialmente* no número de qubits de controle $m.$\n",
        "\n",
        "<span id=\"solution-given-a-convenient-eigenvector\" />\n",
        "\n",
        "### Solução dada um vetor próprio conveniente\n",
        "\n",
        "Para entender como podemos resolver o problema de determinação de ordem usando a estimativa de fase, vamos começar supondo que executamos o procedimento de estimativa de fase na operação $M_a$ usando o vetor próprio $\\vert\\psi_1\\rangle.$ Obter esse vetor próprio não é fácil, como se vê, portanto, esse não será o fim da história, mas é útil começar por aqui.\n",
        "\n",
        "O valor próprio de $M_a$ correspondente ao vetor próprio $\\vert \\psi_1\\rangle$ é\n",
        "\n",
        "$$\n",
        "\\omega_r = e^{2\\pi i \\frac{1}{r}}.\n",
        "$$\n",
        "\n",
        "Ou seja, $\\omega_r = e^{2\\pi i \\theta}$ para $\\theta = 1/r.$ Portanto, se executarmos o procedimento de estimativa de fase em $M_a$ usando o vetor próprio $\\vert\\psi_1\\rangle,$, obteremos uma aproximação para $1/r.$ Ao calcular o recíproco, poderemos aprender $r$ - desde que nossa aproximação seja boa o suficiente.\n",
        "\n",
        "Em mais detalhes, quando executamos o procedimento de estimativa de fase usando $m$ qubits de controle, o que obtemos é um número $y\\in\\{0,\\ldots,2^m-1\\}.$ Em seguida, tomamos $y/2^m$ como uma estimativa para $\\theta,$, que é $1/r$ no caso em questão.\n",
        "Para descobrir o que é $r$ a partir dessa aproximação, o mais natural é calcular o recíproco de nossa aproximação e arredondar para o número inteiro mais próximo.\n",
        "\n",
        "$$\n",
        "\\left\\lfloor \\frac{2^m}{y} + \\frac{1}{2} \\right\\rfloor\n",
        "$$\n",
        "\n",
        "Por exemplo, vamos supor que $r = 6$ e nós realizamos a estimativa de fase em $M_a$ com o vetor próprio $\\vert\\psi_1\\rangle$ usando os bits de controle de $m = 5$.\n",
        "A melhor aproximação de $5$ bits para $1/r = 1/6$ é $5/32,$ e temos uma boa chance (cerca de $68\\%$ nesse caso) de obter o resultado $y=5$ a partir da estimativa de fase.\n",
        "Temos\n",
        "\n",
        "$$\n",
        "\\frac{2^m}{y} = \\frac{32}{5} = 6.4,\n",
        "$$\n",
        "\n",
        "e arredondando para o número inteiro mais próximo, obtém-se $6,$, que é a resposta correta.\n",
        "\n",
        "Por outro lado, se não usarmos precisão suficiente, talvez não obtenhamos a resposta correta.\n",
        "Por exemplo, se usarmos $m = 4$ qubits de controle na estimativa de fase, poderemos obter a melhor aproximação de $4$ -bit para $1/r = 1/6,$, que é $3/16.$ Tomando a recíproca, obtém-se\n",
        "\n",
        "$$\n",
        "\\frac{2^m}{y} = \\frac{16}{3} = 5.333 \\cdots\n",
        "$$\n",
        "\n",
        "e o arredondamento para o número inteiro mais próximo dá uma resposta incorreta de $5.$\n",
        "\n",
        "Então, qual é a precisão necessária para obter a resposta correta?\n",
        "Sabemos que a ordem $r$ é um número inteiro e, intuitivamente, o que precisamos é de precisão suficiente para distinguir $1/r$ das possibilidades próximas, incluindo $1/(r+1)$ e $1/(r-1).$ O número mais próximo de $1/r$ com o qual precisamos nos preocupar é $1/(r+1),$ e a distância entre esses dois números é\n",
        "\n",
        "$$\n",
        "\\frac{1}{r} - \\frac{1}{r+1} = \\frac{1}{r(r+1)}.\n",
        "$$\n",
        "\n",
        "Portanto, se quisermos ter certeza de que não confundiremos $1/r$ com $1/(r+1),$, basta usar precisão suficiente para garantir que a melhor aproximação de $y/2^m$ para $1/r$ esteja mais próxima de $1/r$ do que de $1/(r+1).$ Se usarmos precisão suficiente para que\n",
        "\n",
        "$$\n",
        "\\left\\vert\n",
        "\\frac{y}{2^m} - \\frac{1}{r}\n",
        "\\right\\vert\n",
        "< \\frac{1}{2 r (r+1)},\n",
        "$$\n",
        "\n",
        "de modo que o erro seja menor que a metade da distância entre $1/r$ e $1/(r+1),$, então $y/2^m$ estará mais próximo de $1/r$ do que de qualquer outra possibilidade, incluindo $1/(r+1)$ e $1/(r-1).$\n",
        "\n",
        "Podemos verificar isso da seguinte forma.\n",
        "Suponha que\n",
        "\n",
        "$$\n",
        "\\frac{y}{2^m} = \\frac{1}{r} + \\varepsilon\n",
        "$$\n",
        "\n",
        "para $\\varepsilon$ satisfazendo\n",
        "\n",
        "$$\n",
        "\\vert\\varepsilon\\vert < \\frac{1}{2 r (r+1)}.\n",
        "$$\n",
        "\n",
        "Quando tomamos a recíproca, obtemos\n",
        "\n",
        "$$\n",
        "\\frac{2^m}{y} = \\frac{1}{\\frac{1}{r} + \\varepsilon} = \\frac{r}{1+\\varepsilon r} = r - \\frac{\\varepsilon r^2}{1+\\varepsilon r}.\n",
        "$$\n",
        "\n",
        "Ao maximizar no numerador e minimizar no denominador, podemos limitar a distância que estamos de $r$ da seguinte forma.\n",
        "\n",
        "$$\n",
        "\\left\\vert\n",
        "\\frac{\\varepsilon r^2}{1+\\varepsilon r}\n",
        "\\right\\vert\n",
        "\\leq \\frac{ \\frac{r^2}{2 r(r+1)}}{1 - \\frac{r}{2r(r+1)}}\n",
        "%= \\frac{r^2}{2 r (r+1) - r}\n",
        "= \\frac{r}{2 r + 1}\n",
        "< \\frac{1}{2}\n",
        "$$\n",
        "\n",
        "Estamos a menos de $1/2$ de $r,$, portanto, como esperado, receberemos $r$ quando chegarmos.\n",
        "\n",
        "Infelizmente, como ainda não sabemos o que é $r$, não podemos usá-lo para nos dizer de quanta precisão precisamos.\n",
        "O que podemos fazer é usar o fato de que $r$ deve ser menor que $N$ para garantir que usemos precisão suficiente.\n",
        "Em particular, se usarmos precisão suficiente para garantir que a melhor aproximação $y/2^m$ para $1/r$ satisfaça\n",
        "\n",
        "$$\n",
        "\\left\\vert \\frac{y}{2^m} - \\frac{1}{r} \\right\\vert \\leq \\frac{1}{2N^2},\n",
        "$$\n",
        "\n",
        "então teremos precisão suficiente para determinar corretamente $r$ quando tomarmos a recíproca.\n",
        "O site $m = 2\\operatorname{lg}(N)+1$ garante que temos uma grande chance de obter uma estimativa com essa precisão usando o método descrito anteriormente.\n",
        "(O site $m = 2\\operatorname{lg}(N)$ é bom o suficiente se estivermos confortáveis com um limite inferior de 40% na probabilidade de sucesso)\n",
        "\n",
        "<span id=\"general-solution\" />\n",
        "\n",
        "### Solução geral\n",
        "\n",
        "Como acabamos de ver, se tivermos o vetor próprio $\\vert \\psi_1 \\rangle$ de $M_a,$, poderemos aprender $r$ por meio da estimativa de fase, desde que usemos qubits de controle suficientes para fazer isso com precisão suficiente.\n",
        "Infelizmente, não é fácil colocar as mãos no vetor próprio $\\vert\\psi_1\\rangle,$, portanto, precisamos descobrir como proceder.\n",
        "\n",
        "Vamos supor momentaneamente que procedamos exatamente como acima, exceto com o vetor próprio $\\vert\\psi_k\\rangle$ no lugar de $\\vert\\psi_1\\rangle,$ para qualquer opção de $k\\in\\{0,\\ldots,r-1\\}$ que escolhermos pensar.\n",
        "O resultado que obtivermos do procedimento de estimativa de fase será uma aproximação\n",
        "\n",
        "$$\n",
        "\\frac{y}{2^m} \\approx \\frac{k}{r}.\n",
        "$$\n",
        "\n",
        "Partindo do pressuposto de que não conhecemos $k$ ou $r,$, isso pode ou não nos permitir identificar $r.$ Por exemplo, se $k = 0$ for uma aproximação de $y/2^m$ para $0,$, o que, infelizmente, não nos diz nada.\n",
        "Esse, no entanto, é um caso incomum; para outros valores de $k,$, pelo menos poderemos aprender algo sobre $r.$\n",
        "\n",
        "Podemos usar um algoritmo conhecido como *algoritmo de fração contínua* para transformar nossa aproximação $y/2^m$ em frações próximas - incluindo $k/r$ se a aproximação for boa o suficiente.\n",
        "Não explicaremos o algoritmo de fração contínua aqui.\n",
        "Em vez disso, aqui está uma declaração de um fato conhecido sobre esse algoritmo.\n",
        "\n",
        "<Figure title=\"Fact\">\n",
        "  Dado um número inteiro $N\\geq 2$ e um número real $\\alpha\\in(0,1),$, há no máximo uma opção de números inteiros $u,v\\in\\{0,\\ldots,N-1\\}$ com $v\\neq 0$ e $\\gcd(u,v)=1$ satisfazendo $\\vert \\alpha - u/v\\vert < \\frac{1}{2N^2}.$ Dado $\\alpha$ e $N,$, o *algoritmo de fração contínua* encontra $u$ e $v,$ ou informa que eles não existem.\n",
        "  Esse algoritmo pode ser implementado como um circuito booleano de tamanho $O((\\operatorname{lg}(N))^3).$\n",
        "</Figure>\n",
        "\n",
        "Se tivermos uma aproximação muito próxima de $y/2^m$ para $k/r,$ e executarmos o algoritmo de fração contínua para $N$ e $\\alpha = y/2^m,$, obteremos $u$ e $v,$ conforme descrito no fato.\n",
        "Uma análise do fato nos permite concluir que\n",
        "\n",
        "$$\n",
        "\\frac{u}{v} = \\frac{k}{r}.\n",
        "$$\n",
        "\n",
        "Observe, em particular, que não aprendemos necessariamente $k$ e $r,$; aprendemos apenas $k/r$ em termos mais baixos.\n",
        "\n",
        "Por exemplo, e como já percebemos, não aprenderemos nada com $k=0.$ Mas esse é o único valor de $k$ em que isso acontece.\n",
        "Quando $k$ é diferente de zero, ele pode ter fatores comuns com $r,$, mas o número $v$ que obtemos do algoritmo de fração contínua deve, no mínimo, dividir $r.$\n",
        "\n",
        "Está longe de ser óbvio, mas é verdade que se tivermos a capacidade de aprender $u$ e $v$ para $u/v = k/r$ para $k\\in\\{0,\\ldots,r-1\\}$ escolhidos *uniformemente de forma aleatória*, é muito provável que consigamos recuperar $r$ após apenas algumas amostras.\n",
        "Em particular, se nossa estimativa para $r$ for o *menor múltiplo comum* de todos os valores do denominador $v$ que observamos, estaremos certos com alta probabilidade.\n",
        "Intuitivamente falando, alguns valores de $k$ não são bons porque compartilham fatores comuns com $r,$ e esses fatores comuns são ocultados de nós quando aprendemos $u$ e $v.$ Porém, as escolhas *aleatórias* de $k$ provavelmente não ocultarão os fatores de $r$ por muito tempo, e a probabilidade de não adivinharmos $r$ corretamente, tomando o menor múltiplo comum dos denominadores que observamos, cai exponencialmente com o número de amostras.\n",
        "\n",
        "Resta abordar a questão de como obter um vetor próprio $\\vert\\psi_k\\rangle$ de $M_a$ para executar o procedimento de estimativa de fase.\n",
        "Acontece que, na verdade, não precisamos criá-los!\n",
        "\n",
        "Em vez disso, executaremos o procedimento de estimativa de fase no estado $\\vert 1\\rangle,$, ou seja, a codificação binária de $n$ bits do número $1,$ no lugar de um vetor próprio $\\vert\\psi\\rangle$ de $M_a.$ Até agora, falamos apenas sobre a execução do procedimento de estimativa de fase em um autovetor específico, mas nada nos impede de executar o procedimento em um estado de entrada que não seja um autovetor de $M_a,$ e é isso que estamos fazendo aqui com o estado $\\vert 1\\rangle.$ (Esse não é um vetor próprio de $M_a$, a menos que $a=1,$ seja uma escolha que não nos interessa)\n",
        "\n",
        "A justificativa para escolher o estado $\\vert 1\\rangle$ em vez de um vetor próprio de $M_a$ é que a equação a seguir é verdadeira.\n",
        "\n",
        "$$\n",
        "\\vert 1\\rangle = \\frac{1}{\\sqrt{r}} \\sum_{k = 0}^{r-1} \\vert \\psi_k\\rangle\n",
        "$$\n",
        "\n",
        "Uma maneira de verificar essa equação é comparar os produtos internos dos dois lados com cada estado da base padrão, usando as fórmulas mencionadas anteriormente na lição para ajudar a avaliar os resultados do lado direito.\n",
        "Como consequência, obteremos exatamente os mesmos resultados de medição como se tivéssemos escolhido $k\\in\\{0,\\ldots,r-1\\}$ uniformemente de forma aleatória e usado $\\vert\\psi_k\\rangle$ como um vetor próprio.\n",
        "\n",
        "Mais detalhadamente, vamos imaginar que executamos o procedimento de estimativa de fase com o estado $\\vert 1\\rangle$ no lugar de um dos vetores próprios $\\vert\\psi_k\\rangle.$ Depois que a transformada quântica inversa de Fourier é executada, ficamos com o estado\n",
        "\n",
        "$$\n",
        "\\frac{1}{\\sqrt{r}} \\sum_{k = 0}^{r-1} \\vert \\psi_k\\rangle \\vert \\gamma_k\\rangle,\n",
        "$$\n",
        "\n",
        "em que\n",
        "\n",
        "$$\n",
        "\\vert\\gamma_k\\rangle =\n",
        "\\frac{1}{2^m} \\sum_{y=0}^{2^m - 1} \\sum_{x=0}^{2^m-1} e^{2\\pi i x (k/r - y/2^m)} \\vert y\\rangle.\n",
        "$$\n",
        "\n",
        "O vetor $\\vert\\gamma_k\\rangle$ representa o estado dos $m$ qubits superiores depois que o inverso da transformação quântica de Fourier foi realizado neles.\n",
        "\n",
        "Assim, em virtude do fato de que $\\{\\vert\\psi_0\\rangle,\\ldots,\\vert\\psi_{r-1}\\rangle\\}$ é um conjunto ortonormal, descobrimos que uma medição dos principais $m$ qubits superior produz uma aproximação $y/2^m$ do valor $k/r$ em que $k\\in\\{0,\\ldots,r-1\\}$ é escolhido uniformemente de forma aleatória.\n",
        "Como já discutimos, isso nos permite aprender $r$ com um alto grau de confiança após várias execuções independentes, que era o nosso objetivo.\n",
        "\n",
        "<span id=\"total-cost\" />\n",
        "\n",
        "### Custo total\n",
        "\n",
        "O custo para implementar cada operação unitária controlada $M_a^k$ é $O(n^2).$ Há $m$ operações unitárias controladas e temos $m = O(n),$, portanto, o custo total das operações unitárias controladas é $O(n^3).$ Além disso, temos $m$ Hadamard gates (que contribuem com $O(n)$ para o custo), e a transformação quântica inversa de Fourier contribui com $O(n^2)$ para o custo.\n",
        "Assim, o custo das operações unitárias controladas domina o custo de todo o procedimento, que é, portanto $O(n^3).$\n",
        "\n",
        "Além do próprio circuito quântico, há alguns cálculos clássicos que precisam ser realizados ao longo do caminho.\n",
        "Isso inclui o cálculo das potências $a^k$ em $\\mathbb{Z}_N$ para $k = 2, 4, 8, \\ldots, 2^{m-1},$, que são necessárias para criar as portas unitárias controladas, bem como o algoritmo de fração contínua que converte aproximações de $\\theta$ em frações.\n",
        "Esses cálculos podem ser realizados por circuitos booleanos com um custo total de $O(n^3).$\n",
        "\n",
        "Como é típico, todos esses limites podem ser aprimorados usando algoritmos assintoticamente rápidos; esses limites pressupõem que estamos usando algoritmos padrão para operações aritméticas básicas.\n",
        "\n",
        "<span id=\"factoring-by-order-finding\" />\n",
        "\n",
        "## Factoring por encomenda\n",
        "\n",
        "A última coisa que precisamos discutir é como a solução do problema de determinação de ordem nos ajuda a fatorar.\n",
        "Essa parte é totalmente clássica - não tem nada a ver especificamente com a computação quântica.\n",
        "\n",
        "Esta é a ideia básica.\n",
        "Queremos fatorar o número $N,$ e podemos fazer isso *de forma recursiva*.\n",
        "Especificamente, podemos nos concentrar na tarefa de *dividir* $N,$, o que significa encontrar dois inteiros quaisquer $b,c\\geq 2$ para os quais $N = bc.$ Isso não é possível se $N$ for um número primo, mas podemos testar com eficiência para ver se $N$ é primo usando um algoritmo de teste de primalidade primeiro e, se $N$ não for primo, tentaremos dividi-lo.\n",
        "Depois de dividirmos $N,$, podemos simplesmente recursar em $b$ e $c$ até que todos os nossos fatores sejam primos e obtenhamos a fatoração de primos de $N.$\n",
        "\n",
        "A divisão de números inteiros pares é fácil: basta exibir $2$ e $N/2.$\n",
        "\n",
        "Também é fácil dividir potências perfeitas, ou seja, números do formato $N = s^j$ para inteiros $s,j\\geq 2,$ apenas por aproximando as raízes $N^{1/2},$ $N^{1/3},$ $N^{1/4},$ e assim por diante, e verificando os inteiros próximos como suspeitos para $s.$ Não precisamos ir além de $\\log(N)$ passos nessa sequência, pois nesse ponto a raiz cai abaixo de $2$ e não revelará candidatos adicionais.\n",
        "\n",
        "É bom que possamos fazer essas duas coisas porque a determinação da ordem não nos ajudará a fatorar números pares ou potências *primais*, onde o número $s$ é primo.\n",
        "No entanto, se $N$ for ímpar e não for uma potência prima, a determinação da ordem nos permite dividir $N.$\n",
        "\n",
        "<Figure title=\"Probabilistic algorithm to split an odd, composite integer N that is not a prime power\">\n",
        "  1. Escolha aleatoriamente $a\\in\\{2,\\ldots,N-1\\}.$\n",
        "\n",
        "  2. Calcular $d=\\gcd(a,N).$\n",
        "\n",
        "  3. Se for $d > 1$, então, envie $b = d$ e $c = N/d$ e pare. Caso contrário, passe para a próxima etapa sabendo que $a\\in\\mathbb{Z}_N^{\\ast}.$\n",
        "\n",
        "  4. Seja $r$ a ordem de $a$ modulo $N.$ (É aqui que precisamos encontrar a ordem)\n",
        "\n",
        "  5. Se $r$ estiver empatado:\n",
        "\n",
        "     5.1 Calcular $x = a^{r/2} - 1$ modulo $N$ \\ 5.2 Computar $d = \\gcd(x,N).$ \\ 5.3 Se for $d>1$, então, produza $b=d$ e $c = N/d$ e pare.\n",
        "\n",
        "  6. Se esse ponto for atingido, o algoritmo não conseguiu encontrar um fator de $N.$\n",
        "</Figure>\n",
        "\n",
        "Uma execução desse algoritmo pode não conseguir encontrar um fator de $N.$ Especificamente, isso acontece em duas situações:\n",
        "\n",
        "* A ordem de $a$ modulo $N$ é ímpar.\n",
        "* A ordem de $a$ modulo $N$ é par e $\\gcd\\bigl(a^{r/2} - 1, N\\bigr) = 1.$\n",
        "\n",
        "Usando a teoria básica dos números, é possível provar que, para uma escolha aleatória de $a,$ com probabilidade mínima de $1/2$, nenhum desses eventos acontece.\n",
        "De fato, a probabilidade de qualquer um dos eventos acontecer é de no máximo $2^{-(m-1)}$ para $m$ sendo o número de fatores primos distintos de $N,$ razão pela qual a suposição de que $N$ não é uma potência prima é necessária.\n",
        "(A suposição de que $N$ é ímpar também é necessária para que esse fato seja verdadeiro)\n",
        "\n",
        "Isso significa que cada execução tem pelo menos 50% de chance de ser dividida $N.$ Portanto, se executarmos o algoritmo $t$ vezes, escolhendo aleatoriamente $a$ a cada vez, conseguiremos dividir $N$ com probabilidade de pelo menos $1 - 2^{-t}.$\n",
        "\n",
        "A ideia básica por trás do algoritmo é a seguinte.\n",
        "Se tivermos uma opção de $a$ para a qual a ordem $r$ de $a$ modulo $N$ seja par, então $r/2$ é um número inteiro e podemos considerar os números\n",
        "\n",
        "$$\n",
        "a^{r/2} - 1\\; (\\textrm{mod}\\; N) \\quad \\text{and} \\quad a^{r/2} + 1\\; (\\textrm{mod}\\; N).\n",
        "$$\n",
        "\n",
        "Usando a fórmula $Z^2 - 1 = (Z+1)(Z-1),$, concluímos que\n",
        "\n",
        "$$\n",
        "\\bigl(a^{r/2} - 1\\bigr) \\bigl(a^{r/2} + 1\\bigr) = a^r - 1.\n",
        "$$\n",
        "\n",
        "Agora, sabemos que $a^r \\; (\\textrm{mod}\\; N) = 1$ pela definição da ordem - que é outra maneira de dizer que $N$ divide igualmente $a^r - 1.$ Isso significa que $N$ divide igualmente o produto\n",
        "\n",
        "$$\n",
        "\\bigl(a^{r/2} - 1\\bigr) \\bigl(a^{r/2} + 1\\bigr).\n",
        "$$\n",
        "\n",
        "Para que isso seja verdade, todos os fatores primos de $N$ também devem ser fatores primos de $a^{r/2} - 1$ ou $a^{r/2} + 1$ (ou ambos) - e, para uma seleção aleatória de $a$, é improvável que todos os fatores primos de $N$ dividam um dos termos e nenhum divida o outro.\n",
        "Caso contrário, desde que alguns dos fatores primos de $N$ dividam o primeiro termo e alguns dividam o segundo termo, poderemos encontrar um fator não trivial de $N$ calculando o GCD com o primeiro termo.\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": 5
}