title: Baby-step giant-step
text: # Baby-step giant-step
  
  En teoría de grupos, el algoritmo baby-step giant-step (también conocido como algoritmo de Shanks) es un método para calcular el logaritmo discreto de un elemento en un grupo. Es un algoritmo genérico, es decir que funciona para cualquier grupo, siempre que conozcamos el orden del mismo (o una buena cota para él).
  El problema del logaritmo discreto es de fundamental importancia para el área de la criptografía asimétrica . Muchos de los sistemas criptográficos más utilizados (por ejemplo el cifrado ElGamal) se basan en el supuesto de que el logaritmo discreto es extremadamente difícil de calcular.
  
  # Baby-step giant-step
  ## El algoritmo
  
  Sea un grupo G con orden k, g un elemento de G, h en el subgrupo generado por g. La salida del algoritmo será un x<k tal que g$^x$=h.
  * Sea $m=\left\lceil {\sqrt {(k-1)}}\ \right\rceil$, donde $\lceil \ \rceil$ indica la función techo.
  * Calcular $\alpha _{0}=e_{G},\ \alpha _{1}=g^{m},\ \alpha _{2}=g^{2m},\ldots ,\alpha _{m-1}=g^{(m-1)m}$. Armar y ordenar la lista $L=\{(1,0);(\alpha _{1},1),(\alpha _{2},2),(\alpha _{3},3),\ldots \}$.
  * Calcular $\beta _{0}=h,\beta _{1}=hg^{-1},\beta _{2}=h(g^{-1})^{2},...$ hasta encontrar $\beta _{i}$ que sea igual a algún $\alpha _{j}$ de la lista L.
  * Si $\beta _{i}=\alpha _{j}$ entonces la salida del algoritmo será $n=jm+i$.
  
  # Baby-step giant-step
  ## Explicación
  
  ¿Por qué la respuesta dada por el algoritmo es correcta? Si $\beta _{i}=\alpha _{j}$ significa que $g^{jm}=hg^{-i}$, de donde se deduce que $g^{jm+i}=h$.
  ¿Por qué el algoritmo siempre da una respuesta? Sea $h=g^{n}$. Dividimos n entre m y obtenemos n=qm+r, con $0\leq r<m$ (por definición del resto) y $0\leq q<m$ (porque $m^{2}\geq k>n$). O sea: $g^{qm+r}=h$, de donde $\alpha _{q}=g^{qm}=g^{-r}h=\beta _{r}$.
  Este algoritmo mejora el método de "fuerza bruta". Mientras que este último lleva un tiempo de orden O(k), el "baby-step giant-step" tiene un orden $O({\sqrt {k}})$.
  
  # Baby-step giant-step
  ## Ejemplo
  
  Tomemos G como el grupo multiplicativo de los enteros módulo 37. Queremos hallar n tal que 5$^n$ = 13 (mod 37). Utilicemos el algoritmo de Shanks.
  1. $m=\lceil {\sqrt {36}}\ \rceil =6$,
  2. Calculamos con esto:
      $\alpha _{1}=5^{6}\equiv 11\ ({\rm {mod\ 37)}}$
      $\alpha _{2}=5^{12}\equiv 11\times 11\equiv 10\ ({\rm {mod\ 37),}}$
      $\alpha _{3}=5^{18}\equiv 10\times 11\equiv 36\ ({\rm {mod\ 37),}}$
      $\alpha _{4}=5^{24}\equiv 36\times 11\equiv 26\ ({\rm {mod\ 37),}}$
      $\alpha _{5}=5^{30}\equiv 26\times 11\equiv 27\ ({\rm {mod\ 37)}}$.
      Armamos la lista: $L=\{(1,0),(10,2),(11,1),(26,4),(27,5),(36,3)\}$.
  3. La inversa de 5 módulo 37 es 15. O sea que $\beta _{1}=13\times 15\equiv 10\ ({\rm {mod\ 37)}}$, que coincide con $\alpha _{2}$.
  4. El n buscado es $2\times 6+1=13$.