~josealberto4444/algoritmo-de-shor

ffa8726547bdd8b1b19f7bd2071cb27d1f115953 — José Alberto Orejuela García 9 months ago 5660531 1.0
Haz los últimos retoques
4 files changed, 24 insertions(+), 8 deletions(-)

M mybib.bib
M tex/algoritmo.tex
M tex/ejemplos.tex
M tex/enunciado.tex
M mybib.bib => mybib.bib +14 -0
@@ 51,3 51,17 @@ note = "[Online; accessed 7-April-2019]"
  howpublished = "\url{https://en.wikipedia.org/w/index.php?title=Continued_fraction&oldid=894794646}",
  note = "[Online; accessed 17-May-2019]"
}

@book{nielsen,
author    = "Michael A. Nielsen and Isaac L. Chuang",
title     = "Quantum computation and quantum information",
publisher = "Cambridge University Press",
year      = "2000",
}

@book{arora,
author    = "Sanjeev Arora and Boaz Barak",
title     = "Computational complexity: a modern approach",
publisher = "Cambridge University Press",
year      = "2007",
}

M tex/algoritmo.tex => tex/algoritmo.tex +7 -5
@@ 31,17 31,17 @@ Para encontrarlos, procederemos de la siguiente manera:
\item\label{itm:factor} Si no es trivial, hemos encontrado uno de los \(b_i\) de los que hablábamos antes. Basta calcular \( \mcd (a^{r/2} \pm 1, N) \) para encontrar un factor de \(N\).
\end{enumerate}

Todos los pasos excepto el paso~\ref{itm:orden} son ejecutados en una computadora clásica (ver ejemplo~\ref{subsec:ej-esquema}). Las operaciones que se realizan son el máximo común divisor, que es de complejidad\footnote{También se puede hacer directamente con el mismo algoritmo de Euclides con complejidad \( O (n^2) \).} \( O (M(n) \log n) = O(n \log^2 n) \)~\cite{wiki:complexity}, y el cálculo de \( a^{r/2} \), que es de complejidad \( O (M(n) k) = O (k n \log n ) \) siendo \(k\) el número de dígitos del exponente\footnote{El exponente es más pequeño que \(N\), ya que el orden \(r\) está acotado por la función \(\phi\) de Euler de \(N\), pero como cota podemos coger \( k = n \) y obtendríamos que es de tiempo polinómico.}, lo cual sigue siendo aceptable.
Todos los pasos excepto el paso~\ref{itm:orden} son ejecutados en una computadora clásica (ver ejemplo~\ref{subsec:ej-esquema}). Las operaciones que se realizan son el máximo común divisor, que es de complejidad\footnote{También se puede hacer directamente con el mismo algoritmo de Euclides con complejidad \( O (n^2) \).} \( O (M(n) \log n) = O(n \log^2 n) \)~\cite{wiki:complexity}, y el cálculo de \( a^{r/2} \), que es de complejidad \( O (M(n) k) = O (k n \log n ) \) siendo \(k\) el número de dígitos del exponente\footnote{El exponente es más pequeño que \(N\), ya que el orden \(r\) está acotado por la función \(\phi\) de Euler de \(N\), pero como cota podemos coger \( k = n \) y obtendríamos que es de tiempo polinómico.}, lo cual sigue siendo aceptable. Además, la probabilidad de tomar un \(a\) aleatoriamente que nos sirva es \( 1 - 1/2^l\), siendo \(l\) el número de primos de la descomposición de \(N\) (ver~\cite{nielsen} teorema A4.13), que es lo suficientemente grande.

Nos falta demostrar el paso~\ref{itm:factor}. Para ello, vamos a ver cuántas raíces de la unidad existen módulo \(N\) y qué forma tienen para ver que todas obedecen a lo explicado anteriormente.

Sea \( N = p_1^{k_1} \dotsm p_l^{k_l} \) la descomposición en factores primos de \(N\). Por el teorema chino del resto, si tenemos una raíz de la unidad, esta tiene que serlo también para todos los factores primos de \(N\),
Sea \( N = p_1^{k_1} \dotsm p_l^{k_l} \) la descomposición en factores primos de \(N\). Por el teorema chino del resto, si tenemos una raíz de la unidad, tiene que serlo también para todos los factores primos de \(N\),
\begin{subequations}
\begin{alignat}{4}
  x^2 &\equiv 1 &&\pmod{N} \\
      &\Updownarrow   && \nonumber \\
  x^2 &\equiv 1 &&\pmod{p_1^{k_1}} \\
      &\vdots  && \nonumber \\
      &\; \, \vdots  && \nonumber \\
  x^2 &\equiv 1 &&\pmod{p_l^{k_l}}.
\end{alignat}
\end{subequations}


@@ 79,7 79,7 @@ Así pues, resulta finalmente que
  x^2 &\equiv     1 &&\pmod{N} \\
      &\Updownarrow       && \nonumber \\
  x   &\equiv \pm 1 &&\pmod{p_1^{k_1}} \\
      &\vdots      && \nonumber \\
      &\; \, \vdots      && \nonumber \\
  x   &\equiv \pm 1 &&\pmod{p_l^{k_l}},
\end{alignat}
\end{subequations}


@@ 153,10 153,12 @@ Después de esto, vamos a ejecutar las siguientes etapas:
  \begin{equation}
    \frac{r (r-1)}{r (r-1) + r} = 1 - \frac{1}{r},
  \end{equation}
  donde vemos que, a no ser que se dé el caso extremadamente raro de \( r = 2 \), las probabilidades de éxito son altas\footnote{Se conviene que la probabilidad aceptable de retorno del número correcto para un algoritmo cuántico es \(2/3\) porque resulta suficiente para repetir el experimento y elevarla arbitrariamente en un número aceptable de veces.} (ver ejemplo~\ref{subsubsec:ej-medida}).
  donde vemos que, a no ser que se dé el caso extremadamente raro de \( r = 2 \), las probabilidades de éxito son altas\footnote{En algoritmos probabilísticos, como es el caso de los algoritmos cuánticos, la probabilidad aceptable de retorno del número correcto debe ser igual a \( 1/2 + 1 / p(n) \), siendo \( p(n) \) polinómico en el tamaño de la entrada. Esto se debe a que de esta manera es posible repetir de manera rápida el algoritmo el suficiente número de veces para que la probabilidad sea arbitrariamente grande (ver~\cite{arora} sección 7.4.1 ``Role of precise constants: Error reduction'').} (ver ejemplo~\ref{subsubsec:ej-medida}).
\item\label{itm:fraccion} Al ser \( ry \approx cQ \), el cociente \( y/Q \), que es ya conocido, es próximo a \( c/r \). Hacemos, pues, expansión en fracción continua~\cite{wiki:continued-fraction} (clásicamente, en un ordenador tradicional) de \( y/Q \) para obtener aproximaciones de la forma \( d/s \) con \( s < N \). Así, tenemos gran probabilidad de que \(s\) coincida con \(r\) o, al menos, sea un factor de \(r\).

  Comprobamos (clásicamente) si \( a^s \equiv 1 \pmod{N} \). Si funciona, hemos encontrado \(r\). Si no, obtenemos más candidatos usando múltiplos de \(s\) o expandiendo más la fracción (ver ejemplo~\ref{subsubsec:ej-fraccion}). Si ninguno funciona, volvemos a iniciar la subrutina desde el principio.

  Este paso del algoritmo es de complejidad \( O(q^3) \) (ver~\cite{nielsen} página 230 ``Box 5.3: The continued fractions algorithm'').
\end{enumerate}

Y así concluye la explicación del algoritmo. Hemos visto que el algoritmo siempre se ejecuta con éxito (al ser cuántico, con una probabilidad lo suficientemente grande) y devuelve un divisor del número de entrada, y también hemos visto que todas las etapas son de complejidad polinomial o menor en el número de bits de la entrada original.

M tex/ejemplos.tex => tex/ejemplos.tex +2 -2
@@ 165,13 165,13 @@ Siguiendo con el ejemplo anterior, vemos que la probabilidad de sacar los térmi
Y tenemos cuatro términos con esa probabilidad con \( y = 64 \), que son \( \ket{64, 1} \), \( \ket{64, 7} \), \( \ket{64, 4} \) y \( \ket{64, 13} \). Pasa lo mismo con el resto de valores de \(y\), incluyendo a \( y = 0 \) (\( \ket{0, 1} \), \( \ket{0, 7} \), \( \ket{0, 4} \) y \( \ket{0, 13} \)), con lo cual acabamos con cuatro (\(r\)) términos inútiles, y doce (\( 4 \cdot 3 = r (r-1) \)) términos útiles. La probabilidad está de nuestro lado a la hora de medir, obtendremos un \( y \neq 0 \) que cumplirá \( ry = cQ \).

\subsubsection{Etapa~\ref{itm:fraccion}}\label{subsubsec:ej-fraccion}
Ahora vamos a tomar unos números más realistas para este último paso,
Ahora vamos a tomar unos números más realistas\footnote{Aun siendo unos números con sentido, son inventados, así que es posible que no se den para ningún valor de \(N\).} para este último paso,
\begin{align}
  r &= 1266, & y &= 689111, & c &= 13, & Q &= 2^{26},
\end{align}
quedando \( y / Q \approx 0.010269 \). Tenemos que expandir eso en fracción continua, que son las fracciones del tipo
\begin{equation}
  a_0 + \frac{1}{a_1 + \dfrac{1}{a_2 + \dfrac{1}{\ddots + \dfrac{1}{a_n}}}}.
  a_0 + \cfrac{1}{a_1 + \cfrac{1}{a_2 + \cfrac{1}{\ddots + \cfrac{1}{a_n}}}}.
\end{equation}
Para ello, vamos a llamar \(u_0\) al número que queremos representar y calcularemos los términos de la forma siguiente:
\begin{equation}

M tex/enunciado.tex => tex/enunciado.tex +1 -1
@@ 6,7 6,7 @@ Asumiremos que \(N\) es impar. Basta comprobar que el resto de dividirlo por dos

Asumiremos también que \(N\) no es potencia de primo,
\begin{equation}
  \sqrt[k]{N} \notin \mathbb{Z} \quad \forall k \in \mathbb{N} \cap [2, n],
  \sqrt[k]{N} \notin \mathbb{Z} \quad \forall k \in \{ 2, \dotsc , n \},
\end{equation}
siendo \( n = \lfloor \log_2 N + 1 \rfloor \) el número de dígitos de \(N\) en binario.